JSP技术的总结

来源:互联网 发布:淘宝店铺邮费怎么设置 编辑:程序博客网 时间:2024/06/05 18:58

JSP概述

JSP(Java Server Page)和Servlet是JavaEE规范的两个基本成员。
JSP和Servlet的本质一样。
JSP慢慢发展成单一的表现层技术,不再承担业务逻辑组件及持久层组件的责任。


Web应用和web.xml文件

1、构建Web应用

<webDemo>---这是Web应用的名称,可以改变|--WEB-INF|      |-classes(保存单个*.class文件)|      |-lib(保存打包后的JAR文件)|      |-web.xml——配置描述符|-<a.jsp>——此处可存放任意多个JSP页面

JSP的4种基本语法

1、JSP注释:<%--注释内容--%> HTML注释:<!--注释内容-->
JSP注释不会发送到客户端
2、JSP声明:<%!声明部分%>
JSP页面的声明部分将转换成对应的Servlet成员变量或方法
3、输出JSP 表达式:<%=表达式>
4、JSP脚本:<% %>
所有可执行Java代码都可通过JSP脚本嵌入HTML页面
JSP脚本里不能定义方法

JSP的3个编译指令

JSP的编译指令是通知JSP引擎的处理消息

page:针对当前页面的指令
include:用于指定包含另一个页面
taglib:用于定义和访问自定义标签

编译指令语法:<%@编译指令 属性名=:"属性值"...%>
1、page指令

extends:指定JSP页面编译所产生的Java类所继承的父类,或所实现的接口
import、session、buffer、errorPage、isErrorPage、language、autoFLush
info:设置该JSP程序的信息,可以看做为说明,在JSP页面中,调用getServletInfo()方法获取该值
contentType:用于设定生成网页的文件格式和编码字符集。

2、include指令:<%@include file="relativeURLSpec"%>
静态的include语句:包含页面在编译时将完全包含了被包含页面的代码

JSP的7个动作指令

运行时的动作
与编译指令区别:编译指令在将JSP编译成Servlet时起作用,而处理指令通常可替换成JSP脚本,是JSP脚本的标准化写法。

jsp:forward:执行页面转向,将处理请求的处理转发到下一个页面
jsp:param:用于参数传递,必须与其他支持参数的标签一起使用
jsp:include:动态引入一个JSP页面
jsp:plugin:下载JavaBeann或Applet到客户端执行
jsp:useBean:创建一个JavaBean的实例
jsp:serProperty:设置JavaBean实例的属性值
jsp:getProperty:输出JavaBean实例的属性值

1、jsp:forward:

<jsp:forword page="{relativeURL|<%=expression%>}"> {<jsp:param.../>}</jsp:forward>

执行forward指令时,用户请求的地址依然没有发生改变
2、include指令:

">      <jsp:param name="parameterName" value="patameterValue"/>   </jsp:include>

静态导入和动态导入的区别
(1)静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Serlvet;动态导入则在Serlvet中使用include方法来引入被导入页面的内容
(2)静态导入时被导入页面的编译指令会起作用;动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容
(3)动态包含可以增加参数

forward与include区别
forward拿目标页面代替原有页面,include则拿目标页面插入原有页面

3、useBean、setProperty、getProperty指令
useBean:
<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
setProperty:<jsp:setProperty name="BeanName" property="propertyName" value="value"/>
getProperty:<jsp:getProperty name="BeanName" property="propertyName"/>

JSP脚本中的9个内置对象

9个内置对象都是ServletAPI接口的实例,它们已经是对象,可以直接使用

application:JSP所属的Web应用本身
config:JSP的配置信息(JSP页面通常无需配置)
exception:代表其他页面中的异常和错误
out:JSP页面的输出流
page:页面本身
pageContext:代表JSP页面的上下文
request:封装了一次请求,客户端的请求参数都被封装在该对象里
response:代表服务器对客户端的相应
session:代表一次会话。客户端浏览器与站点建立连接,会话开始。客户端关闭浏览器时,会话结束

JSP内置对象的 实质:_jspService*()方法的形参(request、response),或局部变量。所以只能在JSP脚本,JSP输出表达式中使用,不能在声明中使用(会找不到变量)

1、application对象
在整个Web应用的多个JSP、Servlet之间共享数据
访问Web应用的配置参数
(1)多个JSP、Servlet共享数据
通过setAttribute(String attrName,Object value)方法将一个值设置成application的attrName属性,对整个Web应用有效,访问该属性方法:getAttribute(String attrName)
(2)获得Web应用配置参数(web.xml)getInitParameter(String paramName)和getInitParameter()

2、config对象
当前JSP配置信息,较少使用该对象,config是ServletConfig的实例,获取配置参数:getInitParameter(String paramName)

3、exception对象
exception对象是Throwable的实例
JSP的异常处理机制对JSP声明不起作用

4、out对象
代表一个页面输出流
<%=…%>表达式的本质就是out.write(…);

5、pageContext对象
作用:访问JSP之间的共享数据,可以访问page、request、session、application范围的变量
(setAttribute)getAttribute(String name):取得page范围内的name属性
getAttribute(String name,int scope):取得指定范围内name属性,
scope:PageContext.Page_SCOPE/REQUEST_SCOPE/SESSION/APPLICATION
getAttributesScope(String)返回变量所在的生存范围
可以通过pageContext对象获取其他内置对象(getRequest()/getResponse()/getServletConfig()/getServletContext()/getSession())

6、request对象
(1)获取请求头/请求参数
Web应用是请求/响应架构
request是HttpServletRequest接口的实例
方法:

String getParameter(String paramName):获取paramName请求参数的值
Map getParameter():获取所有请求参数名和参数值所组成的Map对象
Enumeration getParameterNames():获取所有请求参数名所组成的Enumeration对象
String[]getParameterValues(String name):paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组

HttpServletRequest所提供访问请求头的方法

String getHeader(String name):根据指定请求头的值
java.util.EnumerationgetHeaderNames():获取所有请求头的名称
java.util.EnumerationgetHeaders(String name):获取指定请求头的多个值
int getIntHeader(String name):获取指定请求头的值,并将该值转为整数值

请求头:通常由浏览器自动添加,一次请求总是包含若干请求头
请求参数:需要开发人员控制添加,让客户端发送请求参数通常分两种情况。

GET方式的请求:在浏览器地址栏输入访问地址所发送的请求/提交表单发送请求时,form元素没有设置method属性,或method属性为get,请求数据量较小,一般不大于2kb
POST方式的请求:通常使用提交表单的方式,method属性为post。数据量更大,安全性相对较高(地址栏看不到请求参数值)

表单中有name属性的表单域才生成请求参数
若多个表单域有相同的name属性,则多个表单域只生成一个请求参数,只是该参数有多个值
POST:若请求参数中包含非西欧字符,则必须在获取请求参数之前先调用setCharacterEncoding()方法设置编码的字符集

GET:若请求参数包含非西欧字符

String rawName=request.getParameter("name");byte[] rawBytes=rawName.getBytes("ISO-8859-1");//将请求参数值使用IOS-8859-1分解成字节数组String name=new String(rawBytes,"UTF-8");//将字节数组重新编码成字符串

(2)操作request范围的属性
HttpServletRequest包含如下方法,用于设置和获取request范围的属性

setAttribute(String attName,Object attValue):将attvalue设置成request范围的属性
Object getAttribute(String attName):获取request范围的属性

(3)执行forward或include
方法:**getRequestDispatcher(String path) path必须以斜线开头(“/a.jsp”)**path为forward和include的目标路径,返回RequestDispatcher,该对象两个方法:

forward(ServletRequest request,ServletResponse response):执行forward
include(ServletRequest request,ServletResponse response):执行include

7、response对象
代表服务器对客户端的响应
(1)response响应生成非字符响应(图、PDF…)
方法:getOutputStream()方法,返回响应输出字节流
(2)重定向
与forward区别:丢失所有请求参数和request范围的属性
方法:sendRedirect(String path)执行redirect后生成第二次请求,URL改变
(3)增加Cookie
Cookie通常用于网站记录客户的某些信息
与session区别:session会随浏览器关闭而失效,Cookie会一直存放在客户端机器上。=
方法:void addCookie(Cookie cookie):增加Cookie
步骤:

创建Cookie实例,Cookie的构造器为Cookie(String name,String value)
设置Cookie的生命期限Cookie.setMaxAge()
向客户端写Cookie

客户端Cookie使用request对象,提供了getCookies()方法,返回Cookie数组
获得参数值:Cookie.getValue();
值为中文的Cookie需要借助 java.net.URLEncoder.encode(“中文”,”编码字符集”)先对中文字符进行编码,编码后的结果设为Cookie,读取Cookie,应先读取,再使用 java.net.URLEncoder.encode(cookie.getValue())对其进行解码

8、Session对象
一次会话含义:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止
session通常用于跟踪用户的会话信息,可以在多个页面的跳转之间共享
session对象是HttpSession的实例,方法:

setAttribute(String attName,Object attValue):设置session范围内attName属性的值
getAttribute(String attName):返回session范围内attName属性的值

session机制通常用于保存客户端的状态信息,需要保存到Web服务器的硬盘上,session里的属性值必须是可序列化的,否则将会引起不可序列化的异常(session属性值可以使任何可序列化的Java对象