JSP/servlet及相关技术详解:
1.0-- Jsp与servlet本质是一样的,因为jsp最终必须编译成servlet能运行,或者说jsp只是生成servlet的草稿文件,jsp其特点是在HTML页面中嵌入java代码片段,或者使用各种jsp标签,包括使用用户自定义标签,从而可动态的提供页面内容,后来jsp慢慢发展成单一的表现层技术,不再承担业务逻辑组件及持久层组件的责任。
2.0—WEB应用的文件结构:
<webDemo> ----->web应用名称
|--WEB-INF ------>
| |-classes ------>保存单个*.class文件
| |-lib ------>保存jar文件
| |-web.xml ------->配置描述符
|-<a.jsp> ----->此处存放多个jsp页面
3.0—jsp的基本原理:
Jsp的本质就是servlet,当用户向指定的servlet发送请求时,servlet利用输出流动态生成HTML页面,包括每一个静态的HTML标签和所有在HTML页面中出现的内容;而jsp则是通过在标准的HTML页面中嵌入java代码,其静态的部分无需java程序控制,只有那些需要从数据库读取或需要动态生成的页面内容,才使用java控制;jsp其实也就是servlet的一种简化。由上可知jsp页面由以下两部分组成:
A. 静态部分:标准的HTML标签,静态的页面内容
B. 动态部分:受java程序控制的内容,由java 脚本动态生成
4.0--Servlet生命周期
a.创建servlet实例
b.调用init()初始化servlet
c.使用service()处理响应用户请求
d.调用destroy()方法销毁servlet
5.0—jsp工作原理图中得到以下四个结论:
1.jsp文件必须在jsp服务器内才能运行
2.jsp文件必须生成servlet才能执行
3.每个jsp页面的第一个访问者速度很慢,因为必须等jsp编译成servlet
4.jsp页面访问者无需安装任何客户端,甚至不需要jre,因为jsp页面输送到客户端的是标准HTML页面
6.0---jsp页面的四种基本语法:
1.jsp注释 <%-- 注释 --%>
2.jsp声明 <%! 声明 %>
3.jsp输出表达式 <%= 表达式 %>
4.jsp脚本 <% 脚本 %>
.6.1---jsp的三个编译指令page,include ,taglib
Page:该指令针对当前页面的指令
Include:用于指定包含另一个页面
Taglib:用于定义和访问自定义标签
编译指令的语法格式:
<%@ 编译指令名 属性名=”属性值”…%>
1.0--page指令各属性意义:
language:声明使用脚本语言的种类,默认java
extends:指定编译所产生的java类所继承父类或实现接口
import:导入包
session:设定是否需要HTTPSession
buffer:输出缓冲区大小
autoflush:输出缓冲区即将溢出时是否强制输出缓冲区内容
info:说明该jsp程序的信息
errorPage:指定错误处理页面,jsp内建异常机制可忽略
isErrorPage:设置该jsp页面是否为错误处理程序
contentype:设定生成网页的文件格式和编码字符集
pageEncoding: 指定生成网页的编码字符集
6.2---jsp的七个动作指令
编译指令是通知servlet引擎的处理消息,而动作指令只是运行时的动作,编译指令在将jsp编译成servlet时起作用,而处理指令通常可替换成jsp脚本,他只是jsp脚本的标准化写法。
Jsp:forward---执行页面转向,将请求的处理转发到下一页面
<jsp:forward page=”{relativeURL | <%=expression%>}”>
{<jsp:param…/>} <%--增加额外的请求参数-->
</jsp:forward>
Jsp:param---传递参数必须与其他支持参数的标签一起使用
用于设置参数值,本身不能单独使用,单独的param指令没有实际意义,需与jsp:include | jsp:forward | jsp:plugin三个指令结合使用;当于include结合使用时,param用于将参数值传入被导入的页面,当与forward使用时将参数值传入被转向的页面,当与plugin使用时,用于将参数传入页面的javabean或applet实例
<jsp:param name =”paramname”value=”paramvalue”/>
Jsp:include---用于动态引入一个jsp页面
<jsp:include page=”{relatieURL | <%=expression%>”flush=“true“>
<jsp:param name=”parameterName”value=”parameterValue”/>
</jsp:include>
<%--flush属性用于指定输出缓存是否转移到被导入文件中-->
静态导入与动态导入的三点区别:
1. 静态导入是将被导入页面的代码完全融合,两个页面完全融合成一个整体的servlet,而动态导入则在servlet中调用include方法来引入被导入页面的内容
2. 静态导入时被导入页面的编译指令会起作用,而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容
3. 动态包含还可以增加额外的参数
4. 简而言之,forward拿目标页面代替原有页面,而include则拿目标页面插入原有页面
Jsp:plugin---用于下载javabean或applet到客户端执行
客户端需安装虚拟机
Jsp:useBean---创建一个javaBean的实例
<jsp:useBean id =”name” class=”classname”scope=”page | request | session | application”/>
<%--page:该javabean实例仅在当前页面有效
request:仅在本次请求中有效
session:仅在本次session中有效
application:在本应用中一直有效-->
Jsp:setProperty---设置javaBean实例的属性值
<jsp:setproperty name=”beanname” property=”propertyname”value=”value”/>
Jsp:getProperty---输出javaBean实例的属性值
<jsp:getproperty name=”beanname” property=”propertyname” />
7.0---jsp脚本中的九个内置对象
Jsp脚本中内含九个内置对象,这九个内置对象都是servlet API接口的实例,只是jsp规范对他们进行了默认初始化(由jsp页面对应servlet的_jspservice方法来创建这些实例。
1. application:javax.servlet.servletContext的实例代表jsp所属的web应用本身,可用于jsp页面或者在servlet之间交换信息,常用的方法有:getAttribute(String attName),setAttribute(String name,String value),getInitParameter(String paramName)等<1.可让多个jsp/servlet共享数据,通常只放置web应用的状态信息;2.获得web应用配置参数>
2. config:javax.servlet.servletConfig实例代表jsp的配置信息,常用的方法有getInitparameter(String parameterName) ,getInitparameterNames()等。事实上jsp页面通常无需配置,也就不存在配置信息,因此该对象更多的在servlet中有效
3. exception:java.lang.throwable的实例代表其他页面中的异常和错误,只有当页面是错误处理页面,该对象才可以使用,常用的方法有getMessage()和printStackTrace()等
4. out:javax.servlet.jsp.jspWriter的实例代表jsp页面输出流用于输出内容,形成HTML页面
5. page:代表页面本身亦即servlet中的this其类型就是生成的servlet类,能用page的地方就可用this
6. pageContext:javax.servlet.jsp.pagecontext的实例代表jsp页面的上下文,使用该对象可以访问页面中的共享数据getservletcontext()和getservletconfig()
7. request:javax.servlet..http.httpservletrequest的实例该对象封装了客户端的一次请求数据,获取客户端请求参数必须使用该对象,常用的方法有getParameter(String parameterName),getParameterValues(String-parameterName),setAttribute(String
attrName,Object attrValue),getAttribut(String attName)和setCharracerEnconding(String env)等
8. response:javax.servlet.http.HttpServletResponse的实例代表服务器对客户端的响应,通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。而response对象常用于重定向(会丢失所有的请求参数和request范围的属性,将生成第二次请求),常用的方法有getOutputStrean(),sendRedirect(java.String.location)等
9. session:javax.servlet.http.HttpSession的实例,该对象代表一次会话,当客户端浏览器与站点建立连接会话开始,客户端关闭浏览器会话结束,通常用于跟踪用户的会话信息且session范围内的属性可在多个页面的跳转之间共享常用的方法有:getAttribute(String attrName) ,setAttribute(String attrName,Object attrValue)等
客户端发送请求参数通常分为两种情况:
A. get方式的请求(默认):此种请求方式会将参数的名和值转换成字符串,并附加在原URL之后,因此可以在地址栏中看到请求参数名和值,且get请求传送的数据量较小,一般不能大于2KB
B. post方式的请求(需设置):此种请求方式传送的数据量较大,通常认为不受限制但往往取决于服务器的限制,且总是大于以get传输的数据量,其请求参数名和值存放于HTML HEADER中传输,故用户能能在地址栏中看到请求参数值,安全性相对较高
cookie与session的不同之处在于:session会随浏览器的关闭而失效,但cookie会一直存放在客户端机器,除非超出其生命期限;使用cookie对象必须设置其生存期限,否则cookie会随浏览器的关闭而自动消失
8.0---servlet介绍
Servlet是一个特殊的java类必须继承HttpServlet每个servlet可以响应客户端的请求,servlet提供不同的方法用于响应客户端请求:
A. doget:用于响应客户端的get请求
B. dopost:用于响应客户端的post请求
C. doput:用于响应客户端的put请求
D. dodelete:用于响应客户端的delete请求
事实上客户端的请求通常只有get和post两种,servlet为了响应者两种请求必须重写doget()和dopost()两个方法
大部分时候servlet对于所有请求的响应都是一样的只需重写service()即可响应客户端的所有请求
此外HttpServlet还包含两个方法:
Init(servletConfig congfig):创建servlet实例时,调用该方法初始化servlet资源
Destroy():销毁servlet实例时,自动调用该方法回收资源
不需要为servlet编写构造器,如果需要对servlet执行初始化操作,应将初始化操作放在servlet的init()方法中定义,如果重写了init(servletConfig config)方法,则应在重写该方法的第一行调用super.init(config),该方法将调用httpservlet的jnit方法
9.0---servlet与jsp的区别:
1.Servlet中没有内置对象,原来jsp页面中的内置对象都必须由程序显示创建
2.对于静态的html标签,servlet都必须使用页面输出流逐行打印
10.---servlet的配置
配置servlet时需要修改web.xml文件
从servlet3.0开始配置servlet有两种方式:
1.在servlet中使用@webservlet注解进行配置
2.通过在web.xml文件中进行配置
使用注解来配置servlet需要注意两点:
1. 不要在web.xml文件的根元素<web-app…/>中指定metadata-complete=“true”
2. 不要在web.xml中配置该servlet
使用web.xml配置servlet需要配置如下两部分:
1. 配置servlet的名字:对应web.xml中的<servlet/>元素
2. 配置servlet的URL:对应web.xml中的<servlet-mapping>元素。这一步是可选的但如果没有为servlet配置URL,则该servlet不能响应客户端请求
创建servlet实例有两个时机:用户请求之时或者应用启动之时,应用启动时就创建servlet通常是用于某些后台服务的servlet,或者需要拦截很多的servlet,这种servlet通常作为应用的基础servlet使用,提供重要的后台服务
配置load-on-startup的servlet有两种方式,此两种斗志接受一个整形值,数值越小servlet越先实例化:
A. 在wen.xml中通过<servlet…/> 元素的<load-on-startup…/>子元素进行配置
B. 通过@webservlet注解的loadonstartup属性指定
配置servlet时还可以增加额外的配置参数,实现更好的移植性,避免将参数以硬编码的方式写在程序代码中
为servlet配置参数有两种方式:
通过@webservlet的initparameter属性来指定
通过web.xml文件的<servlet../>元素中添加<init-param…/>子元素来指定
访问servlet配置参数通过servletconfig对象(即jsp的内置对象config)提供的java.lang.string.getinitparameter(java.lang.string name)完成
11.0---在标准的mvc模式中,servlet仅作为控制器使用,他的作用类似于调度员:所有用户请求都发送给servlet,servlet调用model(由javabean充当,所有业务逻辑数据访问逻辑都在model中实现)来处理用户请求,并调用jsp来呈现处理结果;或者servlet直接调用jsp将应用的状态数据呈现给用户。控制器负责接收客户端的请求,他既不对客户端输出响应也不处理用户请求,只调用javabean来处理用户请求,javabean处理完后servlet根据处理结果调用不同的jsp页面向浏览器呈现处理结果
12.0---开发jsp自定义标签库
1.开发自定义标签处理类(以简单的标签隐藏复杂的逻辑)
自定义标签类应该继承javax.servlet.jsp.tagext.simpletagsupport,除此之外,如果标签包含属性要为每个标签提供对应的getter和setter方法;重写dotag()负责生成页面内容
2.建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库可包含多个标签
Tld即标签库定义,标签库定义文件的根元素是taglib他可以包含多个tag子元素,每个tag子元素都定义一个标签;
taglib下有如下三个子元素:
tlib-version:指定该标签库实现的版本
short-name:该标签库的默认短名
uri:指定该标签库的uri相当于指定该标签库的唯一标识
tag元素常用子元素:
name:该标签的名称,jsp页面中就是根据该名称来使用
tag-class:指定标签的处理类
body-content:指定标签体内容
tagdependent:指定标签处理类自己负责处理标签体
empty:指定该标签只能作为空标签使用
jsp:指定该标签的标签体可以使用jsp脚本。(jsp2规范不再推荐使用jsp脚本,所以jsp2自定义标签体中不能包含jsp脚本,故body-content元素的值不可以是jsp)
scriptless:指定该标签的标签体可以是静态html元素,表达式语言,但不允许出现jsp脚本
3. 在jsp文件中使用自定义标签
在jsp页面中确定指定的标签需要两点:
1.标签库uri:确定使用哪个标签库
2.标签名:确定使用哪个标签
使用标签库分成以下两个步骤:
1. 导入标签库:使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来
<%@ taglib uri=”tagliburi”prefix=”tagprefix”%>
Uri:指定该标签库的uri prefix:指定标签库前缀,即所有使用该前缀的标签将由此标签库处理
2. 使用标签:在jsp页面中使用自定义标签
<tagprefix:tagname tagattribute=”tagvalue”…>
<tagbody/>
</tagprefix:tagname>
如果没有标签体可以使用如下语法格式:
<tagprefix:tagname tagattribute=”tagvalue”…>
带属性的标签:需要为<tag…/>元素增加<attribute../>子元素,每个<attribute>子元素定义一个标签属性,通常还需指定如下几个子元素:
Name:设置属性名,子元素的值是字符串内容
Required:设置该属性是否为必须元素(true/false)
Fragment:设置该属性是否支持jsp脚本,表达式等动态内容(true/false)
带标签体的标签:
可以在标签内嵌入其他内容(html/jsp),通常用于完成一些逻辑运算
以页面片段作为属性的标签:
与普通标签区别不大,只有两个简单的改变:
1. 标签处理类中定义类型为jspfragment的属性,该属性代表了页面片段
2. 使用标签库时,通过<jsp:attribute…/>动作指令为标签的属性指定值
动态属性的标签:
相较于普通标签多了如下两个要求:
1. 标签处理类需要实现dynamicattributes接口
2. 配置标签时通过<dynamic-attribures…/>子元素指定该标签支持动态属性
13.0---filter介绍
Filter可以认为是servlet的一种加强版,他主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链,filter也可以对用户请求生成响应,这一点与servlet相同,但实际上很少会使用filter向用户请求生成响应。使用filter完整的流程是:filter对用户请求进行预处理,接着将请求交给servlet进行处理并生成响应,最后filter再对服务器响应进行后处理;实际上filter与servlet非常相似,区别只是filter的dofilter()方法里多了一个filterChain的参数,通过该参数可以控制是否放行用户请求,在实际的项目中,filter里dofilter()方法里的代码就是从多个servlet的service()方法里抽取的通用代码,通过使用filter可以实现更好的代码复用
Filter有如下几个用处:
1. 在httpservletrequest/httpservletresponse到达servlet之前进行拦截
2. 根据需要检查httpservlerrequest/httpservletresponse,也可以修改二者的头和数据
Filter有如下几个种类:
1. 用户授权的filter:检查用户请求,过滤用户非法请求
2. 日志filter:详细记录某些特殊的用户请求
3. 负责解码的filter:包括对非标准解码的请求解码
4. 能改变xml内容的xslt filter等
5. Filter可负责拦截多个请求或响应,一个请求或响应也可被多个filter拦截
创建filter只需两步:
1. 创建filter处理类
必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法:
Void init(filterconfig config):用于完成filter 的初始化
Void destroy ():用于filter销毁前,完成某些资源的回收
Void doFilter(servletRequest request servletResponse response ,filterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理;执行chain.dofilter()之前即对用户请求进行预处理,执行该方法之后即对服务器响应进行后处理
2. Web.xml文件中配置filter
a) 配置filter与配置servlet非常相似都需要配置如下两个部分:
i. 配置filter名
ii. 配置filter拦截url模式
区别在于servlet通常只配一个url,而filter可以同时拦截多个请求的url,因此在配置filter的url模式时通常会使用模式字符串,使得filter可以拦截多个请求;配置filter同样有两种方式:
1. 在filter类中通过注解进行配置
2. 在web.xml文件中通过配置文件进行配置
13.使用URL Rewrite实现网站伪静态:
将*.jsp ,*.php这种动态URL伪装成静态的HTML页面,对于java web应用来说,要实现伪静态非常简单:可以通过filter拦截所有发向*.html请求,然后按某种规则将请求forward到实际的*.jsp页面即可。现有的URL Rewrite开源项目为这种思路提供了实现
14.---listener介绍
Servlet API提供了大量监听器来监听Web应用的内部事件,从而允许当web内部事情发生时回调事件监听器内的方法
实现Listener只需两个步骤:
1. 定义listener实现类
2. 通过注解或在web.xml文件中配置listener
常用的web事件监听器接口有如下几个:
1. servletContextListerner:监听web应用启动和关闭
a.attributeAdder(servletContextAttributeEvent event)属性存入applicattion范围时触发
b.attributeRemoved(servletContextattributeEvent event)属性从application范围内删除时触发
c.attributereplaced(servletContextAttributeEvent event):替换application范围内的属性时触发
2. servletContextAttributeListener:用于监听servletContext范围(application)内属性的改变
3. servletRequestListener:用于监听用户请求
4. servletRequestattributeListener:用于监听servletRequest范围(request)内属性的改变.3-4
a. requestInitialized(servletRequestevent event):用户请求到达,被初始化时触发该方法
b. requestDestroyed(servletRequestEvent str):用户请求结束,被销毁时触发该方法
5. HttpsessionListener:用于监听用户session开始和结束
6. HttpsessionattributeListener:用于监听httpsession范围内(session)内属性的改变。5-6
A. sessionCreated(HttpsessionEvent se):用户与服务器的会话开始创建时触发该方法
B. sessionDestroyed(HttpsessionEvent se):用户与服务器的会话断开销毁时触发该方法
配置listener只要想web注册listener实现类即可,无须配置参数之类的东西
1.使用@webListener修饰listener实现类即可
3. 在web.xml文档中使用<listener…/>元素进行配置
14---jsp2特性
配置jsp属性:
1. 是否允许使用表达式语言:使用<el-ignored/>元素确定,默认值为false,即允许使用表达式语言
2. 是否允许使用jsp脚本:使用<scripting-invalid/>元素确定,默认值为false,即允许使用jsp脚本
3. 声明jsp页面的编码:使用<page-encoding/>元素确定,配置该元素后可以代替每个页面里page指令contentType属性的charset部分
4. 使用隐式包含:使用<include-prelude/>和<include-coda/>元素确定,可以代替在每个页面里使用include编译指令来包含其他页面
15----表达式语言:
表达式语言是一种简化的数据访问方式,使用表达式语言可以方便的访问jsp的隐含对象和javabeans组件,在jsp规范中,建议尽量使用表达式语言使jsp文件的格式一致,避免使用java脚本
语法: ${expression}
表达式语言的11个内置对象:
1. Pagecontext:代表该页面的pagecontext对象,与jsp的pagecontext内置对象相同
2. PageScope:用于获取page范围的属性值
3. RequestScope:用于获取request范围的属性值
4. SessionScope:用于获取session范围的属性值
5. ApplicationScope:用于获取application范围的属性值
6. Param:用于获取请求的参数值
7. ParamValues:用于获取请求的参数值,与param的区别在于该对象用于获取属性值为数组的属性值
8. Header:用于获取请求头的属性值
9. HeaderValues:用于获取请求头的属性值,与header的区别在于,该对象用于获取属性值为数组的属性值
10. InitParam:用于获取请求web应用的初始化参数
11. Cookie:用于获取指定的cookie值
开发表达式语言的子定义函数:
1.开发函数处理类:函数处理类就是普通类
|
|