JSP(全称:Java Server Pages):Java服务端页面,是一种动态的网页技术,既可以定义HTML、JS、CSS等静态内容,也可以定义Java代码的动态内容,也就是JSP=HTML+Java,如下就是JSP代码
- <head>
- <title>Titletitle>
- head>
- <body>
- <h1>JSP,Hello Worldh1>
- <%
- System.out.println("hello,jsp~");
- %>
- body>
JSP作用:简化开发,避免了在Servlet中直接输出HTML标签
如下是jsp代码
-
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Titletitle>
- head>
- <body>
-
- <h1>hello jsph1>
-
-
- <%
- System.out.println("hello jsp~");
- %>
-
- body>
- html>
![]()
JSP本质上是一个Servlet,
hello.jsp 页面tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlettomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.classtomcat 会执行该字节码文件,向外提供服务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
brands = new ArrayList(); - 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));
- %>
-
-
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- 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
brands = new ArrayList(); - 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>Titletitle>
- 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提供了很多标签,两个最常用的标签, 标签和 标签。
代码演示:
定义一个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页面,在该页面使用
- <%@ 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>Titletitle>
- 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" %>
也有两种用法
类似与Java中的增强for循环。涉及到的
如下代码,是从域对象中获取名为 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 模式 实现架构的思想。 那么我们以后按照要求将不同层的代码写在不同的包下,每一层里功能职责做到单一,将来如果将表现层的技术换掉,而业务逻辑层和数据访问层的代码不需要发生变化。