正文开始 ----------
第1章 为什么要学习JSP
1.1 现有技术不足
Servlet可以通过转发或重定向跳转到某个HTML文档。但HTML文档中的内容不受Servlet的控制。比如登录失败时,跳转回登录表单页面无法显示诸如“用户名或密码不正确”的错误消息,所以我们目前采用的办法是跳转到一个错误信息页面。如果通过Servlet逐行输出响应信息则会非常繁琐。
Servlet输入html页面的程序代码:
package com.manman.web; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; /** * @author Gaoziman * @version 1.0 * description: * @date 2022/8/23 19:27 */ @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置返回的数据内容的数据类型和编码 response.setContentType("text/html; charset=utf-8"); // 获取字符输出流 Writer writer = response.getWriter(); //输出页面内容! writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"); writer.write("<html>"); writer.write("<head>"); writer.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"); writer.write("<title>Insert title here</title>"); writer.write("</head>"); writer.write("<body>"); writer.write("这是由Servlet程序输出的html页面内容!"); writer.write("</body></html>"); } }
接着,在浏览器中输入访问Servlet的访问路径得到以下结果:
上面的代码我们不难发现。通过Servlet输出简单的html页面信息都非常不方便。那我们要输出一个复杂页面的时候,就更加的困难,而且不利于页面
的维护和调试。
1.2 Servlet与HTML
Servlet | HTML | |
长处 | 接收请求参数,访问域对象,转发页面 | 以友好方式显示数据 |
短处 | 以友好方式显示数据 | 动态显示数据 |
1.3 总结
那能否将Servlet和HTML二者的长处结合起来呢?
能!sun公司推出一种叫做JSP的动态页面技术帮助我们实现对页面输出繁锁工作。
第2章 JSP简介
2.1 JSP全称
- JSP全称Java Server Pages,顾名思义就是运行在java服务器中的页面。由Sun 公司专门为了解决动态生成HTML文档的技术,也就是在我们JavaWeb中的动态页面。
JSP能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML。
JSP其本质就是一个Servlet。Servlet能做的事情 JSP 都能做。
JSP必须运行在服务器中,不能直接使用浏览器打开。
JSP是Web网页的技术标准,主要语法组成包括:指令,html模板元素,脚本片段(小脚本),表达式,声明,注释,后缀是*.JSP。
JSP的主要作用是代替Servlet程序回传HTML页面的数据
web目录(或其他)右击 --> new --> JSP/JSPX --> 输入文件名 --> 选择JSP file创建
2.2 JSP与HTML的区别
- JSP是动态页面,html是静态页面。
动态页面 | 静态页面 | |
运行原理 | 通过服务器解析后,将数据在浏览器中显示 | 直接在浏览器中解析运行 |
维护成本 | 较低,可以修改后台数据,进而影响页面中的数据 | 较高,必须将修改后的页面覆盖原页面 |
数据库 | 可以连接数据库 | 不可连接数据库 |
访问速度 | 较慢 | 较快 |
书写代码 | 可以书写java代码 | 不能书写java代码 |
2.3 JSP与Servlet分工
JSP本质是一个Servlet ,翻译后的文件结构为:class helloworld_JSP : HttpJSPBase : HttpServlet。
JSP主要负责显示及获取数据,从表面上看,JSP 相对于在html中嵌入java代码:JSP=html+java。
Servlet主要负责处理业务,从表面上看,Servlet相当于在java中嵌入html代码:Servlet=java+html。
总结:相比于Servlet,JSP更加善于处理显示页面,而Servlet更善于处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和 JSP 结合使用,Servlet负责业务,JSP 负责显示。
2.4 JSP基本格式
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP页面</title> </head> <body> 这是我的第一个JSP页面。 </body> </html>
2.5 JSP的本质
JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:
而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序
第3章 JSP初体验
3.1 创建一个JSP动态页面程序:HelloWorld
① 选中Web目录,右键创建一个jsp文件
②在body标签中添加你想要显示的文本内容
③然后在浏览器中输入jsp页面的访问地址
jsp页面的访问地址和html页面的访问路径一样http://ip:端口号/工程名/文件名。也就是https://localhost:8080/day07/demo.jsp
注意事项:
1、jsp 页面是一个类似于 html 的一个页面。 jsp直接存放到 web目录下,和html一样访问 jsp 的时候,也和访问html一样
2、jsp 的默认编码集是 ISO-8859-1,修改 jsp 的默认编码为UTF-8
3.2 JSP运行原理
jsp的本质其实是一个Servlet程序。
实际上Tomcat在运行JSP时,并不是直接显示的我们所编写的JSP页面,而是将JSP页面转换成了一个Java类,这个Java类是什么,我想大家也能猜到了,它实际上就是一个Servlet。
这个Servlet在哪呢?在Tomcat目录中work目录中,在那个目录下保存着 Tomcat自动生成的一些内容,下面让我们来找到那个目录。
在work目录下的…work\Catalina\localhost\day07_jsp\org\apache\jsp文件夹中我们可以发现两个文件index_jsp.java和index_jsp.class,前者就是Tomcat自动生成的Servlet的源码,后者是编译后的.class文件。
打开index_jsp.java文件部分内容如下:
图一:
我们打开index_jsp.java文件查看里面的内容:发现,生成的类继承于HttpJspBase类。这是一个jsp文件生成Servlet程序要继承的基类!于是,我们关联源代码。去查看一下HttpJspBase类的内容。从源码的类注释说明中,我们发现。HttpJspBase这个类就是所有JSP文件生成Servlet程序需要去继承的基类。并且这个HttpJspBase类继承于HttpServlet类。我们访问JSP时服务器就是调用了该Servlet来响应请求。所以JSP也是一个Servlet小程序。
我们分别在工程的WebContent目录下创建多个jsp文件。然后依次访问。它们都被翻译为.java文件并编译成为.class字节码文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A9HeCUmf-1661441820762)(https://gaoziman.oss-cn-hangzhou.aliyuncs.com/img/JSP%E5%8E%9F%E7%90%86.png)]
我们顺着代码向下看,会发现_jspService()方法。会发现有九个对象(实际上默认会看到八个),这是后面要讲到的重点。
图二:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sG1Eo9Ro-1661441820763)(https://gaoziman.oss-cn-hangzhou.aliyuncs.com/img/jsp%E7%BF%BB%E8%AF%91servlet%E5%90%8E%E9%83%A8%E5%88%86%E6%BA%90%E7%A0%812.png)]
小结:
从生成的文件我们不难发现一个规则:
a.jsp 翻译成 java文件后的全名是 a_jsp.java文件
b.jsp 翻译成 java文件后的全名是 b_jsp.java文件
那么当我们访问 一个xxx.jsp文件后翻译成java文件的全名是 xxx_jsp.java文件。
xxx_jsp.java文件是一个Servlet程序。原来jsp中的html内容都被翻译到Servlet类的service方法中原样输出。
Servlet是需要在web.xml中配置的,而我们并没有配置JSP的serlvet映射,那他是如何访问的呢?实际在tomcat下的conf目录中的web.xml早已配置好了JSP的映射信息,具体内容如下:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jspx</url-pattern> </servlet-mapping>
总结Jsp运行原理
- 第一次访问jsp页面时,服务器会将xxx.jsp文件翻译成xxx_jsp.java文件,再编译成xxx_jsp.class文件。
- 以后在访问同一个jsp文件
- 如果文件未改变,不会被翻译和编译
- 如果文件改变,会翻译和编译