JSP
本质是Servlet,(一个特殊的java类)---响应用户请求
Servlet开发:
包含包含大量文本及格式,静态的HTML标签,所有布局,色彩,图像等都耦合在java代码中,效率低下
Jsp弥补这些不足。
Jsp组成:
静态部分:标准的html标签,静态页面内容,这些内容与静态html页面相同。
动态部分:java程序
Jsp页面工作原理结论:
1.Jsp文件必须在jsp服务器内运行
2.Jsp文件必须生成servlet才能执行
3.每个jsp页面的第一个访问者速度会有点慢,因为需要等待jsp编译成servlet。
4.Jsp页面的访问者无须安装任何客户端,因为jsp页面输送到客户端的是标准html页面。
JSP的四种基本语法:
Jsp注释:
<%--注释内容--%>
Jsp声明:
<%! 声明部分 %>
Jsp输出表达式:
<%=表达式%>
Jsp小脚本:
<%java代码%>
Jsp三个编译指令:
通过jsp引擎的消息,不能直接生成输出,编译指令都有默认值
在将jsp编译成servlet时起作用
使用编译指令语法格式:
<%@编译指令名 属性名=”属性值”...%>
- Page指令:
针对当前页面的指令,通常位于jsp页面顶端,一个jsp页面可以有多条page指令
属性:
language,extends,import,session,buffer,autoFlush,errorPage,info…
- Include指令:
可以将一个外部文件嵌入到当前jsp文件中,同时解析这个文件中的jsp语句,
这是个静态的include语句,会把目标页面的其它编译指令也包含进来,动态的include则不会
静态include
会将被包含的页面加入本页面,融合成一个页面,因此被包含甚至不需要是一个完整页面,语法格式:
<%@include file=”relativeURLSpec”%>
动态include:
如果被嵌入文件经常需要改变,建议使用<jsp:include>
- Taglib指令:
定义和访问自定义标签
Jsp7个动作指令:
动作指令是运行时的动作
1.forward指令:
将页面响应转发到另外的页面
语法:
<jsp:forward page=”{relativeURL|<%=expression%>}”>
{<jsp:param …/>}
</jsp:forward>
增加的请求参数值可以通过HttpServletRequest类的getParameter()方法获取。
*<jsp:forward…/>并没有重新向新页面发送请求,完全采用一个新页面对用户生成响应—请求依然是一次请求,即请求参数,请求属性都不会丢失。
2.Include指令:
动态include指令,仅仅将被导入页面的body内容插入本页面
语法格式:
<jsp:include page=”{relativeURL|<%=expression%>}” flush=”true”>
{<jsp:param name=”” value=””/>}
</jsp:include>
Flush用于指定输出缓存是否转移到被导入的文件中
True:包含在被导入文件中
False:包含在原文件中
增加的请求参数值可以通过HttpServletRequest类的getParameter()方法获取。
*静态导入和动态导入区别:
*静态导入是将被导入页面代码完全融入,两个页面融合成一个整体servlet
,而动态导入则在servlet中使用include方法来引入被导入页面的内容
*动态导入还可以增加额外的参数
**forward拿目标页面代替原有页面,include的页面只是插入原有页面**
3.useBean,setProperty,getProperty指令:
三个指令都与javaBean相关的指令
a).userBean用于jsp页面中初始化一个java实例
语法格式:
<jsp:useBean id=”a” class=”..” scope=”page|request|session|application />
Id:实例名 class:实现类 scope:作用范围
Page:该javaBean实例仅在本页面有效
Request: 该javaBean实例仅在本次请求有效
Session: 该javaBean实例仅在本次session有效
Application: 该javaBean实例在本应用内有效
b).setProperty用于为javaBean实例的属性设值
语法格式:
<jsp:setProperty name=”a” property=”..” value=”..”/>
Name:确定需要设定javaBean的实例名
Property:确定需要输出的属性名
Value:确定需要设置的属性值
c).getProperty用于输出javaBean实例的属性
语法格式:
<jsp:getProperty name=”a” property=”..” />
Name:确定需要输出javaBean的实例名
Property:确定需要输出的属性名
4.plugin指令:
用于下载服务器端的javaBean或Applet到客户端执行
5.param指令:
设置参数值,不能单独使用可以结合以下三个指令是用:
Jsp:include,jsp:forward,jsp:plugin
jsp脚本9个内置对象
application,config,exception,out,page,pageContext,request,response,session
这9个内置对象都是Servlet API接口实例
由jsp页面对应Servlet的_jspService()方法来创建这些实例
即它们已经是对象可以直接使用,只能在jsp小脚本,jsp输出表达式中使用这些内置对象
1. application:
a) javax.servlet.ServletContext的实例
b) 该实例代表jsp所属的web应用本身,可用与jsp页面,或者在Servlet之间交换信息。
作用:
在整个web应用的多个jsp,servlet之间共享数据
在application里通常放入web应用状态数据
访问web应用配置参数
方法:
属性设值:setAttribute(String attrName,Object value)
获取属性值:getAttribute(String attrName)
获取配置参数:getInitParameter(String paramName)
配置参数应该在web.xml文件中使用context-param元素配置,对整个web应用有效
<context-param>
<param-name>web参数名</ param-name>
<param-value> web参数值</param-value>
</context-param>
2. config:
a) javax.servlet.ServletConfig的实例
b) 该实例代表jsp配置信息
方法:
获取配置参数:getInitParameter(String paramName)
Web.xml内:
<servlet>
<init-param>
<param-name>web参数名</ param-name>
<param-value> web参数值</param-value>
</init-param>
</servlet>
如果希望jsp页面可以获取web.xml配置文件中的配置信息,必须通过为该jsp配置路径来访问页面
<servlet-mapping>
<!—指定a servlet配置到/b路径-->
<servlet-name>a</servlet-name>
<servlet-pattern>/b</servlet-pattern>
</servlet-mapping>
3. exception:
a) java.lang.Throwable的实例
b) 代表其他页面中的异常和错误
Jsp脚本和静态html部分将转换成_jspService()方法里执行性代码,已经处于try…catch中,所以无需在处理异常
但jsp声明部分依然需要处理异常
通过page指令的errorPage属性指定异常处理页面a
将异常处理页面a中page指令中的isErrorPage属性设置为true,才可以访问exception内置对象
4. out:
a) javax.servlet.jsp.JspWriter的实例
b) 代表jsp页面输出流
<%=..%>表达式本质就是out.print(..)
所以使用out地方都可以使用输出表达式代替,更加简洁
5. page:
a) 代表页面本身,也就是Servlet中的this
6. pageContext:
a) javax.servlet.jsp.PageContext实例
b) 代表jsp页面上下文,使用该对象可以访问页面中的共享数据。
c) 还可以用于获取其他内置对象
提供如下两个方法访问page,request,session,application范围变量:
getAttribute(String name):取得page范围内name属性
getAttribute(String name,int scope): 取得指定范围内name属性
scope可以是:
PageContext.PAGE_SCOPE, PageContext.REQUEST_SCOPE,
PageContext.SESSION_SCOPE,PageContext.APPLICATION_SCOPE
7. request:
a) javax.servlet.http.HttpServletRequest的实例
b) 该对象封装一次请求,客户端的请求参数都被封装在该对象里
c) Request可代表本次请求范围,所以还可用于操作request范围的属性
功能:
获取请求头/请求参数
请求头和请求参数都是由用户发送到服务器的数据,
请求头通常由浏览器自动添加,一次请求总是包含若干请求头,
请求参数则由开发人员添加,让客户端发送请求参数两种情况:
Get方式:
对应form的method属性没有设置或者get
Get请求会将请求参数的名和值转换成字符串,并附加在原URL后,
在地址栏中可以看到请求参数名和值,传送数据一般不大于2kB
Post方式:
对应form的method属性为post
传送数据量大,安全性高
*********************************************************************************
1. 每个有name属性的form表单域对应一个请求参数
2. 如果多个表单域有相同的name属性,则多个表单域只有一个请求参数,只是该参数有多个值
3. 表单域的name属性指定请求参数名,value指定请求参数值
4. 如果某个表单域设置了disabled=“disabled”属性,则该表单域不在生成请求参
*********************************************************************************
操作request范围的属性
SetAttribute(String attName,Object attValue):
将attvalue设置成为request范围的属性
Object getAttribute(String attName):
获取request范围的属性
Request对象亦可以执行forward或include
8. response:
a) javax.servlet.http.HttpServletReponse的实例
b) 代表服务器对客户端的响应,但一般用out输出字符流
Request响应生成非字符响应
c) Reponse对象常用于重定向
会丢失所以请求参数和request范围属性,将生成第二次请求
d) 增加cookie
Session会随浏览器关闭而失效,cookie一直存在客户端机器上,直到超出生命周期
Cookie中出现中文字符方法:
借助java.net.URLEncoder先对中文字符串进行编码,将编译后结果设为cookie值
9. session:
a) javax.servlet.http.HttpSession的实例
b) 该对象代表一次会话
会话:
从客户端浏览器连接服务器开始直到断开为止
Session范围内的属性可以在多个页面的跳转之间共享,
Session机制通常保存客户端状态信息,这些状态信息保存到web服务器的硬盘上,即session里属性值必须是可以序列化的
如果为了两个页面交换信息,可以放入request范围内,然后forward
Jsp自定义标签
- 开发自定义标签处理类
- 继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport
- 如果标签类包含属性,每个属性都有对应的getter和setter方法
- 重写doTag()方法,这个方法负责生成页面内容
- 建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库可包含多个标签
- Tld(tag library definition)即标签库定义
- 标签库定义文件的根元素是taglib
- Taglib子元素:tlib-version,short-name,uri,
- Taglib下可以包含多个tag元素(标签元素)
- Tag子元素:name,tag-class,body-content,dynamic-attributes
- 对于有属性的标签,用<tag../>子元素<attribute../>定义一个属性标签
- <attribute../>子元素:name,required,fragment
- 在jsp文件中使用自定义标签
- 导入标签库,使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来
- <%@ taglib uri=”tagliburi” prefix=”tagPrefix” %>
- Uri定位标签库 prefix指定标签库前缀
-
-
使用标签,在jsp页面中使用自定义标签
<tagPrefix:tagName tagAttribute=”tagValue”…>
<tagBody />
</tagPrefix:tagName>
-
动态属性标签
标签处理类额外实现DynamicAttributes接口
配置标签时通过<dynamic-attributes../>子元素指定该标签支持动态属性
以页面片段作为属性的标签
标签处理类中定义类型为jspFragment的属性,该属性代表页面片段
使用标签时,通过<jsp:attribute../>动作指令为标签属性指定值
Tag file支持
使用tag file可以无须定义标签处理类和标签库文件
Tag建立标签步骤:
建立tag文件,tag文件有taglib,include,tag,attribute,variable指令
在jsp中使用标签
导入标签库
<%@taglib prefix=”tagPrefix” tagdir=”path”%>
每个tag flie对应一个标签
使用标签
<tags:tagName …./>
Tag内置对象:request,response,session,application,config,out
- 导入标签库,使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来