目录

一、JSTL中的Core标签库

1.标签

2. 标签

二、Filter过滤器

1.什么是Filter

2.过滤器如何实现拦截?

3.Filter生命周期

1、Filter接口中三个重要的方法

2.Filter映射

1.使用通配符“*”拦截用户的所有请求

2.拦截不同方式的访问请求

3.Filter链

4.FilterConfig接口

三、使用Filter实现用户自动登录

四、使用Filter实现统一全站编码


一、JSTL中的Core标签库

1.<c:forEach>标签

在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个
<c:forEach>标签,该标签专门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容,它有两种语法格式,具体如下。
语法1:迭代包含多个对象的集合

<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>

语法2:迭代指定范围内的集合

<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin"

end="end" [step="step"]>
body content
</c:forEach>

  • var属性用于指定将当前迭代到的元素保存到page域中的名称。
  • items属性用于指定将要迭代的集合对象。
  • varStatus属性用干指定当前代状态信息的对象保存到page域中的名称。
  • begin属性用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始。如果没有指定items属性,就从begin指定的值开始迭代,直到迭代结束为止。
  • step属性用于指定迭代的步长,即迭代因子的增量。
  • <%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8" import="java.util.*"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <html>
    <head></head>
    <body><%String[] fruits = { "apple", "orange", "grape", "banana" };%>String数组中的元素:<br /><c:forEach var="name" items="<%=fruits%>">${name}<br /></c:forEach><%Map userMap = new HashMap();userMap.put("Tom", "123");userMap.put("Make", "123");userMap.put("Lina", "123");%><hr/>HashMap集合中的元素:<br /><c:forEach var="entry" items="<%=userMap%>">${entry.key}&nbsp;${entry.value}<br /></c:forEach>
    </body>
    </html>
    

    <c:forEach>标签的begin、end和step属性分别用于指定循环的起始索引、结束索引和步长。使用这些属性可以迭代集合对象中某一范围内的元素。

    <%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import="java.util.*"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <html>
    <head></head>
    <body>colorsList集合(指定迭代范围和步长)<br /><%List colorsList=new ArrayList();colorsList.add("red");colorsList.add("yellow");colorsList.add("blue");colorsList.add("green");colorsList.add("black");%><c:forEach var="color" items="<%=colorsList%>" begin="1" end="3" step="2">${color}&nbsp;</c:forEach>
    </body>
    </html>
    

  • count:表示元素在集合中的序号,从1开始计数。
  • index:表示当前元素在集合中的索引,从0开始计数。
  • first:表示当前是否为集合中的第1个元素。
  • last:表示当前是否为集合中的最后一个元素。 
    <%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import="java.util.*"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <html>
    <head></head>
    <body style="text-align: center;"><%List userList = new ArrayList();userList.add("Tom");userList.add("Make");userList.add("Lina");%><table border="1"><tr><td>序号</td><td>索引</td><td>是否为第一个元素</td><td>是否为最后一个元素</td><td>元素的值</td></tr><c:forEach var="name" items="<%=userList%>" varStatus="status"><tr><td>${status.count}</td><td>${status.index}</td><td>${status.first}</td><td>${status.last}</td><td>${name}</td></tr></c:forEach></table>
    </body>
    </html>
    

    2.<c:url> 标签

在访问一个JSP页面时,通常会在URL中传递一些参数信息。为了方便完成这种功能,Core
标签库中提供了一个<c:url>标签,该标签可以在JSP页面中构造一个新的地址,实现URL的重写。<c:url>标签有两语法格式,具体如下。
语法1:没有标签实体的情况

<c:url value="value" [context="context"] [var="varName"]
[scope="{page|request|session|application}"]>

语法2:有标签实体的情况,在标签体中指定构造URL参数

<c:url value="value"[context="context"] [var="varName"]
[scope="{page|request|session|application}"]>
<c:param>标签
</c:url>

  • value属性用于指定构造的URL。
  • context属性用于指定导入同一个服务器下其他Web应用的名称。
  • Var属性用于指定将构造的URL地址保存到域对象的属性名称。

scope属性用于指定将构造好的URL保存到域对象中。

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>使用绝对路径构造URL:<br /><c:url var="myURL" value="http://localhost:8080/chapter07/register.jsp"><c:param name="username" value="张三" /><c:param name="country" value="中国" /></c:url><a href="${myURL}">register.jsp</a><br />使用相对路径构造URL:<br /><c:url var="myURL" value="register.jsp?username=Tom&country=France" /><a href="${ myURL}">register.jsp</a>
</body>
</html>

二、Filter过滤器

1.什么是Filter

Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在
Servlet进行响应处理前后实现一些特殊功能。

注意:
过滤器是用来拦截请求和响应的,不能产生响应,而servlet是用来处理请求并产生响应的。

2.过滤器如何实现拦截?

1、当客户端发生请求后,在HttpServletRequest到达Servlet之前,过滤器拦截客户的HttpServletRequest
2、根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
3、在过滤器中调用doFilter方法,对请求放行。请求到达Servlet后,对请求进行处理并产生HttpServletResponse发送给客户端
4、在HttpServletResponse到达客户端之前,过滤器拦截HttpServletResponse
5、根据需要检查HttpServletResponse,可以修改HttpServletResponse头和数据
6、最后,HttpServletResponse到达客户端

3.Filter生命周期

1、Filter接口中三个重要的方法

  • init()方法:初始化参数,在创建Filter时自动调用,当我们需要设置初始化参数的时候,可以写到该方法中。
  • doFilter()方法:拦截到要执行的请求时,doFilter就会执行。这里面写我们对请求和响应的预处理
  • destory()方法:在销毁Filter时自动调用
  • package cn.itcast.chapter08.filter;
    import java.io.IOException;
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class MyFilter extends HttpServlet {private static final long serialVersionUID = 1L;public MyFilter() {}public void destroy() {}protected void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws  IOException, ServletException {response.setContentType("text/html;charset=utf-8");System.out.println("输出内容表示拦截了响应");response.getWriter().print("这是filter输出到网页的内容");if(true){chain.doFilter(request, response);}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

    在web.xml文件配置servlet

拦截MyServlet

package cn.itcast.chapter08.filter;import java.io.IOException;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyFilter extends HttpServlet {private static final long serialVersionUID = 1L;public MyFilter() {}public void destroy() {}protected void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws  IOException, ServletException {response.setContentType("text/html;charset=utf-8");System.out.println("输出内容表示拦截了响应");response.getWriter().print("这是filter输出到网页的内容");if(true){chain.doFilter(request, response);}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

在web.xml文件配置servlet

<filter><filter-name>MyFilter</filter-name><filter-class>cn.itcast.chapter08.filter.MyFilter</filter-class></filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/MyServlet</url-pattern></filter-mapping>

配置信息

(1)<filter>根元素用于注册一个Filter。
(2)<filter-name>子元素用于设置Filter名称。
(3)<filter-class>子元素用于设置Filter类的完整名称。
(4)<filter-mapping>根元素用于设置一个过滤器所拦截的资源。
(5)<filter-name>子元素必须与<filter>中的<filter-name>子元素相同。
(6)<url-pattern>子元素用于匹配用户请求的URL,例如“/MyServlet”,这个URL还可以使用通配符“*”来表示,例如“*.do”适用于所有以“.do”结尾的Servlet路径。

2.Filter映射

1.使用通配符“*”拦截用户的所有请求

Filter的<filter-mapping>元素用于配置过滤器拦截的资源信息,如果想让过滤器拦截所有的请求访问,那么需要使用通配符“*”来实现,具体示例如下。

<filter>
<filter-name>Filterl</filter-name>
<filter-class>cn.itcast.chapter08.filter.MyFilter</filter-class></filter>
<filter-mapping>
<filter-name>Filterl</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

2.拦截不同方式的访问请求

在 web.xml文件中,一个<filter-mapping>元素用于配置一个Filter所负责拦截的资源。<filter-mapping>元素中有一个特殊的子元素<dispatcher>,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,<dispatcher>元素的值共有4个,具体如下。
1) REQUEST
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的 include()或forward()方法访问的,那么该过滤器将不会被调用。
2) INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。
程序
除此之外,该过滤器不会被调用。
1下。
3) FORWARD
如果目标资源是通过RequestDispatcher的forward()方法访问的,那么该过滤器将被调用。
除此之外,该过滤器不会被调用。
如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。除此之外,过滤
4) ERROR
器不会被调用。

例 forwardservlet的servlet类用于将请求转发给first.jsp

package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ForwardServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {request.getRequestDispatcher("/first.jsp").forward(request,response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

建一个first.jsp页面

建过滤器forwardfilter对first.jsp页面进行拦截

配置过滤器映射信息

说明没有拦截到forwardservlet转发的first.jsp

需要添加一个<dispatcher>

3.Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个Filter链.

web服务器根据Filter在web.xml文件中的注册顺序<mapping>,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法.在doFilter方法中,开发人员如果调用了FilterChain对象doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第二个filter,如果没有,则调用目标资源.

注意:

1.FilterChain.doFilter(request,response)它代表的是向下执行,如果下一个还是filter,那么访问这个filter,如果当前filter已经是整个链的末尾,那么访问web资源.

2.Filter的顺序由<Filter-mapping>的配置顺序决定.

<url-pattern>有几种写法:

1.完全匹配    必须以"/"开始

2.可以使用*通配符

-->1.目录匹配        /a/*        /*        要求必须以"/"开始

-->2.扩展名匹配

*.do        *.action    要求,不能以"/"开始,要以*.XXX结束.

例 新建两个过滤器myfiltero1,myfiltero2

package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.*;
public class MyFilter01 implements Filter {public MyFilter01() {super();// TODO Auto-generated constructor stub}public void init(FilterConfig fConfig) throws ServletException {// 过滤器对象在初始化时调用,可以配置一些初始化参数}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用PrintWriter out=response.getWriter();out.write("Hello MyFilter01<br />");chain.doFilter(request, response);}public void destroy() {// 过滤器对象在销毁时自动调用,释放资源}
}
package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.Filter;
import javax.servlet.*;
public class MyFilter02 implements Filter {public void init(FilterConfig fConfig) throws ServletException {// 过滤器对象在初始化时调用,可以配置一些初始化参数}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用PrintWriter out=response.getWriter();out.write("MyFilter02 Before<br />");chain.doFilter(request, response);out.write("<br />MyFilter02 After<br />");    }public void destroy() {// 过滤器对象在销毁时自动调用,释放资源}
}

配置过滤器myfiltero1,myfiltero2映射

4.FilterConfig接口

为了获取 Filter程序在 web.xml文件中的配置信息,Servlet API提供了一个FilterConfig 接口,该接口封装了Fiter程序在web.xml中的所有注册信息,并且提供了一系列获取这些配置信息的方法

例 子

package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.*;
public class MyFilter03 implements Filter {public MyFilter03() {super();// TODO Auto-generated constructor stub}private String characterEncoding;FilterConfig fc;public void init(FilterConfig fConfig) throws ServletException {// 获取FilterConfig对象this.fc = fConfig;}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 输出参数信息characterEncoding=fc.getInitParameter("encoding");System.out.println("encoding初始化参数的值为:"+characterEncoding);chain.doFilter(request, response);}public void destroy() {}
}

配置过滤器myfilter03映射

三、使用Filter实现用户自动登录

1.编写user类

2.实现登录页面和首页

用于显示用户的登录信息。如果没有用户登录,在index.jsp页面中就显示一个用户登录的超链接。如果用户已经登录,在index.jsp页面中显示登录的用户名,以及一个注销的超链接

3.编写loginservlet用于处理用户的登录请求

注销用户登录

4。创建过滤器

该类用于拦截用户登录的访问请求,判断请求中是否包含用户自动登录的Cookie。如果包含,则获取Cookie中的用户名和密码,并验证用户名和密码是否正确。如果正确,则将用户的登录信息封装到User对象存入Session域中,完成用户自动登录

5.配置映射信息

在web.xml文件中,配置所有相关Servlet及AutoLoginFilter过滤器信息。由于要拦截用户访问资源的所有请求,因此,将过滤器<filter-mapping>元素拦截的路径设置为“/*”

6.运行项目

四、使用Filter实现统一全站编码

1.编写form.jsp

2.创建servlet

3.创建过滤器

4.配置映射信息

5.启动项目,测试结果

 

登录按钮实现登录使用的POST,可以解决中文乱码,单击超链接登录使用的GET,可以解决中文乱码

可以看出,GET方式提交表单与POST方式提交表单的效果是一样的,同样不会
出现乱码问题。因此,可以说明使用Fiter过滤器可以方便地完成统一全站编码的功能。

JavaWeb-10课Filter过滤器相关推荐

  1. (29) JavaWeb中使用filter过滤器拦截请求、权限检查,过滤响应。

    Filter 过滤器 一.Filter 什么是过滤器 二.Filter 过滤器的使用步骤: 三.Filter 的生命周期 四.FilterConfig 类 五.FilterChain 过滤器链 六.F ...

  2. java p41——Filter过滤器

    javaweb/day07|day08 Filter过滤器 使用步骤 要点 FilterChain 多个过滤器顺序 FilterConfig获得初始化参数 功能-作用 案例--自动登录实现 案例--装 ...

  3. JavaWeb三大组件之一——Filter过滤器源码解析(全面手撕Filter源码,需要耐心看完)

    什么是Filter? 本文所说的Filter是JavaWeb中常见常使用的过滤器.Filter的作用是拦截前端发送给后端的请求,一般是用于权限过滤.日志记录.图片转换.加密.数据压缩等操作. 大致流程 ...

  4. JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别

    JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别 如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param–>lis ...

  5. javaweb(11) Listener监听器与Filter过滤器

    javaweb(11) Listener监听器与Filter过滤器 Listener监听器 什么是Listener监听器 Listener 监听器它是 JavaWeb 的三大组件之一.JavaWeb ...

  6. java项目配置过滤器_在JavaWeb项目中如何正确的使用Filter过滤器

    在JavaWeb项目中如何正确的使用Filter过滤器 发布时间:2020-11-11 17:12:00 来源:亿速云 阅读:79 作者:Leah 这期内容当中小编将会给大家带来有关在JavaWeb项 ...

  7. (JavaWeb)Filter过滤器

    Filter过滤器 Filter:过滤器,用来过滤网站的数据. 自动登录 统一设置编码格式 访问权限控制 敏感字符过滤等 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或serv ...

  8. 10——Filter过滤器

    JSTL中的Core标签库: <c:forEach>标签: 在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个 <c:forEach>标签,该标 ...

  9. javaweb项目Filter过滤器详解

    Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...

最新文章

  1. Google学术分析公司科研实力:谷歌1161,华为110,为何差10倍?
  2. ubuntu18.04配置wifi 方法
  3. Linux共享内存编程实例
  4. 百度世界-“框天地”
  5. mysql报4934_mysql-Mariadb语法错误1064(42000)
  6. 【模板】最大密度子图
  7. 单E1光端机,V.35光端机,以太网光端机介绍及技术指标详解
  8. 只读属性怎么来的初值_设置Mysql表只读,关键时刻或许能救你一命
  9. 【USACO1.1】Broken Necklace
  10. 从大哥大到iPhone13,谈谈移动网络发展
  11. Android:ViewPager
  12. 消息队列 (1) mac安装RabbitMQ
  13. visual studio html插件,实用的 Visual Studio Code 插件
  14. 如何正确地将Blender模型导入进Unity3D
  15. usb扫描枪驱动下载 wince_常用扫描枪驱动
  16. STM32F103C8T6 USART2 配置
  17. 负数求余简单技巧(C语言)
  18. 你以为国人的数学很好?实际上数学思维特别差
  19. 2019世界人工智能大会
  20. gunicorn工作原理

热门文章

  1. 宏观经济及贵金属年报:经济温和复苏,金银宽幅震荡-20210104.PDF
  2. matlab获取地图边界,科学网—提取百度地图县域的矢量边界 - 张乐乐的博文
  3. 乐乐的计算题目+题解
  4. html文本转成二进制,肿么把文本文件转换成二进制bin文件
  5. 博仲兴业力作——《爱的雨季》讲述爱情的奥秘
  6. 使用Python解密仿射密码
  7. 数据可视化图表类型_数据可视化中12种最常见的图表类型
  8. Jetpack Room基本用法
  9. mysql phpwind_PHPWind环境搭建(Linux)
  10. Rviz显示不出数据了之一文搞懂Qos