IDEA项目实践——会话跟踪、Web当中的jsp编程以及jsp开发模型和EL与JSTL以及过滤器介绍

news2024/12/25 18:02:03

系列文章目录 

IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

IDEWA项目实践——mybatis的一些基本原理以及案例

IDEA项目实践——动态SQL、关系映射、注解开发

IDEA项目实践——Spring框架简介,以及IOC注解

IDEA项目实践——Spring当中的切面AOP

IDEA项目实践——Spring集成mybatis、spring当中的事务

IDEA项目实践——JavaWeb简介以及Servlet编程实战

文章目录

系列文章目录 

 三、会话跟踪

3.1 Cookie

【案例1 记住密码】

【案例2 上次访问时间】

3.2 Session

【案例1 登录、退出系统案例】

【案例2 购物车案例】

3.3 隐藏的表单域

3.4 URL重写

四、JSP编程

4.1 JSP基本语法

(1)HTML模板数据

(2)JSP元素

I  Java部分-脚本

II  Java部分-指令

(1)page指令

(2)include指令

(3)taglib指令【标签控制】

IIIJava部分-动作(了解)

4.2 JSP内置对象

(1)九个内置对象

1.out对象

2.pageContext对象

3.exception对象

(2)四个作用域

五、JSP开发模型

MVC

Model1:JSP+JavaBean

Model2:JSP+JavaBean+Servlet

六、EL与JSTL

1.EL

(1).JSP脚本的缺点

(2).EL表达式

(3).EL运算符

(4).EL的功能

(5).EL表达式的作用域访问对象

2.JSTL

七、过滤器

概念

总结


前言

本文主要介绍会话跟踪、Web当中的jsp编程以及jsp开发模型和EL与JSTL以及过滤器。

 三、会话跟踪

3.1 Cookie

【案例1 记住密码】

实现效果 当勾选“记住密码”复选框时,下次访问登录页面,会自动记住账号,密码信息。

【案例2 上次访问时间】

实现效果 首次登录,显示“欢迎您,XXX” 下次登录,显示“欢迎您,XXX,您上次登录时间为 yyyy年MM月dd日 hh:mm:ss”

1. 概念: Cookie是客户端会话技术,将数据保存在客户端,以保留了各种跟踪信息。

2. 识别用户包括三个步骤:

(1)服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。 (2)浏览器将这些信息存储在本地计算机上,以备将来使用。 (3)当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。

3. 通过 Servlet 设置 Cookie 包括三个步骤:

(1) 创建一个 Cookie 对象:您可以调用带有 cookie 名称和 cookie 值的 Cookie 构造函数,cookie 名称和 cookie 值都是字符串。

 Cookie cookie = new Cookie("key","value");

请记住,无论是名字还是值,都不应该包含空格或以下任何字符:

 [ ] ( ) = , " / ? @ : ;

(2) 设置最大生存周期:您可以使用 setMaxAge 方法来指定 cookie 能够保持有效的时间(以秒为单位)。下面将设置一个最长有效期为 24 小时的 cookie。

 cookie.setMaxAge(60*60*24); 

setMaxAge的参数有如下三种情况:

  1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效

  2. 负数:默认值,当浏览器关闭后,Cookie数据被销毁

  3. 零:删除cookie信息

(3) 发送 Cookie 到 HTTP 响应头:您可以使用 response.addCookie 来添加 HTTP 响应头中的 Cookie,如下所示:

 response.addCookie(cookie);

4.通过 Servlet 读取 Cookie 要读取 Cookie,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

 Cookie[] cookies = request.getCookies();
 for (Cookie cookie : cookies) {
     if (cookie.getName().equals("username")){
         username = cookie.getValue();
     }
     if (cookie.getName().equals("password")){
         password = cookie.getValue();
     }
 }

5.通过 Servlet 删除 Cookie 删除 Cookie 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:

(1)读取一个现有的 cookie,并把它存储在 Cookie 对象中。

(2)使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。

(3)把这个 cookie 添加到响应头。

//JSP Cookie 保存中文内容,需要对中文进行编码与解码,方法如下:
 String str = java.net.URLEncoder.encode("中文","UTF-8");            //编码
 String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码

3.2 Session

【案例1 登录、退出系统案例】

实现效果 1.登录系统后可在各个页面可以显示登录用户名。 2.当退出系统后,访问非登录页面,显示“请登录”超链接。 (创建/获取Session,删除Session会话数据)

【案例2 购物车案例】

实现效果 1. 2.

  1. 概念:Session是服务端会话技术,将数据保存在服务端,以保留了各种跟踪信息。 提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。

  2. 使用步骤

  3. 常用方法 (1)获取Session HttpSession session = request.getSession(); (2)设置属性 session.setAttribute("key",value); (3)获取属性 Object value = session.getAttribute("key");--根据情况,进行类型转换 (4)删除属性 session.removeAttribute("key"); (5)销毁session session.invalidate();

3.3 隐藏的表单域

3.4 URL重写

指的是将Session的会话标识号以参数的形式附加在超链接的URL地址后面。

在HttpServletResponse接口中,定义了两个用于完成URL重写的方法:

<1>encodeURL(String url):用于对超链接和form的action中设置的url重写。

<2>encodeRedirectURL(String url): 用于对要传递给response.sendRedirect方法的url重写。

注意:在重写URL是,前面要通过getSession()方法获取Session对象。

四、JSP编程

4.1 JSP基本语法

JSP=HTML+Java

JSP的本质是Servlet

访问JSP的时候

(1)JSP转换成Servlet

(2)执行Servlet文件

(1)HTML模板数据

(2)JSP元素

I  Java部分-脚本

  • (1)脚本段:<% 脚本 %>
  • (2)声明: <%! 声明 %>【声明方法、变量等等】
  • (3)表达式:<%= 表达式 %> 注意:表达式后不能加分号
  • (4)注释:<%-- JSP注释 --%>

案例演示

index.jsp文件:

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%!
        //1.声明 会成为 jsp转换的servlet的 成员变量或者成员方法
        //声明方法
        public void test(){
            System.out.println("jsp声明");
        }

        //声明变量
        int num = 10;
    %>
    <%

        //2.只是service方法中,要执行的一段代码
        System.out.println("脚本端");
        int score = 90;

        Date date = new Date();
    %>

    <%--3.表达式会在页面上输出--%>
    <%= 1+2 %>
    <%=score %>

    <%--JSP的注释--%>
    <!--  HTML的注释 -->

    <%
        int a = 1;
        System.out.println(a);

        request.getMethod();
        response.setContentType("text/html");
        config.getInitParameter("");
        session.getAttribute("");
        application.getRealPath("");
        page.toString();

        out.println();
        pageContext.getAttribute("");

        exception.getMessage();

    %>

    <%=score%>
    <%
        out.println(score);
    %>
</body>
</html>

 jsp注释与HTML注释区别:

II  Java部分-指令

(1)page指令

语法:<%@ page 属性1=值1 属性2=值2... %>

 <%@ page language=”java” import=”java.util.*” contentType="text/html; charset=utf-8" session="true/false" errorPage="url" isErrorPage="true/false" buffer="" %>

导包需要放在配置指令里面导入

注意:在一个JSP页面中可以使用多个<%@page %>指令,但其中的属性只能用一次,不过import属性例外,它可以多次出现,引入多个类和包,这和Java中的import语句差不多。

(2)include指令

语法:

<%@ include file="相对的URL" %>

作用:静态包含

注意:

被引入的文件必须遵循JSP语法。

被引入的文件可以使用任意的扩展名,但都会被JSP引擎按照JSP页面的处理方式去处理,为了见名知意,建议使用“.jspf”(JSP fragment,即JSP片段)作为静态引入文件的扩展名。

被引入的文件中不要包含<html></html>、<body></body>等标记,因为这样会影响引入文件中同样的标记。

引入和被引入文件中的指令不能冲突(page指令中的pageEncoding和import属性除外)。

此处做一演示,添加一个total.jsp的文件【这个是总的页面】

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="header.jsp"%>
<style>
    div{
        margin: 0px auto;
        width: 1000px;
        height: 200px;
        background-color: blueviolet;
    }
</style>
<body>
    <div>
        <h1>页面主体内容</h1>
    </div>
</body>
<%@ include file="footer.jsp"%>

写一个header.jsp文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style>
        div{
            margin: 0px auto;
            width: 1000px;
            height: 200px;
            background-color: aqua;
        }
    </style>
</head>
<body>
<div><h1>Header</h1></div>
</body>
</html>

编写一个footer.jsp文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style>
        div{
            margin: 0px auto;
            width: 1000px;
            height: 200px;
            background-color: antiquewhite;
        }
    </style>
</head>
<body>
    <div>CopyRight:@......</div>
</body>
</html>

运行的效果如上图所示 

(3)taglib指令【标签控制】
 <%@ taglib uri=”” prefix=”” %>

作用:是减少jsp页面中的java代码

IIIJava部分-动作(了解)

(1)<jsp:include>动作元素

语法:

 <jsp:include page="relativeURL" flush="true|false" />
     page属性用于指定被引入资源的相对路径
     flush属性用于指定是否将当前页面的输出内容刷新到客户端。

作用:把其他资源的输出内容插入到当前JSP页面的输出内容中。----动态包含

案例:

<%@--     include.jsp     --%>
 ​
 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                         "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>include</title>
 </head>
 <body>
     <%Thread.sleep(5000);%>
     included.jsp内的中文<br />
 </body>
 </html>
 <%@--     dynamicInclude.jsp     --%>
 ​
 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                           "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>dynamicInclude page</title>
 </head>
 <body>
     dynamicInclude.jsp内的中文
     <br>
     <jsp:include page="included.jsp" flush="true" />
     <%--对比:flush为true和false的区别。--%>
     <%--<jsp:include page="included.jsp" flush="false" />--%>
 ​
     dynamicInclude.jsp内的中文2
 </body>
 </html>

include指令和<jsp:include>标签有很大的区别:

  • <jsp:include>标签要引入的资源和当前JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。而include指令只能引入遵循JSP格式的文件,被引入文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件。

  • <jsp:include>标签要引入的资源是在运行时才包含的。而include指令引入的资源是在编译时期包含的,包含的是源代码。

  • <jsp:include>标签运行原理与RequestDispatcher.include()方法类似,即被包含的页面不能改变响应状态码或者设置响应头,而include指令没有这方面的限制。

(2)<jsp:forward>动作元素

语法:

 <jsp:forward page="relativeURL" />

类似:请求转发

4.2 JSP内置对象

(1)九个内置对象

jsp的内置对象:JSP内置对象是不需要声明和创建就可以在JSP页面脚本中使用的成员变量。

九个内置对象:

1.out对象

在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。out对象是javax.servlet.jsp.JspWriter类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。接下来,通过一张图来描述JSP页面的out对象与Servlet引擎提供的缓冲区之间的工作关系,具体如图所示。

从图可以看出,在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。

通过一个案例演示out对象的使用:

 <%@ page language="java" contentType="text/html; charset=UTF-8" %>
 <html>
 <head>
 <title>Insert title here</title>
 </head>
 <body>
     <%
         out.println("first line<br />"); //写入JspWriter对象的缓冲区
         response.getWriter().println("second line<br />");//写入servlet引擎提供的缓冲区,即Response缓冲区
     %>
 </body>
 </html>

注意:内容的输出顺序。

多学一招:使用page指令设置out对象的缓冲区大小

<%@ page language="java" contentType="text/html; charset=UTF-8" buffer="0kb"%>

2.pageContext对象

pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境。

(1)pageContext对象获取隐式对象的方法:

(2)pageContext对象不仅提供了获取隐式对象的方法,还提供了存储数据的功能。pageContext对象存储数据是通过操作属性来实现的,下表列举了pageContext操作属性的一系列方法,具体如下:

上表列举了pageContext对象操作属性的相关方法,其中,参数name指定的是属性名称,参数scope指定的是属性的作用范围。pageContext对象的作用范围有4个值,具体如下:

  • pageContext.PAGE_SCOPE:表示页面范围

  • pageContext.REQUEST_SCOPE:表示请求范围

  • pageContext.SESSION_SCOPE:表示会话范围

  • pageContext.APPLICATION_SCOPE:表示Web应用程序范围

需要注意的是,当使用findAttribute()方法查找名称为name的属性时,会按照page、request、session和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回null。

3.exception对象

在JSP页面中,经常需要处理一些异常信息,这时,可以通过exception对象来实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。需要注意的是,exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage=”true”%>的页面。

(2)四个作用域

作用: 共享数据

(1)pageContext :数据只能在当前页面使用

(2)request

(3)session

(4)application

附录:

1.使用IntelliJ IDEA编译jsp文档后servlet的存储路径

路径:

C:\Users\Administrator.IntelliJIdea2017.2\system\tomcat\Unnamed_MovieSystem\work\Catalina\localhost\

2.如何修改这个路径参照此文:Idea 临时文件路径修改 - 简书

五、JSP开发模型

MVC

1.JSP演化历史

1. 早期只有servlet,只能使用response输出标签数据,非常麻烦

2. 后来有了jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html表,造成难于维护,难于分工协作

3. 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性

2.MVC详解

1. M:Model模型(JavaBean)

* 完成具体的业务操作,如:查询数据库,封装对象

2. V:View视图(JSP)

* 展示数据

3. C:Controller控制器(Servlet)

* 获取用户的输入

* 调用模型

* 将数据交给视图进行展示

3.优缺点:

1. 优点:

1. 耦合性低,方便维护,可以利于分工协作

2. 重用性高

2. 缺点:

1. 使得项目架构变得复杂,对开发人员要求高

Model1:JSP+JavaBean

Model2:JSP+JavaBean+Servlet

六、EL与JSTL

1.EL

(1).JSP脚本的缺点

使用JSP脚本可以实现页面输出显示,那为什么还需要使用EL简化输出呢?这是因为单纯使用JSP脚本与HTML标签混合,实现输出显示的方式存在一些弊端,归纳如下:

  • 代码结构混乱,可读性差。

  • 脚本与HTML标签混合,容易导致错误。

  • 代码不易维护。

核心作用:

减少jsp中的java代码 [注意:el只能用在jsp中]

(2).EL表达式

(1)EL表达式

EL是Expression Language的缩写,它定义了一系列的隐含对象和操作符,使开发人员能够很方便地访问页面内容,以及不同作用域内的对象,而无须在JSP中嵌入Java代码,从而使得页面结构更加清晰,代码可读性更高,也更加便于维护。

(2)EL表达式的语法

语法:${EL表达式}

语法结构中包含"$"符号和”{}“括号,二者缺一不可。

使用EL表达式也非常简单,如${username}就可以实现访问变量username的值。

注意:使用EL表达式获取变量前,必须将操作的对象保存到作用域中。

此外,使用EL表达式还可以访问对象的属性,这就需要使用“.”操作符和“[ ]”操作符来完成。

  • “.”操作符

EL表达式通常由对象和属性两部分组成。因此采用与Java代码一样的方式,用“.”操作符来访问对象的属性。

例如:${news.title}可以访问news对象的title属性。

  • “[ ]”操作符

“[ ]”操作符的使用方法与“.”操作符类似,不仅可以用来访问对象的属性,还可以用于访问数组和集合。例如:

①访问对象的属性:${news["title"]}可以访问news对象的title属性。

②访问数组:${newsList[0]}可以访问newsList数组中的第一个元素。

示例代码:

<%@ page import="java.util.ArrayList" %>
 <%@ page import="java.util.Date" %>
 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
 <html>
 <head>
     <title>EL表达式</title>
 </head>
 <body>
 <h1>EL表达式</h1>
 <%
     String username = "tom";
     //将变量添加到作用域中
     request.setAttribute("username",username);
     request.setAttribute("student.name","张三");
     ArrayList list = new ArrayList();
     list.add("新冠疫情");
     list.add("俄乌战争");
     //将集合添加到作用域中
     request.setAttribute("list",list);
     //将日期对象添加到作用域中
     Date date = new Date();
     request.setAttribute("date",date);
 %>
     //访问变量 <br>
     ${username}<br>
     //含有特殊字符的变量 <br>
     ${requestScope["student.name"]}<br>
     //访问集合 <br>
     ${list[1]}<br>
     //访问对象 <br>
     ${date.date}<br>
     //读取参数 (需要从地址栏传参数,例如:http://localhost:8088/ELDemo.jsp?num=1)<br>
     ${param.num}<br>
     //读取参数 (需要从地址栏传参数,例如:http://localhost:8088/ELDemo.jsp?num=1&hobby=a&hobby=b&hobby=c)<br>
     ${paramValues.hobby[2]}<br>
 </body>
 </html>

运行效果:

提示:

①使用“[ ]”操作符访问数据时,必须在属性名两侧使用双引号

EL表达式区分大小写。

③在使用EL表达式获取变量前,必须先将对象保存到作用域中。

表达式分类:

(1) 普通表达式

(2) 读取单值基本数据类型)

(3) 读取多值对象

EL的隐含对象:

序号隐含对象描述
1pageScopepage 作用域
2requestScoperequest 作用域
3sessionScopesession 作用域
4applicationScopeapplication 作用域
5paramRequest 对象的参数,字符串
6paramValuesRequest对象的参数,字符串集合
7headerHTTP 信息头,字符串
8headerValuesHTTP 信息头,字符串集合
9initParam上下文初始化参数
10cookieCookie值
11pageContext当前页面的pageContext,通过pageContext可以访问ServletContext,Request,Response,Session等

前四个是作用域【使用较多】,第五第六获取参数。

(3).EL运算符

EL表达式支持多种运算符,这些运算符的使用方法与Java运算符非常类似。另外,在EL表达式中,为了避免一些运算符在使用时与HTML页面标签发生冲突,会采用其他符号进行替代。

操作符描述
.访问一个Bean属性或者一个映射条目
[]访问一个数组或者链表的元素
( )组织一个子表达式以改变优先级
+
-减或负
*
/ or div
% or mod取模
== or eq测试是否相等
!= or ne测试是否不等
< or lt测试是否小于
> or gt测试是否大于
<= or le测试是否小于等于
>= or ge测试是否大于等于
&& or and测试逻辑与
|| or or测试逻辑或
! or not测试取反
empty测试是否空值

EL的运算符: (1) 算术运算符 (2) 关系运算符 (3) 逻辑运算符 (4) Empty运算符 (5) 条件运算符 例子:${2 > 1 ? "yes" : "no" }

(4).EL的功能

对于EL的特点和作用,归纳总结如下:

  • 可用于获取JavaBean的属性。

  • 能够读取集合类型对象中的元素。

  • 可使用运算符进行数据处理。

  • 可屏蔽一些常见异常。

  • 可自动实现类型转换。

(5).EL表达式的作用域访问对象

JSP提供了4种作用域,分别是page、request、session和application。为了能够访问这4个作用域内的数据,EL表达式也分别提供了4种作用域访问对象来实现数据的读取。这4个作用域访问对象的比较如下:

名称说明
pageScope与页面作用域(page)中的属性相关联的Map类,主要用于获取页面范围内的属性值
requestScope与请求作用域(request)中的属性相关联的Map类,主要用于获取请求范围内的属性值
sessionScope与会话作用域(session)中的属性相关联的Map类,主要用于获取会话范围内的属性值
applicationScope与应用程序作用域(application)中的属性相关联的Map类,主要用于获取应用程序范围内的属性值

当使用EL表达式访问某个属性值时,应当指定查找的范围。如果程序中未指定查找的范围,那么系统会自动按照page → request → session → application的顺序进行查找。

使用作用域访问对象读取属性值非常简单,只需要使用“作用域名称 .”方式即可实现。

总结:

EL从作用域/参数/信息头/初始化参数/cookie中获取数据,显示到JSP页面。

2.JSTL

使用EL表达式已经实现了页面输出显示的优化,为什么还需要使用JSTL呢?这是因为使用EL表达式无法实现逻辑处理,如循环、条件判断等,因此还需要与Java代码混合使用,而JSTL则可以实现逻辑控制,从而进一步优化代码。

(1).JSTL简介

概念:JSTL(Java Server Pages Strandard Tag Library,JSP标准标签库)包含了在开发JSP时经常用到的一系列标准标签。这些标签提供了一种不用嵌套Java代码就可以实现复杂JSP开发的途径。

主要功能:实现JSP页面中的逻辑控制

分类:JSTL按照不同的用途又可以划分为多个分类:

标签库名称资源标示符(uri)前缀(prefix)
核心标签库http://java.sun.com/jsp/jstl/corec
国际化/格式化标签库http://java.sun.com/jsp/jstl/fmtfmt
XML标签库http://java.sun.com/jsp/jstl/xmlx
数据库标签库http://java.sun.com/jsp/jstl/sqlsql
函数标签库http://java.sun.com/jsp/jstl/functionsfn

JSTL使用步骤:

1.下载jstl.jar和standard.jar包

Index of /dist/jakarta/taglibs/standard/binaries

2.将这两个包复制到WEB-INF\lib目录,并添加到项目中。

3.在JSP页面中添加指令

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

标签总结:

标签名称作用
<c:out />输出文本内容到out对象,常用于显示特殊字符,显示默认值
c:set/在作用域中设置变量或对象属性的值
c:remove/在作用域中移除变量的值
c:if/实现条件判断结构
c:forEach/实现循环结构
c:url/构造url地址
c:param/在url后附加参数
c:import/在页面中嵌入另一个资源内容
fmt:formatDate/格式化时间
fmt:formatNumber/格式化数字

七、过滤器

概念

过滤器,顾名思义,就是在源数据和目的数据之间起过滤作用的中间组件

过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理

过滤器可以实现以下目的:

  • 在客户端的请求访问后端资源之前,拦截这些请求。

  • 在服务器的响应发送回客户端之前,处理这些响应。

过滤器要实现的接口是Filter(javax.servlet包中) 过滤器的三个重要方法: (1) Init(FilterConfig config) (2) doFilter(ServletRequest request,ServletResponse response,FilterChain chain) chain.doFilter(request,response);//将请求传给下一个过滤器或目标资源。 (3) destory()销毁

过滤器的配置:

(1)xml配置

   <filter>
     <filter-name>EncodingFilter</filter-name>
     <filter-class>com.ambow.filter.EncodingFilter</filter-class>
     <init-param>
             <param-name>encoding</param-name>
             <param-value>utf-8</param-value>
     </init-param>
   </filter>
   <filter-mapping>
     <filter-name>EncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>

Servlet和过滤器不同的在URL里面,过滤器一般写的是*,指的拦截大多数的url

(2)注解配置 在Servlet3.0之后,可以使用注解进行配置

 @WebFilter( filterName = "LoginFilter",urlPatterns = { "/jsps/cart/*", "/jsps/order/*" }, servletNames = { "CartItemServlet", "OrderServlet" })
 public class LoginFilter implements Filter {
                ...
 }

注解配置参考:https://www.cnblogs.com/ooo0/p/10360952.html

重点应用:

统一字符编码

统一权限验证

过滤放行之前,每次都要被先执行

过滤链filterchain去调用请求

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/914503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(一)idea连接GitHub的全部流程(注册GitHub、idea集成GitHub、增加合作伙伴、跨团队合作、分支操作)

&#xff08;二&#xff09;Git在公司中团队内合作和跨团队合作和分支操作的全部流程&#xff08;一篇就够&#xff09;https://blog.csdn.net/m0_65992672/article/details/132336481 4.1、简介 Git是一个免费的、开源的*分布式**版本控制**系统*&#xff0c;可以快速高效地…

UE Mesh Draw Pipeline 解析

为什么引入Mesh Draw Pipeline -------------作者:mx 常规渲染管线(老的渲染管线)的弊端 ①无法很好的进行排序以及剔除,以UE为例,使用位图 来表示物体可见性,无法快速找到最前面的物体,drawlist无法实现动态物体和静态物体的 draw sorting ②无法很好的进行合批。…

【javaweb】学习日记Day4 - Maven 依赖管理 Web入门

目录 一、Maven入门 - 管理和构建java项目的工具 1、IDEA如何构建Maven项目 2、Maven 坐标 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;主要组成 3、IDEA如何导入和删除项目 二、Maven - 依赖管理 1、依赖配置 2、依赖传递 &#xff08;1&#xff09;查…

使用Pytorch和OpenCV实现视频人脸替换

“DeepFaceLab”项目已经发布了很长时间了&#xff0c;作为研究的目的&#xff0c;本文将介绍他的原理&#xff0c;并使用Pytorch和OpenCV创建一个简化版本。 本文将分成3个部分&#xff0c;第一部分从两个视频中提取人脸并构建标准人脸数据集。第二部分使用数据集与神经网络一…

二级MySQL(四)——完整性约束

一种规则&#xff0c;限制存储的数据 保证数据库中数据的正确&#xff0c;有效和完整 分类&#xff1a; 非空——得有值——NOT NULL 唯一——唯一的&#xff0c;不重复——UNIQUE 主键——非空且唯一——PRIMARY KEY 默认——给出默认值——DEFAULT 检查——保证某个条件…

CentOS Stream 9中安装MySQL的详细步骤

文章目录 卸载MySQL在线安装离线安装忘记密码 卸载MySQL 安装前先卸载系统上旧版本的 MySQL&#xff08;没有则跳过此步骤&#xff09; 查看已安装的MySQLrpm -qa | grep mysql卸载查询到的所有安装包rpm -e PackageName # 可批量删除删除my.cnf 查看/etc/my.cnf文件是否还存…

【consul】

consul 一、什么是服务注册与发现1.11.2 二、 什么是consul2.1定义2.2特性2.2.1服务注册与发现&#xff1a;2.2.2健康检查&#xff1a;2.2.3Key/Value存储&#xff1a; 三、consul部署-datacenter &#xff1a;指定数据中心名称&#xff0c;默认是dc1。consul &#xff1a;指定…

Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!

文章目录 前言dayofweek 函数官方说明BUG 重现Spark SQL 中的使用总结 前言 使用的集群环境为&#xff1a; hive 3.1.2spark 3.0.2 dayofweek 函数官方说明 dayofweek(date) - Returns the day of the week for date/timestamp (1 Sunday, 2 Monday, …, 7 Saturday). …

线性代数的本质笔记(3B1B课程)

文章目录 前言向量矩阵行列式线性方程非方阵点积叉积 前言 最近在复习线代&#xff0c;李永乐的基础课我刷了一下&#xff0c;感觉讲的不够透彻&#xff0c;和我当年学线代的感觉一样&#xff0c;就是不够形象。 比如&#xff0c;行列式为什么那么重要&#xff0c;它的含义究…

SQL 语句继续学习之记录二

三&#xff0c; 聚合与排序 对表进行聚合查询&#xff0c;即使用聚合函数对表中的列进行合计值或者平均值等合计操作。 通常&#xff0c;聚合函数会对null以外的对象进行合计。但是只有count 函数例外&#xff0c;使用count(*) 可以查出包含null在内的全部数据行数。 使用dis…

Ed腾讯云下一代CDN -- EdgeOne加速MinIO对象存储

省流 使用MinIO作为EdgeOne的源站。 背景介绍 项目中需要一个兼容S3协议的对象存储服务&#xff0c;腾讯云的COS虽然也兼容S3协议&#xff0c;但是也只是支持简单的上传下载&#xff0c;对于上传的时候同时打标签这种需求&#xff0c;就不兼容S3了。所以决定自建一个对象存储…

【分享】华为设备登录安全配置案例

微思网络www.xmws.cn&#xff0c;2002年成立&#xff0c;专业IT认证培训21年&#xff0c;面向全国招生&#xff01; 微 信 号 咨 询&#xff1a; xmws-IT 华为HCIA试听课程&#xff1a;超级实用&#xff0c;华为VRP系统文件详解【视频教学】华为VRP系统文件详解 华为HCIA试听课…

IDEA快速设置Services窗口

现在微服务下面会有很多SpringBoot服务&#xff0c;Services窗口方便我们管理各个SpringBoot服务&#xff0c;但有时IDEA打开项目后无法的看到Services窗口&#xff0c;以下步骤可以解决&#xff01;

shell脚本免交互

一.Here Document免交互 1.免交互概述 使用I/O重定向的方式将命令列表提供给交互式程序 是一种标准输入&#xff0c;只能接收正确的指令或命令 2.格式&#xff1a; 命令 <<标记 ....... 内容 #标记之间是传入内容 ....... 标记 注意事项 标记可以使用任意的合法…

无类别域间路由(Classless Inter-Domain Routing, CIDR):理解IP网络和子网划分(传统的IP地址类ABCDE:分类网络)

文章目录 无类别域间路由&#xff08;CIDR&#xff09;&#xff1a;理解IP网络和子网划分引言传统的IP地址类关于“IP地址的浪费” IP地址与CIDRIP地址概述网络号与主机号CIDR记法&#xff08;网络 网络地址/子网掩码&#xff09;网络和广播地址 CIDR的优势减少路由表项缓解IP…

【AUTOSAR标准规范的下载和阅读方法】

AUTOSAR标准规范的下载和阅读方法 文章目录 AUTOSAR标准规范的下载和阅读方法下载方法 下载方法 我们可以去AUTOSAR的官网进行AUTOSAR标准规范的下载&#xff1a; 官网&#xff1a;https://www.autosar.org/ 步骤如下图&#xff1a; 比如&#xff0c;如果我们想下载Classic P…

【PHP面试题82】system和exec是用来做什么的?有什么区别

文章目录 &#x1f680;一、前言&#xff0c;PHP中system和exec命令的作用&#x1f680;二、system()函数&#x1f680;三、exec()函数&#x1f680;四、区别和应用场景&#x1f50e;4.1 使用system()函数的应用场景&#x1f50e;4.2 使用exec()函数的应用场景&#x1f50e;4.3…

视频云存储/安防监控EasyCVR视频汇聚平台分发rtsp流时,出现“用户已过期”提示该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

mysql并行效率提升

下面是一个并行读取mysql数据库表的测试程序&#xff0c;测试结果发现&#xff0c;读取10个表&#xff0c;1个个读取&#xff0c;和并行读取10个&#xff0c;效率一样&#xff0c;甚至并行读取还慢很多&#xff0c;这是为什么&#xff1f; con get_db_conn() results {} poo…

Mybatis 建立依赖失败:报错Dependency ‘mysql:mysql-connector-java:8.0.28‘ not found

Mybatis 建立依赖失败&#xff1a;报错Dependency ‘mysql:mysql-connector-java:8.0.28’ not found 解决办法&#xff1a; 写完依赖代码&#xff0c;直接重构&#xff0c;下载依赖。 图片: ![Alt](https://img-home.csdnimg.cn/images/20220524100510.png Mac 版本注意Ide…