JSP
今日目标:
- 理解 JSP 及 JSP 原理
- 能在 JSP中使用
EL表达式
和JSTL标签
- 理解
MVC模式
和三层架构
- 能完成品牌数据的增删改查功能
1,JSP 概述
==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>
上面代码 h1
标签内容是展示在页面上,而 Java 的输出语句是输出在 idea 的控制台。
那么,JSP 能做什么呢?现在我们只用 servlet
实现功能,看存在什么问题。如下图所示,当我们登陆成功后,需要在页面上展示用户名
上图的用户名是动态展示,也就是谁登陆就展示谁的用户名。只用
servlet
如何实现呢?在今天的资料里已经提供好了一个
LoginServlet
,该
servlet
就是实现这个功能的,现将资料中的
LoginServlet.java
拷贝到
request-demo
项目中来演示。接下来启动服务器并访问登陆页面
输入了 zhangsan
用户的登陆信息后点击 登陆
按钮,就能看到如下图效果
当然如果是 lisi
登陆的,在该页面展示的就是 lisi,欢迎您
,动态的展示效果就实现了。那么 LoginServlet
到底是如何实现的,我们看看它里面的内容
上面的代码有大量使用到 writer
对象向页面写标签内容,这样我们的代码就显得很麻烦;将来如果展示的效果出现了问题,排错也显得有点力不从心。而 JSP 是如何解决这个问题的呢?在资料中也提供了一个 login.jsp
页面,该页面也能实现该功能,现将该页面拷贝到项目的 webapp
下,需要修改 login.html
中表单数据提交的路径为下图
重新启动服务器并进行测试,发现也可以实现同样的功能。那么 login.jsp
又是如何实现的呢?那我们来看看 login.jsp
的代码
上面代码可以看到里面基本都是 HTML
标签,而动态数据使用 Java 代码进行展示;这样操作看起来要比用 servlet
实现要舒服很多。
JSP 作用:简化开发,避免了在Servlet中直接输出HTML标签。
2,JSP 快速入门
接下来我们做一个简单的快速入门代码。
2.1 搭建环境
创建一个maven的 web 项目,项目结构如下:
pom.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>jsp-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> </project>
2.2 导入 JSP 依赖
在 dependencies
标签中导入 JSP 的依赖,如下
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency>
该依赖的 scope
必须设置为 provided
,因为 tomcat 中有这个jar包了,所以在打包时我们是不希望将该依赖打进到我们工程的war包中。
2.3 创建 jsp 页面
在项目的 webapp
下创建jsp页面
通过上面方式创建一个名为 hello.jsp
的页面。
2.4 编写代码
在 hello.jsp
页面中书写 HTML
标签和 Java
代码,如下
<%@ 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>
2.5 测试
启动服务器并在浏览器地址栏输入 http://localhost:8080/jsp-demo/hello.jsp
,我们可以在页面上看到如下内容
同时也可以看到在 idea
的控制台看到输出的 hello,jsp~
内容。
3,JSP 原理
我们之前说 JSP 就是一个页面,那么在 JSP 中写 html
标签,我们能理解,但是为什么还可以写 Java
代码呢?
因为 ==JSP 本质上就是一个 Servlet。==接下来我们聊聊访问jsp时的流程
- 浏览器第一次访问
hello.jsp
页面 tomcat
会将hello.jsp
转换为名为hello_jsp.java
的一个Servlet
tomcat
再将转换的servlet
编译成字节码文件hello_jsp.class
tomcat
会执行该字节码文件,向外提供服务
我们可以到项目所在磁盘目录下找 target\tomcat\work\Tomcat\localhost\jsp-demo\org\apache\jsp
目录,而这个目录下就能看到转换后的 servlet
打开 hello_jsp.java
文件,来查看里面的代码
由上面的类的继承关系可以看到继承了名为 HttpJspBase
这个类,那我们在看该类的继承关系。到资料中的找如下目录: 资料\tomcat源码\apache-tomcat-8.5.68-src\java\org\apache\jasper\runtime
,该目录下就有 HttpJspBase
类,查看该类的继承关系
可以看到该类继承了 HttpServlet
;那么 hello_jsp
这个类就间接的继承了 HttpServlet
,也就说明 hello_jsp
是一个 servlet
。
继续阅读 hello_jsp
类的代码,可以看到有一个名为 _jspService()
的方法,该方法就是每次访问 jsp
时自动执行的方法,和 servlet
中的 service
方法一样 。
而在 _jspService()
方法中可以看到往浏览器写标签的代码:
以前我们自己写 servlet
时,这部分代码是由我们自己来写,现在有了 jsp
后,由tomcat完成这部分功能。
4,JSP 脚本
JSP脚本用于在 JSP页面内定义 Java代码。在之前的入门案例中我们就在 JSP 页面定义的 Java 代码就是 JSP 脚本。
4.1 JSP 脚本分类
JSP 脚本有如下三个分类:
- <%...%>:内容会直接放到_jspService()方法之中
- <%=…%>:内容会放到out.print()中,作为out.print()的参数
- <%!…%>:内容会放到_jspService()方法之外,被类直接包含
代码演示:
在 hello.jsp
中书写
<% System.out.println("hello,jsp~"); int i = 3; %>
通过浏览器访问 hello.jsp
后,查看转换的 hello_jsp.java
文件,i 变量定义在了 _jspService()
方法中
在 hello.jsp
中书写
<%="hello"%> <%=i%>
通过浏览器访问 hello.jsp
后,查看转换的 hello_jsp.java
文件,该脚本的内容被放在了 out.print()
中,作为参数
在 hello.jsp
中书写
<%! void show(){} String name = "zhangsan"; %>
通过浏览器访问 hello.jsp
后,查看转换的 hello_jsp.java
文件,该脚本的内容被放在了成员位置
4.2 案例
4.2.1 需求
使用JSP脚本展示品牌数据
说明:
- 在资料
资料\1. JSP案例素材
中提供了brand.html
静态页面 - 在该案例中数据不从数据库中查询,而是在 JSP 页面上写死