一、概述
JSP是Java Server Pages的简称,是一种动态网页开发技术,运行在服务端。以Java语言作为脚本语言,使用JSP标签在HTML网页中插入Java代码。
JSP是一种Java servlet,主要用于实现web应用程序的用户界面部分。可以响应客户端请求,动态生成HTML、XML或其他格式文档的web网页。
- 可以直接在HTML网页中动态嵌入元素,性能更加优越
- 服务器调用的是已经编译好的JSP文件
- 拥有强大的企业级Java API
- JSP页面可以与处理业务逻辑的servlet一起使用
- 编写和修改HTML网页比较容易,不需要在servlet中使用大量的输出语句
- JSP开发的web应用可以跨平台使用
二、处理流程
- 浏览器发送一个HTTP请求
- web服务器将请求传递给JSP引擎
- JSP引擎将JSP文件转化成servlet
- JSP引擎将servlet编译成可执行类,并将请求传递给servlet引擎
- servlet引擎载入并执行servlet类,生成HTML格式的输出并嵌入到HTTP响应中,上传给web服务器
- web服务器以静态HTML网页的形式将HTTP响应返回到浏览器
三、生命周期
JSP的生命周期就是从创建到销毁的整个过程。与servlet的生命周期类似,只是还包括将JSP文件编译成servlet的阶段。
1、编译阶段
当浏览器请求JSP页面时,JSP引擎首先会检查是否需要编译这个JSP文件。只有在该文件从没有被编译过,或在上次编译之后有过变更,才会编译该文件。
编译过程包括三个步骤:
- 解析JSP文件
- 将JSP文件转化成servlet
- 编译servlet
2、初始化阶段
加载编译生成的servlet类,调用jspInit()方法进行初始化,如建立数据库连接或打开文件等。和servlet一样,程序一般只初始化一次。
public void jspInit() {
// 初始化代码
}
3、执行阶段
调用_jspService()方法,处理与请求相关的交互行为。该方法在每个请求中被调用一次并产生与之对应的响应。
void _jspService(HttpServletRequest request, HttpServletResponse response) {
// 服务端处理代码
}
4、销毁阶段
调用jspDestroy()方法执行清理工作,如释放数据库连接或关闭文件等。
public void jspDestroy() {
// 清理代码
}
四、基本语法
1、脚本程序
脚本程序包含任意的Java语句、变量、方法或表达式。任何文本、HTML标签、JSP元素必须写在脚本程序的外面。
<% %>
2、JSP声明
声明语句可以声明任意变量、方法,供后面的Java代码使用。
<%! declaration; %>
3、JSP表达式
表达式的值先被转化成String,再将其插入到表达式所在的地方。
<%= expression %>
4、JSP注释
可以为代码行注释,也可以为代码块注释。
<%-- annotation --%>
5、JSP指令
用来设置与整个JSP页面相关的属性。JSP有三种指令标签:page、include和taglib。
5.1 page指令
定义页面的依赖属性,提供当前页面的使用说明,如脚本语言、error页面、缓存等。
<%@ page attribute="value" %>
与page指令相关的属性:
- buffer,指定out对象使用的缓冲区大小
- autoFlush,控制out对象的缓冲区
- contentType,指定当前页面的MIME类型和字符编码
- errorPage,指定当页面发生异常时转向的错误处理页面
- isErrorPage,指定当前页面是否可以作为其他页面的错误处理页面
- extends,指定servlet继承的类
- import,导入使用的Java类
- info,定义页面的描述信息
- language,定义页面使用的脚本语言,默认是Java
- session,指定页面是否使用session
- isThreadSafe,指定页面的访问是否为线程安全
- isELIgnored,指定是否执行EL表达式
- isScriptingEnabled,指定脚本元素能否被使用
5.2 include指令
通过该指令来包含其他文件,被包含的文件如同页面的一部分,会被同时编译执行。
<%@ include file="name" %>
指令中的文件名实际上是一个相对的URL地址,默认是当前路径。
5.3 taglib指令
引入标签库,可以是自定义标签。
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
6、JSP行为
JSP行为标签是一些预定义的函数,用来控制servlet引擎,实现特殊操作。
<jsp:action_name attribute="value" />
所有的动作元素都有两个属性:id和scope。id属性是元素的唯一标识,scope属性是元素的生命周期。
6.1 jsp:include元素
在当前页面中包含静态或动态资源。插入文件的时间是在页面被请求的时候。
<jsp:include page="url" flush="true" />
page属性是被包含的资源的相对URL地址。flush属性是定义在包含资源前是否刷新缓冲区。
6.2 jsp:useBean元素
用来加载一个在页面中使用的JavaBean组件。
<jsp:useBean id="name" class="package.class" />
class属性指定Bean的完整包名。type属性指定引用该对象的变量类型。
6.3 jsp:setProperty元素
用来设置已经实例化的Bean对象的属性。
<jsp:setProperty name="beanName" property="property" />
name属性表示要设置属性的Bean。property属性表示要设置哪个属性。value属性用来指定Bean属性的值。param属性指定用哪个请求参数来设置Bean属性的值。
如果jsp:setProperty元素位于jsp:useBean元素外部,不管是新创建一个Bean实例,还是已有一个Bean实例,都会执行。如果jsp:setProperty元素位于jsp:useBean元素内部,只有在新创建一个Bean实例时才会执行。
6.4 jsp:getProperty元素
获取指定Bean对象的属性值。
<jsp:getProperty name="beanName" property="property" />
name属性是要检索的Bean的名称。property属性表示要获取的属性。
6.5 jsp:forward元素
将请求转发给其他页面。
<jsp:forward page="url" />
page属性是一个相对URL。
6.6 jsp:plugin元素
用于在生成的HTML页面中包含JavaBean对象。
6.7 jsp:element、jsp:attribute、jsp:body元素
定义动态的XML元素、元素的属性以及元素的内容。
6.8 JSP:text元素
允许在JSP页面和文档中使用写入文本的模板,该模板只能包含文本和EL表达式。
<jsp:text>template</jsp:text>
7、JSP隐含对象
JSP包含九个预定义的对象,对应servlet中的类:
- request,是HttpServletRequest类的实例
- response,是HttpServletResponse类的实例
- session,是HttpSession类的实例
- application,是ServletContext类的实例
- out,是PrintWriter类的实例,用于把结果输出到网页上
- config,是ServletConfig的实例
- pageContext,是PageContext类的实例,提供对页面所有对象的访问
- Exception,是Exception类的实例
- page,类似于Java类中的this关键字
五、表单处理
在浏览网页的时候,经常需要向服务器提交信息,由后台程序进行处理。
1、GET和POST方法
GET方法是浏览器默认的传递参数的方法。将请求的信息添加到URL后面,之间用“?”分隔,参数之间用“&”分隔。
http://url?key1=value1&key2=value2
POST提交的数据是不可见的,即不在url显示。
2、读取表单数据
JSP读取表单数据有以下几种方法:
- getParameter(),获取表单参数的值
- getParameterValues(),获取名字相同但有多个值的数据,返回数组
- getParameterNames(),获取所有变量的名称,返回枚举
- getInputStream(),获取来自客户端的二进制数据流
六、过滤器
过滤器可以动态地拦截请求和响应。可以将一个或多个过滤器附加到一个servlet或一组servlet,也可以附加到JSP文件和HTML页面。
过滤器通过web.xml中的标签声明,然后映射到servlet或url。当web容器启动web应用程序时,会为声明的每一个过滤器创建一个实例。过滤器的执行顺序与配置文件中的配置顺序一致。
过滤器是一个实现javax.servet.Filter接口的类,接口定义了三个方法,分别对应了过滤器生命周期的三个阶段。
初始化阶段:
public void init(FilterConfig filterConfig)
web应用程序启动时,web服务器会创建Filter的实例对象并调用其init()方法,读取配置文件,完成对象的初始化,从而为拦截请求做好准备。
过滤阶段:
public void doFilter (ServletRequest, ServletResponse, FilterChain)
当客户端的请求方法与过滤器的设置匹配时,servlet容器会调用过滤器的doFilter()方法,完成过滤操作。参数FilterChain用来访问后续过滤器。
销毁阶段:
public void destroy()
servlet容器在销毁过滤器实例前调用该方法,释放过滤器占用的资源。
七、跳转
按照跳转的处理方式分成两类:客户端跳转和服务器跳转。
1、客户端跳转
使用超链接:
<a href="newPage.jsp">跳转</a>
使用JavaScript脚本:
<script>
function onSubmit() {
submit();
}
</script>
<form name="form1" method="post" action="onSubmit();">
<input type="submit">
</form>
提交表单:
<form name="form1" method="post" action="newPage.jsp">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit">
</form>
使用jsp的内置对象response:
<%
response.sendRedirect("http://www.google.cn");
%>
或者
<%
response.sendHeader("Refresh","1;url=http://www.google.cn");
%>
2、服务器跳转
使用RequestDispatcher类的forward方法。
RequestDispatcher rd = request.getRequestDispatcher("/newPage.jsp");
rd.forward(request, response);
3、sendRedirect和forward的区别
sendRedirect:
- 执行完所有代码再跳转到目标页面
- 跳转后浏览器的url会改变
- 在浏览器中重定向
- 可以跳转到其他服务器
forward:
- 直接跳转到目标页面,不执行后续代码
- 跳转后url不会改变
- 在服务器端重定向
- 不能跳转到其他服务器
参考文章: