JSP入门

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脚本通过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

  1. 创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。

    // 名称和值中不能包含空格以及[ ] ( ) = , " / ? @ : ;
    Cookie cookie = new Cookie("key","value");
    
  2. 设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。

    cookie.setMaxAge(60*60*24); 
    
  3. 将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。


你可能感兴趣的:(javaweb)