jsp知识点

jsp是一种服务端动态页面技术的组件规范,jsp是一个以”.jsp”为后缀的文件,由HTML和少量java代码组成,JSP会被容器转换成一个Servlet类,然后执行。

转译成Servlet时,成为Servlet中的service()方法的out.write语句。

 

JSP指令

page指令:用于导包、设置页面属性。

<%@page import =”java.util.” %>

include指令:在JSP页面转换成Servlet时,能够将其他文件包含进来。可以包含JSP文件也可以是静态HTML文件。

<%@ include file=”url” %>   <%@include file=”footer.html”%>

 

JSP容器自动创建对象,可以直接使用,简化了对HTTP的请求和响应。

隐含对象                  类型                         说明

request               HttpServletRequest                请求信息

response              HttpServletResponse               响应信息

out                  JSPWriter                         输出的数据流

session               HttpSession                       会话

application            ServletContext                    全局上下文对象

pageContext           PageContext                      JSP页面上下文

page                 Object                           JSP页面本身

config                ServletConfig                     Servlet配置对象

exception             Throwable                       捕获网页异常

 

 

转发:一个Web组件(Servlet/jsp)将未完成的处理通过容器转发给另外一个Web组件继续完成。

转发的实现:

1绑定数据到request对象

2获得转发器

3转发

①绑定数据到request对象

request.setAttribute(String name,Object obj);

读取绑定值

Object request.getAttribute(String name);

绑定名对应的值不存在,则返回null。

②获得转发器

RequestDispatcher  rd=request.getRequestDispatcher(String uri);

uri为转发的目的地,即将未完成的处理继续下去的另一个组件,比如一个JSP文件

③实现转发

rd.forward(request,response);

②③合并:

request.getRequestDospatcher(uri).forward(request,response);

 

路径:

链接地址<a href=”url”> </a>

表单提交<form action=”url”>

重定向response.sendRedirect(url);

转发  request.getRequestDispatcher(url);

绝对路径为固定地址,相对路径以”/”开头 “../”退至上一级目录

获取应用的实际部署名称String request.getContextPath();

 

状态管理

将客户端与服务器之间的多次交互(一次请求,一次响应)当作一个整体来看,将多次交互涉及的数据保存下来即状态管理。状态指定的是数据,管理指的是多次交互时对数据的修改。

 

状态管理常见的两种模式为Cookie技术和Session技术

Cookie技术把状态保存在客户端,称为客户端状态管理技术。

Session技术把状态保存在服务器端,称为服务器状态管理技术。

 

Cookie

浏览器向Web服务器发送请求时,服务器会将少量的数据以set-Cookie消息头的方式发送给浏览器,浏览器将这些数据保存下来,当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。可以起到缓存和用户识别的作用。

创建Cookie:

Cookie c= new Cookie(String name,String value);

response.addCookie(c);

name用于区分不同Cookie,value则是Cookie的值。

 

获取所有Cookie:

Cookie [] request.getCookies();//该方法有可能返回null

 

获取一个Cookie对象的名称或值:

String Cookie.getName();

String Cookie.getValue();

 

修改Cookie的值:

setValue(String newValue);

 

添加描述:

setComment(String purpose);

getComment()方法可以在Cookie发送前获取描述信息。

 

设置Cookie有效期:

通过setMaxAge(int seconds)方法,设置Cookie的保存时间,seconds单位是秒,精度不高。

没有设置有效期,则默认为-1,浏览器关闭就删除Cookie

设置为0,则表示通知浏览器立即删除这个Cookie

 

设置Cookie的作用范围和域:

setPatch(String uri); uri设置网页路径有效范围。

setDomain(String patten);方法使Cookie作用于其他网站(不同域名)

 

Cookie的限制:

Cookie可以被用户禁止。

Cookie会将状态保存在浏览器端,不安全。对敏感数据需要加密后再使用Cookie来保存。

Cookie只能保存少量的数据,大约4KB左右

Cookie的个数是有限制的

Cookie只能保存字符串

 

Session(会话)

浏览器访问Web服务器时,服务器会为每一个浏览器在服务器端的内存中分配空间,单独创建一个Session对象,该对象有一个Id属性,其值唯一,一般称为SessionId,并且服务器会将这个SessionId(使用Cookie的方式)发送给浏览器;浏览器再次访问服务时,会将SessionId发送给服务器,服务器可以依据SessionId查找到对应Session对象。

 

Session获取:

HttpSession s=request.getSession(boolean flag);

当flag为true时,先查看请求中又没有SessionId,如果没有SessionId,服务器创建一个Session对象;如果有SessionId,依据SessionId查找对应Session对象,找到则返回,找不到则创建一个新的Session对象,所以flag为true时,一定能得到一个Session对象。

当flag为false时,没有SessionId及有SessionId但没有找到Session对象,均返回null;找到则返回

HttpSession s=request.getSession();

不管有没有找到都会返回一个Session对象.

 

使用Session绑定对象:

void Session.setAttribute(String name ,Object obj);

后去绑定对象:

Object Session.getAttribute(String name);

//需要进行数据类型转换,且必须和我们存入数据类型相同

移除绑定对象:

void Session.removeAttribute(String name);

 

删除Session对象:

Session.invalidate()

 

实现Session验证:

1.先绑定数据,绑定用户信息到Session中。

2.获取取绑定的数据,如果没有,则返回登录页面。

这样实现登录验证,来保证安全性。

 

 

Session超时

Web服务器会将空闲时间过长的Session对象删除,以节省服务器内存空间资源

web服务器缺省的超时时间限制一般为30分钟。

通过tomcat中conf/web.xml文件设置Session删除时限:

<session-config>

     <session-timeout>30</session-timeout>

</session-config>

通过编程的方式修改:

void session.setMaxInactiveInterval(int seconds);

 

浏览器禁用Cookie后可以通过重写URL的方法把SessionId传递给浏览器。

URL重写:

response.encodeURL(String url);

在重定向中URL重写:

response.encodeRedirectURL(String url);

 

Session的优缺点:

优点

安全(状态保存在服务器端)

Session能够保存的数据类型更丰富,Cookie只能保存字符串

Session能够保存更多的数据,Cookie大约保存4K

缺点

Session将状态保存在服务器端,占用服务器内存,如果用户量过大,会严重影响服务器的性能。

 

验证码验证的流程:

1请求带有验证码的页面时:

通过img标签的src属性获取验证码图片

服务器端生成随机字符串,并绘制

服务器端将生成的随机字符串绑定到session中

2提交表单及填写的验证码内容时:

处理程序将session中绑定的正确的验证码字符串取出来

获取表单提交时填写的验证码内容

比较两者,根据结果做出判断

 

 

过滤器

过滤器是用来拦截Servlet容器的请求和响应过程、以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。

过滤器用来封住一些Web组件的功能。

 

过滤器的创建:

编写一个java类实现Filte接口(Filter、FilterChain、FilterConfig)

该接口中包含三个必须实现的方法

void init(FilterConfig  filterConfig);

//完成过滤器的初始化,值执行一次

 

void doFilter( ServletRequest  request,

ServletResponse  response,

FilterChain      chain);

//容器调用doFilter方法处理请求

 

void  destroy()

//容器删除过滤器实例之前调用该方法

 

过滤器的部署

修改web.xml文件,增加注册过滤器的节点

<filter>

     <filter-name>filter1</filter-name>

     <filter-class>web.xxxServlet</Servlet-class>

     <init-param>

          <param-name>illegalStr</param-name>

          <param-value>xxx</param-value>

     </init-param>

</filter>

<filter-mapping>

     <filter-name>filter1</filter-name>

     <url-pattern>/xxx</url-pattern>

</filter-mapping>

 

<init-param>配置init()参数

用String config.getInitParamter(“illgalStr”)可以读取web.xml中的初始化参数

 

过滤器的优先级,如果多个过滤器都满足过滤条件,则容器依据</filter-mapping>

的先后顺序来调用各个过滤器。

 

监听器

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的时间并进行处理.

监听事件分为两类:生命周期相关事件、绑定数据相关事件。

 

生命周期相关事件

容器创建或者销毁request,session,ServletContext时产生的事件。

ServletRequestListener接口

   requestDestroyed(ServletRequestEvent sre);

   requestInitialized(ServletRequestEvent sre);

HttpSessionListener接口

   sessionCreated(HttpSessionEvent se);

   sessionDestroyed(HttpSessionEvent se);

ServletContextListener接口

  contextDestroyed(ServletContextEvent sce);

  contextInitialized(ServletContextEvent sce);

 

绑定数据相关事件

调用了request,session,ServletContext的setAttribute、removeAttribute方法时产生的事件

ServletResquestAttributeListener接口

  attributeAdded(ServletRequestAttributeEvent  srae);

  attributeRemoved(ServletRequestAttributeEvent srae);

  attributeReplaced(ServletRequestAttributeEvent srae);

HttpSessionAttributeListener接口

ServletContextAttributeListener接口

 

注册监听器

在web.xml文件中。增加一下节点:

<listener>

<listener-class>web.CouListener</listerner-class>

</listener>

 

统计在线人数,利用HttpSessionLisener

 

 

EL表达式

El表达式的作用可分为以下几类

1访问bean属性

2输出简单的运算结果

3获取请求参数

 

使用EL表达式访问bean属性

方式一:${对象名.属性名}

方式二:${对象名[“属性名”]}

EL表达式可以指定对象的查找范围。

例${sessionScope.user.name}

一旦指定了查找范围,那么在该范围找不到指定的绑定对象时,不会再去其他区域查找。

 

使用EL表达式在JSP中进行运算

1.算术运算符有五个:+、-、*或$、/或div、%或mod

2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge

3.逻辑运算符有三个:&&或and、||或or、!或not

4.其它运算符有三个:Empty运算符(检查变量是否为null)、条件运算符、()运算符

 

使用EL表达式获取请求参数值

${param.username} 等价于request.getParameter(“username”)

${paramValues.city} 等价于request.getParameterValues(“city”)

JSTL

JSTL是jsp标准标签库

JSTL的使用:

使用taglib指令导入要使用的jsp标签

<%@taglib uri=”” prefix=””%>

uri:JSP标签的命名空间 prefix:命名空间的前缀

 

核心标签-if标签

<c:if test=”” var=”” scope=””></c:if>

当test属性为true时,执行标签内容。test属性可以用EL表达式赋值。

var属性:指定一个绑定名称

scope属性:指定绑定的范围(page,request,session,application)

注:var和scope要配合使用

 

核心标签-choose标签

语法<c:choose>

       <c:when test=””> </c:when>

       <c:otherwise> </c:otherwise>

</c:choose>

when表示一个处理分支,当test属性为true时,会执行该分支。

otherwise表示例外,可以出现0次或1次

 

核心标签-forEach标签

用来遍历集合和数组

语法:<c:forEach var=”” item=””></c:forEach>

items属性:指定要遍历的集合,一般使用EL表达式复制

var属性:指定一个绑定名称,容器每次从集合中取一个对象,然后绑定到pageContext对象上

varStatus属性:指定一个绑定名称,绑定值是是一个由容器创建的对象,该对象封装了当前迭代的状态。

index返回正在被迭代对象的下标,下标从0开始

count返回时第几次迭代,从1开始

 

JSTL应用

使用JSTL时,JSP页面中部会再出现如下内容

<% =    %>     

<%     %>

替换形式

${     }

<c:xxx                >