赞
踩
JSP(全称:Java Server Pages):Java服务端页面,是一种动态的网页技术,既可以定义HTML、JS、CSS等静态内容,也可以定义Java代码的动态内容,也就是JSP=HTML+Java,如下就是JSP代码
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- <h1>JSP,Hello World</h1>
- <%
- System.out.println("hello,jsp~");
- %>
- </body>
- </html>
JSP作用:简化开发,避免了在Servlet中直接输出HTML标签
如下是jsp代码
-
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
-
- <h1>hello jsp</h1>
-
-
- <%
- System.out.println("hello jsp~");
- %>
-
- </body>
- </html>
JSP本质上是一个Servlet,
hello.jsp
页面tomcat
会将 hello.jsp
转换为名为 hello_jsp.java
的一个 Servlet
tomcat
再将转换的 servlet
编译成字节码文件 hello_jsp.class
tomcat
会执行该字节码文件,向外提供服务JSP脚本用于在 JSP页面内定义 Java代码。在之前的入门案例中我们就在 JSP 页面定义的 Java 代码就是 JSP 脚本。
JSP 脚本有如下三个分类:
在hello.jsp中书写
- <%
- System.out.println("hello jsp~");
- int i=3;
- System.out.println(i);
- %>
- <%
- System.out.println("hello jsp~");
- int i=3;
- System.out.println(i);
- %>
-
- <%=i%>
网页输出的hello jsp是HTML输出的
使用JSP动态输出某品牌信息,
- List<Brand> brands = new ArrayList<Brand>();
- brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
- brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
- brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
- <%@ page import="pojo.Brand" %>
- <%@ page import="java.util.ArrayList" %>
- <%@ page import="java.util.List" %>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
- <%
- // 查询数据库
- List<Brand> brands = new ArrayList<Brand>();
- brands.add(new Brand(1, "三只松鼠", "三只松鼠", 100, "三只松鼠,好吃不上火", 1));
- brands.add(new Brand(2, "优衣库", "优衣库", 200, "优衣库,服适人生", 0));
- brands.add(new Brand(3, "小米", "小米科技有限公司", 1000, "为发烧而生", 1));
- %>
-
-
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
-
-
- <input type="button" value="新增"><br>
- <hr>
- <table border="1" cellspacing="0" width="800">
- <tr>
- <th>序号</th>
- <th>品牌名称</th>
- <th>企业名称</th>
- <th>排序</th>
- <th>品牌介绍</th>
- <th>状态</th>
- <th>操作</th>
-
- </tr>
-
- <%
- for (int i = 0; i < brands.size(); i++) {
- //获取集合中的 每一个 Brand 对象
- Brand brand = brands.get(i);
- %>
- <tr align="center">
- <td><%=brand.getId()%>
- </td>
- <td><%=brand.getBrandName()%>
- </td>
- <td><%=brand.getCompanyName()%>
- </td>
- <td><%=brand.getOrdered()%>
- </td>
- <td><%=brand.getDescription()%>
- </td>
- <td><%=brand.getStatus() == 1 ? "启用" : "禁用"%>
- </td>
- <td><a href="#">修改</a> <a href="#">删除</a></td>
- </tr>
- <%
- }
- %>
-
- </table>
- </body>
- </html>
由于JSP页面内既可以定义HTML标签又可以定义Java代码,造成以下问题:
由于以上问题,JSP已经不再常用,更多的是用HTML+Ajax替代。技术发展过程如下:
servlet
即实现逻辑代码编写,也对页面进行拼接。这种模式我们之前也接触过JSP
,人们发现 JSP
使用起来比 Servlet
方便很多,但是还是要在 JSP
中嵌套 Java
代码,也不利于后期的维护Servlet
进行逻辑代码开发,而使用 JSP
进行数据展示第四阶段:使用 servlet
进行后端逻辑代码开发,而使用 HTML
进行数据展示。而这里面就存在问题,HTML
是静态页面,怎么进行动态数据展示呢?这就是 ajax
的作用了。
我们可以使用EL表达式和JSTL标签库替换JSP中等Java代码
定义servlet,在servlet中封装一些数据到request域对象中并转发到el-demo.jsp页面
- @WebServlet("/demo1")
- public class ServletDemo1 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //1. 准备数据
- List<Brand> brands = new ArrayList<Brand>();
- brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
- brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
- brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
-
- //2. 存储到request域中
- request.setAttribute("brands",brands);
-
- //3. 转发到 el-demo.jsp
- request.getRequestDispatcher("/el-demo.jsp").forward(request,response);
- }
-
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
(注意:此处需要使用转发,因为转发才可以使用request对象作为域对象进行数据共享)
在el-demo.jsp中通过EL表达式获取数据
- <%@page isELIgnored="false"%>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- ${brands}
- </body>
- </html>
JavaWeb中有四大域对象,分别是:
el 表达式获取数据,会依次从这4个域中寻找,直到找到为止。而这四个域对象的作用范围如下图所示
例如: ${brands},el 表达式获取数据,会先从page域对象中获取数据,如果没有再到 requet 域对象中获取数据,如果再没有再到 session 域对象中获取,如果还没有才会到 application 中获取数据。(由于page范围太小以及application范围太大,用的比较少)
JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码。如下代码就是JSTL标签
- <c:if test="${flag == 1}">
- 男
- </c:if>
- <c:if test="${flag == 2}">
- 女
- </c:if>
JSTL提供了很多标签,两个最常用的标签,<c:forEach>
标签和 <c:if>
标签。
<c:if>: 相当于if判断
代码演示:
定义一个servlet,在该servlet中向request域对象中添加键是status,值为1的数据
- @WebServlet("/demo2")
- public class ServletDemo2 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- request.setAttribute("status",1);
-
- request.getRequestDispatcher("/jstl-if.jsp").forward(request,response);
- }
-
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
定义jstl-if.jsp页面,在该页面使用<c:if>标签(注意在page标签中添加 isELIgnored="false",否则识别不了EL表达式)
- <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- <c:if test="${status==1}">
- 启用
- </c:if>
- <c:if test="${status==0}">
- 禁用
- </c:if>
- </body>
- </html>
在该页面也要引入JSTL核心标签库, <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach>: 相当于for循环。 java中有增强for循环和普通for循环,JSTL 中的 <c:forEach>
也有两种用法
类似与Java中的增强for循环。涉及到的<c:forEach>中的属性如下
如下代码,是从域对象中获取名为 brands 数据,该数据是一个集合;遍历遍历,并给该集合中的每一个元素起名为 brand
,是 Brand对象。在循环里面使用 EL表达式获取每一个Brand对象的属性值
- <c:forEach items="${brands}" var="brand">
- <tr align="center">
- <td>${brand.id}</td>
- <td>${brand.brandName}</td>
- <td>${brand.companyName}</td>
- <td>${brand.description}</td>
- </tr>
- </c:forEach>
类似于Java中普通的for循环。涉及到的属性如下
实例如下:从0循环到10,变量名是i,每次自增1
- <c:forEach begin="0" end="10" step="1" var="i">
- ${i}
- </c:forEach>
MVC 模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。
MVC是一种分层开发的模式,其中
控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后再交由视图(JSP)进行数据展示。
好处:
三层架构是将项目分为三个层面,分别是表现层、业务逻辑层、数据访问层
注册业务功能
,我们会先调用 数据访问层
的 selectByName()
方法判断该用户名是否存在,如果不存在再调用 数据访问层
的 insert()
方法进行数据的添加操作而整个流程是,浏览器发送请求,表现层的Servlet接收请求并调用业务逻辑层的方法进行业务逻辑处理,而业务逻辑层方法调用数据访问层方法进行数据的操作,依次返回到serlvet,然后servlet将数据交由 JSP 进行展示。
两者有什么区别和联系?
如上图上半部分是 MVC 模式,上图下半部分是三层架构。 MVC 模式
中的 C(控制器)和 V(视图)就是 三层架构
中的表现层,而 MVC 模式
中的 M(模型)就是 三层架构
中的 业务逻辑层 和 数据访问层。
可以将 MVC 模式
理解成是一个大的概念,而 三层架构
是对 MVC 模式
实现架构的思想。 那么我们以后按照要求将不同层的代码写在不同的包下,每一层里功能职责做到单一,将来如果将表现层的技术换掉,而业务逻辑层和数据访问层的代码不需要发生变化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。