1、为什么要用JSP
- 写在Servlet中的所有HTML标签必须包含Java字符串,这使得处理HTTP响应报文的工作十分繁琐
- 所有的文本和HTML标记都是硬编码,即使表现层的微小变化,也需要重新编译
- 利用JSP技术,实现业务逻辑与页面显示的分离,动态信息由JSP页面来显示
- JSP页面通常被编译成JSP Servlets,这是一个标准的Java扩展,页面开发人员能够访问全部的java应用环境,以利用java的可移植性和可扩展性
- 当JSP页面第一次调用时,如果它不存在内存中,就会转换成JSP Servlet,并存储再服务器的内存中,这就使得在接下来的对相同页面的调用会非常快,因为它直接执行在内存中的JSP Servlert。
2、JSP的工作原理
- 当用户访问一个JSP页面时,JSP页面会被编译成Servlet文件(Java文件)。转换JSP页面到JSP页面实现类,该实现类是一个实现javax.servlet.jsp.JspPage接口或者子接口javax.servlet.jsp.HttpJspPage的Java类。JspPage是javax.servlet.Servlet的子接口,这使得每一个JSP页面都是一个Servlet。
- JSP引擎调用Java编译器,编译Servlet文件为可执行的代码文件(.class文件),像其他正常的Servlet一样执行声明周期操作。
- 用java虚拟机解释执行.calss文件,并将执行结果返回给服务器
- 服务器将执行结果以HTML格式发送给客户端的浏览器
3、JSP的内置对象
类型 | 作用 | |
request | javax.servlet.http.HttpServletRequest | Request对象用于获取客户端的各种信息 |
response | javax.servlet.http.HttpServletResponse | Response对象将服务器端数据发送到客户端,改对象包含了响应客户请求的有关信息 |
session | javax.servlet.http.HttpSession | Session对象用于存储特定的用户会话所需的信息 |
application | javax.servlet.ServletContext | Application对象保存Java Web应用程序中的公有数据,可存放全局变量,在任何地方对该对象修改,都将影响其他用户,它代表当前WEB应用 |
out | javax.servlet.jsp.JspWriter | Out对象主要用于向客户端输出各种数据,同时管理应用服务器上的输出缓冲区 |
config | javax.servlet.ServletConfig | servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装ServletConfig对象中 |
pageContext | javax.servlet.jsp.PageContext | PageContext提供了对JSP页面内使用到的所有对象及名字空间的访问,提供了对各种页面属性的访问,并且允许向其他应用组件转发Request对象 |
page | Javax.servlet.jsp.HttpJspPage | 有关页面的相关配置 |
exception | Java.lang.Throwable | Exception对象用来处理JSP文件执行时发生的错误和异常 |
4、指令
常用的JSP指令有三种:page指令、include指令、taglib指令
- page指令用来定义JSP文件中的全局属性,它描述了与页面相关的一些信息,其作用域为它所在JSP页面的和其包含的文件
- include指令用于在当前JSP页面中加载需要插入的文件代码,即为页面插入一个静态文件,如JSP文件、HTML文件等,这些加载的代码和原有的JSP代码合并成一个新的JSP文件。
- taglib指令用来指定页面中使用的标签库以及自定义标签的前缀。
5、JSP常用动作
<jsp:param>动作
<jsp:param>动作可以用于<jsp:include>、<jsp:forward>动作体中,为其他动作传送一个或者多个参数
<jsp:param name="参数名" value="参数值"/>
<jsp:include>动作
<jsp:include>动作用来把指定文件动态插入正在生成的页面中
include指令与动作的区别:
对于include指令,资源引入发生在页面转换时,即当JSP容器将页面转化生成的Servlet时。而对于include动作,资源引入发生在请求页面时。因此,使用include动作可以传递参数,而include指令不行;
include指令对引入的文件扩展名不做特殊要求。但对于include动作,允许包含静态文件和动态文件,这两种包含的结果是不同的。如果包含的文件仅是静态文件,那么这种包含仅仅是把包含文件的内容加到JSP文件中去,这个文件不会被JSP编译器执行;如果包含的文件是动态的,那么这个被包含的文件会被JSP编译器编译执行。
<jsp:useBean>动作
useBean将创建一个关联Java对象的脚本变量
<jsp:useBean id="Bean 实例名称" scope="page|request|session|application" class="JavaBean类" type="对象变量的类型" beanName="Bean名字"/>
例:<jsp:useBean="time" class="java.util.Date"/>
现在时间:<%=time%>
<jsp:setProperty>动作
<jsp:setProperty>动作用来设置、修改已实例化Bean中的属性值
<jsp:setProperty name="Bean的名称" property = " * " | property="属性" [param="属性" | value="值"] / >
<jsp:getProperty>动作
<jsp:getProperty>动作获取指定Bean'属性值后转换成字符串输出
<jsp:getProperty name="bean的名称" property="bean的属性"/>
在使用<jsp:getProperty>之前,必须用<jsp:useBean>创建实例化对象
<jsp:forward>动作
<jsp:forward>动作用于转发客户端的请求到另一个页面或者另一个Servlet文件中
<jsp:forward page="地址或者页面"/>