JSP
- JSP
- JSP概念
- JSP处理
- JSP生命周期
- JSP编译
- JSP初始化
- JSP执行
- JSP清理
- JSP语法
- 脚本程序
- JSP声明
- JSP表达式
- JSP指令
- JSP常量
- JSP隐式对象
- JSP请求
- JSP post方法
- JSP 读取表单数据
- JSP过滤器
- Servlet过滤器方法
- webxml文件中的JSP过滤器映射
- webxml配置各节点说明
- JSP Cookie
- Servlet Cookies方法
- 使用JSP设置Cookies
- 使用JSP读取Cookies
- 使用JSP删除Cookies
- JSP Session
- JSP Session方法
- 删除Session数据
JSP概念
JSP处理
- 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
- Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
- JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
- JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
- Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
- Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
- 最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。
JSP生命周期
- 编译阶段:
servlet容器编译servlet源文件,生成servlet类
- 初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
- 执行阶段:
调用与JSP对应的servlet实例的服务方法
- 销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
JSP编译
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
- 解析JSP文件。
- 将JSP文件转为servlet。
- 编译servlet。
JSP初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了
public void jspInit(){
}
JSP执行
当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。
_jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数
void _jspService(HttpServletRequest request,
HttpServletResponse response)
{
}
_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。
JSP清理
jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写
jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。
public void jspDestroy()
{
}
JSP语法
脚本程序
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式
<% 代码片段 %>
JSP声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
JSP声明的语法格式:
<%! declaration; [ declaration; ]+ ... %>
JSP表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
JSP表达式的语法格式:
<%= 表达式 %>
JSP指令
JSP指令用来设置与整个JSP页面相关的属性。
JSP指令语法格式:
<%@ directive attribute="value" %>
指令 |
描述 |
<%@ page … %> |
定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> |
包含其他文件 |
<%@ taglib … %> |
引入标签库的定义,可以是自定义标签 |
JSP常量
- Boolean:true and false
- Integer:与Java中的一样
- Floating point:与Java中的一样
- String:以单引号或双引号开始和结束。 ” 被转义成 \”,’被转义成 \’, \ 被转义成\
- Null:null
JSP隐式对象
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
对象 |
描述 |
request |
HttpServletRequest类的实例 |
response |
HttpServletResponse类的实例 |
out |
PrintWriter类的实例,用于把结果输出至网页上 |
session |
HttpSession类的实例 |
application |
ServletContext类的实例,与应用上下文有关 |
config |
ServletConfig类的实例 |
pageContext |
PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page |
类似于Java类中的this关键字 |
Exception |
Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
JSP请求
JSP post方法
一些敏感信息,如密码等我们可以通过POST方法传递,post提交数据是隐式的。
JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。
JSP 读取表单数据
- getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
- getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkobx类型
- getParameterNames():该方法可以取得所有变量的名称,该方法返回一个Emumeration(枚举)。调用hasMoreElements方法来确定何时停止使用nextElement方法来获取每个参数的名称
- getInputStream():调用此方法来读取来自客户端的二进制数据流。
JSP过滤器
过滤器将会被插入进web.xml文件中,然后映射servlet、JSP文件的名字,或URL模式。部署描述文件web.xml可以在 < Tomcat-installation-directory >\conf 目录下找到。
当JSP容器启动网络应用程序时,它会创建每一个过滤器的实例,这些过滤器必须在部署描述文件web.xml中声明,并且按声明的顺序执行。
Servlet过滤器方法
一个过滤器就是一个Java类,它实现了javax.servlet.Filter 接口。javax.servlet.Filter接口定义了三个方法:
- public void doFilter (ServletRequest, ServletResponse, FilterChain)
每当request/response要通过过滤链时容器会调用这个方法,因为客户端请求链尾的资源
- public void init(FilterConfig filterConfig)
容器调用这个方法来表明一个过滤器被安置在服务中
- public void destroy()
容器调用这个方法来表明一个过滤器正在从服务中移除
web.xml文件中的JSP过滤器映射
过滤器被定义,然后映射成一个URL或JSP文件名,与servlet被定义然后映射的方式差不多。在部署描述文件web.xml中,使用< filter >标签来进行过滤器映射:
<filter>
<filter-name>LogFilterfilter-name>
<filter-class>LogFilterfilter-class>
<init-param>
<param-name>test-paramparam-name>
<param-value>Initialization Paramterparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>LogFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
上述过滤器将会应用在所有servlet和JSP程序中,因为我们在配置中指定了” /*”。您也可以指定一个servlet或JSP路径,如果您只想要将过滤器应用在少数几个servlet或JSP程序中的话。
现在,像平常一样访问servlet或JSP页面,您就会发现服务器日志中产生了关于此次访问的记录。您也可以使用Log4J.xml记录器来把日志记录在其它文件中。
web.xml配置各节点说明
- < filter >指定一个过滤器。
- < filter-name >用于为过滤器指定一个名字,该元素的内容不能为空。
- < filter-class >元素用于指定过滤器的完整的限定类名。
- < init-param >元素用于为过滤器指定初始化参数,它的子元素< param-name >指定参数的名字,< param-value >指定参数的值。
- 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
- < filter-mapping >元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
- < filter-name >子元素用于设置filter的注册名称。该值必须是在< filter >元素中声明过的过滤器的名字
- < url-pattern >设置 filter 所拦截的请求路径(过滤器关联的URL样式)
- < servlet-name >指定过滤器所拦截的Servlet名称。
- < dispatcher >指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个< dispatcher >子元素用来指定 Filter 对资源的多种调用方式进行拦截。
- < dispatcher >子元素可以设置的值及其意义
- REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过 - RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
- INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
- FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
- ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
JSP Cookie
JSP脚本通过request对象中的getCookies()方法来访问这些cookies,这个方法会返回一个Cookie对象的数组。
Servlet Cookies方法
- public void setDomain(String pattern)
设置cookie的域名,比如w3cschool.cn
- public String getDomain()
获取cookie的域名,比如w3cschool.cn
- public void setMaxAge(int expiry)
设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间
- public int getMaxAge()
获取cookie有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止
- public String getName()
返回 cookie的名称,名称创建后将不能被修改
- public void setValue(String newValue)
设置 cookie的值
- public String getValue()
获取cookie的值
- public void setPath(String uri)
设置cookie 的路径,默认为当前页面目录下的所有URL,还有此目录下的所有子目录
- public String getPath()
获取cookie 的路径
- public void setSecure(boolean flag)
指明cookie是否要加密传输
- public void setComment(String purpose)
设置注释描述 cookie的目的。当浏览器将cookie展现给用户时,注释将会变得非常有用
- public String getComment()
返回描述cookie目的的注释,若没有则返回null
使用JSP设置Cookies
创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。
// 名称和值中不能包含空格以及[ ] ( ) = , " / ? @ : ;
Cookie cookie = new Cookie("key","value");
设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
cookie.setMaxAge(60*60*24);
将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP响应头中添加cookies。
response.addCookie(cookie);
使用JSP读取Cookies
想要读取cookies,您就需要调用request.getCookies()方法来获得一个javax.servlet.http.Cookie对象的数组,然后遍历这个数组,使用getName()方法和getValue()方法来获取每一个cookie的名称和值。
使用JSP删除Cookies
删除cookies非常简单。如果您想要删除一个cookie,按照下面给的步骤来做就行了:
- 获取一个已经存在的cookie然后存储在Cookie对象中
- 将cookie的有效期设置为0
- 将这个cookie重新添加进响应头中
JSP Session
JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。
默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:
<%@ page session="false" %>
JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。
JSP Session方法
- public Object getAttribute(String name)
返回session对象中与指定名称绑定的对象,如果不存在则返回null
- public Enumeration getAttributeNames()
返回session对象中所有的对象名称
- public long getCreationTime()
返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
- public String getId()
返回session对象的ID
- public long getLastAccessedTime()
返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
- public int getMaxInactiveInterval()
返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
- public void invalidate()
将session无效化,解绑任何与该session绑定的对象
- public boolean isNew(
返回是否为一个新的客户端,或者客户端是否拒绝加入session
- public void removeAttribute(String name)
移除session中指定名称的对象
- public void setAttribute(String name, Object value)
使用指定的名称和值来产生一个对象并绑定到session中
- public void setMaxInactiveInterval(int interval)
用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效
删除Session数据
移除一个特定的属性:
调用public void removeAttribute(String name) 方法来移除指定的属性。
删除整个会话:
调用public void invalidate() 方法来使整个session无效。
设置会话有效期:
调用 public void setMaxInactiveInterval(int interval) 方法来设置session超时。
登出用户:
支持servlet2.4版本的服务器,可以调用 logout()方法来登出用户,并且使所有相关的session无效。
配置web.xml文件:
如果使用的是Tomcat,可以向下面这样配置web.xml文件:
<session-config>
<session-timeout>15session-timeout>
session-config>
超时以分钟为单位,Tomcat中的默认的超时时间是30分钟。
Servlet中的getMaxInactiveInterval( ) 方法以秒为单位返回超时时间。如果在web.xml中配置的是15分钟,则getMaxInactiveInterval( ) 方法将会返回900。