在JSP出现之前,java体系的动态网页是由servlet来生成的。但由于用Servlet生产动态网页非常麻烦,难于维护,必须由程序员来编写,页面设计人员如果不懂java代码,根本无法维护。经过进化就产生了JSP。JSP把原来在Servlet中用out.print()方法输出来的html元素,都直接写在页面,简单很多。
JSP引擎:支持jsp文件转化和编译的servlet。
Tomcat目录下的work存放的是tomcat编译后的文件。
JSP原始代码中包含了jsp元素和Template(模板)data两类。
JSP元素将由JSP引擎直接处理,必须符合JSP规范,否则会编译错误。
Template是JSP引擎不进行处理的部分。即标记<%.....%>以外的部分。
Web容器处理JSP文件请求的执行过程主要包括以下4个部分:
1. 客户端发出Request请求
2. JSP Container 将JSP转译成Servlet的源代码
3. 将产生的Servlet源代码经过编译后,并加载到内存执行
4. 把结果Response(响应)至客户端
JSP的执行性能和Servlet的差别只在第一次的执行。因为JSP在第一次执行后,会被编译成Servlet的类文件,即.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不再重新把JSP编译成Servelt。因此,除了第一次的编译会花较久的时间之外,之后JSP和Servlet的执行速度就几乎相同了。
当JSP网页在执行时,JSP Container 会做检查工作,如果发现JSP网页有更新修改时,JSP Container 才会再次编译JSP成 Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet。
在执行JSP网页时,通常可以分为两个时期:转译时期(Translation Time)和请求时期(Request Time)。
转译时期:JSP网页转移成Servlet类。
转译期间做了两件事情:
转译时期:将JSP网页转移为Servlet源代码 .java.。
编译时期:将Servlet 源代码 .java编译成 Servlet类 .class。
请求时期:Servlet类执行后,响应结果至客户端。
在jsp页面中,jsp元素可以分为三大类:JSP指令元素、JSP动作元素、JSP脚本元素。
JSP指令元素仅仅是在“翻译”阶段使用的,即把JSP翻译成Servlet。
<%@ 指令元素 属性=值 属性=值%>
<%@ page ....%> 定义了独立于页面的属性,例如会话跟踪,错误处理页面和对缓存的要求。
<%@ include..%> 在翻译阶段引入一个文件。
<%@ taglib...%> 声明一个在页面使用的自定义行为的标记库。
JSP页面page指令元素中pageEncoding和contentType属性同时存在的话,如果ContentType写了charset永远是用该charset,如果没写就是用pageEncoding中的charset。如下例代码中,该jsp页面用的charset是UTF-8。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%>
jsp动作元素又可分为:JSP标准动作元素、JSP标准标记库(JSTL)动作元素、自定义动作元素三种。
JSP标准动作元素是早期就存在的JSP规范定义的标准动作元素,它是由jsp作为前缀的标签。例如:
<jsp:useBean ......>
常用的几种动作标签:
<jsp:include>动态引入。可以使用相对路径。
<jsp:forward>
使用以上两个标签可以使用<jsp:param name=”” value=””>标签向这个程序传递参数信息。处理中文编码方式为,在主页面中设置request的编码即可。
JSP标准标记库(JSTL)动作元素是在JSP发展到后才来产生的,他主要由:核心库(core)、国际化和格式化库、关系数据库访问库、XML处理库、函数库,这五个库组成。每个库的标签都对应相应的标签前缀。比如:核心库里面的标签前缀是c,<c:out...>。由于现在的Web一般都采用MVC模式,所以JSTL中的关系数据库访问库一般比较少用到。而在用纯JSP设计的Web中一般会用到。
在“JSP标准动作元素”和“JSP标准标记库(JSTL)动作元素”中,有些动作的功能是相同或相似,你可以任意选择其中一种来用。但因为“JSP标准标记库(JSTL)动作元素”是后来才制定,它通常功能更强,而且书写更简单,一般建议选用JSTL中的标记。
自定义动作元素如果觉得JSTL还不够用,你还可以开发自定义的定制动作。不作具体介绍。
JSP脚本元素在JSTL还没发展起来时,是JSP代码的主要组成部分,在JSP脚本里面可以写各种各样的java代码来完成各种任务。但JSP页面中大量使用JSP脚本元素会使JSP页面凌乱,而且JSP页面使用JSP脚本元素不方便编程任务的分工。可以说,JSTL就是为了解决JSP脚本元素带来的问题而产生的。有了JSTL后,可以用JSTL取代JSP脚本元素(但JSTL还在完善中,有时不能100%的取代JSP页面中的JSP脚本元素)。EL表达式也是JSP在后来引进的。他可以为JSP标记的属性等动态赋值,比JSP表达式更加简单易用。
声明语句,用于在JSP页面的是吸纳类中声明实例变量的方法。一般写到页面中的head标签内。
语法:
<%! 声明语句 %>
举例:
<%! private static final String str=”123”; static { System.out.println(static…); } public int add(int a,int b){ return a+b; } %>
用于嵌入脚本代码。
语法:
<% java代码 %>
用于嵌入java表达式,这些表达式的结果将加入应答中,也可以用作运行时行为的属性值。
语法:
<%= 表达式 %>
语法:
<%--注释--%>
在jsp页面中可以使用Java注释、html注释和jsp注释,但是在浏览器中只能看到html的注释。
JSP脚本中包含九个内置对象,这九个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化(由JSP页面对应的Servlet的_jspService()方法来创建这些实例)。
与servlet相关的隐含对象exception
可以通过page指令设置session是否在jsp页面中使用。在page指令中设置session标识仅仅是告诉jsp引擎在生成servlet代码的时候是否添加sesion这个内部变量。
jspconfig:在web.xml中配置jsp文件。如果配置了jsp的请求规则,直接访问jsp和通过配置的请求规则访问jsp,后台的访问机制是不一样的。如果直接访问jsp,得到的servletConfig也是JSPServlet的配置参数。通过请求规则访问,得到的servletConfig是自己的,但是在JSPServlet里面配置的初始化参数也会出现。
在JSP页面处理forward的三种方式:<% RequestDispatche rd = request.get("..."); rd.forward(req,resp); %>
<% pageContext.forward(); %>
<jsp:forward page="..." />
Page作用域没有setAtrribute()和getatrribute()方法;
JSP异常处理机制<error-page> <exception-type>java.lang.Exception</exception-type> <location>/error/exception.jsp</location> <error-page>
jsp本质上就是Servlet,jsp经编译后最终就变成了Servlet;
Servlet是在java代码产生html输出结果,jsp是在html网页中嵌入java代码。jsp擅长页面显示,Servlet擅长逻辑控制。