Java web知识点


前言


  这是一篇学完java web之后的知识点总结,根据自己的理解将这些知识点划分了模块。java web的主要功能体现在与浏览器交互上,与浏览器交互的工具是tomcat,Servlet接口是交互的规则,request对象和response对象来发送请求消息和响应消息。再根据数据共享的范围有cookie对象和session对象,一次会话包括多次请求和响应。cookie数据存储在客户端浏览器,session数据存储在服务器端。还有一个servletContext对象,它的数据能被所有请求和响应共享。
  数据是从服务器端获取,放到页面展示时,前端就需要生成动态页面JSP。
  为了服务器安全,需要对请求进行拦截验证,filter和listener对象


知识准备

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

xml

xml概念:

  • Extensible Markup Language 可扩展标记语言

功能:

  • 存储数据。1.作为配置文件,2.用于网络中传输数据

xml与html的区别:

  1. xml标签是自定义的,html标签是预定义的
  2. xml语法严格,html语法松散
  3. xml用于存储数据,html用于展示数据

语法:

  1. xml文档的后缀名是.xml
  2. 第一行是文档申明<? xml version='1.0' encoding="UTF-8"?>,
    属性:
    version:指定xml的版本
    enconding:指定xml的编码,保持文本和xml的编码一致,
    standalone:指定xml是否独立,是否不会依赖其他文件。yes不依赖,no依赖
  3. 有且仅有一个根标签
  4. 属性值使用引号(单双引号都可)括起来
  5. 区分大小写

例子:

<?xml version="1.0" encoding="UTF-8"?>
<users>
  <user id="1">
    <name>Linda</name>
    <age>19</age>
    <sex></sex>
  </user>
  <user id="2">
    <name>Jim</name>
    <age>20</age>
    <sex></sex>
  </user>
</users>

CDATA区:在该区域的数据会被原样展示,格式<![CDATA[ 数据 ]]>

xml约束文件

概念:约束是规定xml的书写规则
分类:

  • DTD约束:一种简单的约束技术
  • Schema约束:一种复杂的约束技术
DTD约束文件

DTD约束:

  • 内部DTD,约束规则定义在xml文件内
  • 外部DTD,约束规则定义在外部的dtd文件中,引入方式:
    本地:<!DOCTYPE 根标签名 SYSTEM “dtd文件位置”>
    网络:<!DOCTYPE 根标签名 SYSTEM “dtd文件名称” “dtd文件的位置URL”>

后缀:DTD文件的后缀名是.dtd

例子:

<!ELEMENT students (student+)>  //*是该标签出现0-n次,+是该标签出现1-n次
<!ELEMENT student(name,age,sex)>
<!ELEMENT name(#PCDATA)>
<!ELEMENT age(#PCDATA)>
<!ELEMENT sex(#PCDATA)>
<!ATTLIST student number ID #REQUIRED> //student标签中有一个number属性,值唯一
Schema约束

引入:

  • xml文档的根元素
  • 引入xsi前缀。xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
  • 引入xsd文件命名空间。xsi:schemaLocation=“http://www.itcast.cn/xml student.xsd”
  • 为每个xsd约束声明一个前缀,作为标识。xmlns=“http://www.itcast.cn/xml”

引入例子:

<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xmlns="http://www.itcast.cn/xml"
          xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">

后缀:

  • Schema文件的后缀名是.xsd

解析xml

用xml存储的数据是xml格式,但一般展示的数据不是xml样式,所以需要将xml样式解析成常用的数据。

xml解析方式:

  • DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树。
    优点:操作方便,可以对文档进行CURD的所有操作。
    缺点:占内存
  • SAX:逐行读取,基于事件滚动
    优点:不占内存
    缺点:只能读取,不能增删改。因为它读取一行,在内存中释放一行。

服务器的xml解析更偏向DOM方式,移动端偏向SAX方式。

xml解析器

xml常用的解析器:

  1. JAXP:sun公司提供的解析器,支持dom和sax
  2. DOM4J:一款非常优秀的解析器
  3. JSoup:jsoup是一款java的html解析器,可直接解析某个URL地址、HTML文本内容,它提供了一套API,可通过DOM、CSS以及类似jQuery的方法来操作数据
  4. PULL:Android系统内置解析器,sax方式

Jsoup的使用方法

  1. 引入依赖或导入jar包,这里使用引入依赖
		<!--jsoup,xml解析器-->
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.13.1</version>
		</dependency>
  1. 代码实现
public class JsoupDemo {

    @Test
    public void demo() throws IOException {
        // 获取xml的路径
        String path = Jsoup.class.getClassLoader().getResource("user.xml").getPath();
        // 获取Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 通过document获取element
        Elements name = document.getElementsByTag("name");
        System.out.println(name.size());

        // 选择器获取element
        // 通过标签名获取某个标签
        Elements elements = document.select("name");
        System.out.println(elements);
        // 通过id属性获取某个标签
        Elements elements1 = document.select("#id");
        System.out.println(elements1);
        // 通过指定属性值获取某个标签
        Elements elements2 = document.select("name[id=\"1\"]");
        System.out.println(elements2);
    }
}

常用类讲解:

  • Jsoup:工具类,解析html文档或xml文档,返回document对象。常用方法:
方法描述
parse(File in,String charsetName);通过指定文件,来解析xml或html文件。charsetName指定编码
parse(String html);解析xml或html字符串
parse(URL url, int timeoutMillis)解析网络url指定的xml或html文件,timeoutMills指定连接超时时间,单位毫秒。
// parse(File in,String charsetName);
Document parse1 = Jsoup.parse(new File(path), "utf-8"); 
// parse(String html);
Document parse2 = Jsoup.parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "\n" +
                "<users>\n" +
                "\n" +
                "\n" +
                "<user id=\"1\">\n" +
                "\n" +
                "<name>Linda</name>\n" +
                "\n" +
                "<age>19</age>\n" +
                "\n" +
                "<sex>女</sex>\n" +
                "\n" +
                "</user>\n" +
                "\n" +
                "</users>");
// parse(URL url, int timeoutMillis);
Document parse3 = Jsoup.parse(new URL("http://baidu.com"), 10000);
  • Document:文档对象。内存中的dom树,可以获取Elements。常用方法:
方法描述
getElementById(String id)根据id属性值获取唯一的element对象。
getElementsByTag(String tagName)根据标签名获取元素对象集合。
getElementsByAttribute(String key)根据属性名称获取元素对象集合。
getElementsByAttributeValue(String key,String value)根据对应的属性名和属性值获取对象集合。
  • Elements:元素Element对象的集合。可以当成ArraryList来使用。
  • Element:元素对象
方法描述
String attr(String key);根据属性名称获取属性值
String text();获取文本内容
String html();获取标签体的所有内容(包括子标签的字符串内容)
  • Node:节点对象,是Document和Element的父类

选择器selector:

//选择器 通过标签获取
Elements elements = document.select("name");
System.out.println(elements);
// 通过id获取
Elements elements1 = document.select("#id");
System.out.println(elements1);
// 获取指定属性值得某个标签
Elements elements2 = document.select("name[id=\"1\"]");
System.out.println(elements2);

Xpath获取xml元素:
需要先导入jar包

// 获取document对象
Document document = Jsoup.parse(new File(path), "utf-8");
// 创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
// 获取标签
List<JXNode> jxNode = jxDocument.selN("//user");

Xpath语法:
在这里插入图片描述

web

  1. 软件架构:①C/S:客户端/服务器端 ②B/S:浏览器/服务器端
  2. 网络三要素:IP、端口、传输协议。
    ①tcp传输协议:安全协议,三次握手,速度稍慢。
    ②udp传输协议:不安全协议,速度快。

Servlet

Servlet:server applet,运行在服务器的小程序。实则是一个接口,定义了Java类被浏览器访问的规则。

配置方式:

  1. xml配置:在web.xml中配置
<!--配置servlet类-->
    <servlet>
        <!--定义该servlet的名称,在servlet-mapping标签中servlet-name必须与它相同-->
        <servlet-name>demo</servlet-name>
        <!--该servlet的全路径类名-->
        <servlet-class>com.demo.request.LoginServlet</servlet-class>
        <!--
            指定servlet的创建时间
            正数或0:服务器启动时,创建servlet对象
            负数:第一次访问该servlet的路径时,创建servlet对象
        -->
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
  1. 注解配置
@WebServlet("/login")
public class LoginServlet implements Servlet {

    // servlet初始化时调用
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }
    
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    // servlet被访问时调用,servlet的具体逻辑代码
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    // servlet正常销毁时调用
    @Override
    public void destroy() {

    }
}

HttpServlet:对http协议进行简易封装,是一个抽象类,里面定义了doGet和doPost方法。

HTTP

概念: Hyper Text Transfet Protocol 超文本传输协议。定义了客户端和服务器端通信时,发送的数据格式。
特点:

  • 基于TCP/IP的高级协议
  • 默认端口号是80
  • 基于请求/响应模型,即一次请求对应一次响应
  • 无状态,即每次请求之间都相互独立,不能交互数据

请求消息数据格式

  1. 请求行
    请求方式 请求url 请求协议/版本
    例:GET /login.html HTTP/1.1
    HTTP协议中有7种请求方式,最常用的是GET请求和POST请求
    GET请求和POST请求的区别:
    ① GET请求参数在请求行中,即url后面跟请求参数;POST请求参数在请求体中。
    ② GET请求的url长度有限自;POST请求的url长度无限制。
    ③ GET请求不太安全;POST请求相对安全。
    ④ GET请求无请求体;POST请求有请求体。
  2. 请求头:浏览器反馈服务器一些浏览器的信息
    User-Agent:告诉服务器,浏览器的版本信息,例如谷歌浏览器,User-Agent的值里面会包含Chrome
    Referer:告诉服务器端这个请求入口的位置。作用:防盗链,统计工作。
  3. 请求空行:用来分割POST请求的请求头和请求体
  4. 请求体:封装POST请求的请求参数。

响应消息数据格式:

  1. 响应行
    组成:协议/版本 响应状态码 状态码描述
    例子:HTTP/1.1 200 ok
    状态码分类:
    ① 1xx:服务器接收客户端消息,但还未接收完成,等待一段时间后,发送1xx的状态码
    ② 2xx:响应成功。例:200
    ③ 3xx:重定向。例:302(重定向),304(访问缓存)
    ④ 4xx:客户端错误。例:404(资源找不到,访问路径错误),405(请求方式没有对应的doXxx方法)
    ⑤ 5xx:服务器端错误。例:500(服务器异常)
  2. 响应头
    Content-Type:告诉客户端此次响应体的数据格式和便把
    Content-disposition:in-line/attachment;filename=xxx; 其中in-line,默认值,在当前页面中打开;attachment,以附件形式打开。例如文件下载。
  3. 响应空行:分割响应头和响应体
  4. 响应体:封装响应参数

核心对象

servlet是用来与浏览器通信的接口,服务器与浏览器之间的请求和响应由request和response对象来实现。request和response对象是由服务器创建,其中request对象是用来获取请求消息,response对象是来设置响应消息的。

request对象

  1. request的常用方法:
 protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * request常用方法:
         * 该例子的servlet的路径是/demo
         * 浏览器访问地址是/servlet/demo
         */
        // 获取请求方式,GET/POST
        String method = request.getMethod();
        // 获取虚拟目录,/servlet
        String contextPath = request.getContextPath();
        // 获取servlet路径,/demo
        String servletPath = request.getServletPath();
        // 获取请求URL
        String requestURI = request.getRequestURI(); // 结果为:/servlet/demo
        StringBuffer requestURL = request.getRequestURL(); // 结果为:http://localhost:8080/servlet/demo
        // 获取协议及版本:HTTP/1.1
        String protocol = request.getProtocol();
        // 获取客户机的IP地址
        String remoteAddr = request.getRemoteAddr();
        // 获取请求头
        String header = request.getHeader("User-Agent"); // 根据请求头的key获取值
        Enumeration<String> headerNames = request.getHeaderNames(); //获取所有请求头名称
    }
  1. get/post请求获取参数方法:
// 根据参数名获取参数值
String requestParameter = request.getParameter("name");
// 根据参数名获取参数值的数组
String[] hobbies = request.getParameterValues("hobby");
// 获取所有请求的参数名称
Enumeration<String> parameterNames = request.getParameterNames();
// 获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
当请求参数有多个时,使用getParameter(String name);获取时不会报错,且只会获取第一个参数值。
  1. 请求中文乱码解决:
request.setCharacterEncoding("utf-8");
  1. request的转发:
request.getRequestDispatcher("/failServlet").forward(request,response);

response对象

  1. response的常用方法
// 设置状态码
response.setStatus(200);
// 设置请求头
response.setHeader("Content-disposition","in-line");
  1. 响应中文乱码解决
// 1. 设置响应数据的编码,解决乱码的问题
response.setCharacterEncoding("utf-8");
// 通知浏览器解析编码,上面那句可以省略
response.setHeader("content-type","text/html;charset=utf-8");
// 2. 简易写法
response.setContentType("text/html;charset=utf-8");
第一种写法还可以省略第一句。
  1. 获取输出流,将数据回写到浏览器中。分为字符输出流getWriter()和字节输出流getOutputStream()。
// 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("<h1>hello world!</h1>");
writer.write("字符流输出流demo");
// 获取输出流
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("字节流输出demo".getBytes());
  1. response的重定向,主要使用sendRedirect方法做重定向操作
// 1.设置响应头重定向
response.setStatus(302);
response.setHeader("location","/servlet/demo");
// 2.简单重定向
response.sendRedirect("/servlet/demo");
注:send写绝对路径时要在前面加虚拟路径,即访问项目的根路径。forward可不加
  1. 重定向和转发的区别:
    ① 重定向地址栏会发生变化,转发地址栏路径不变
    ② 重定向可访问其他服务器的资源,转发只能访问自己服务器的资源
    ③ 重定向有两次请求,转发只有一次请求
    ④ 重定向不能共享数据,转发可共享数据。

ServletContext对象

在前面通过请求和响应的功能有了request对象和response对象。但它们能共享数据的范围比较有局限性,根据共享数据的范围有ServletContext对象、Cookie对象、Session对象。ServletContext对象在服务器初始化时就会创建,它的对象范围是所有用户的请求资源。

  1. servletContext对象的常用方法:
// 获取servletContext对象
ServletContext servletContext = request.getServletContext();
// 获取MIME类型
String mimeType = servletContext.getMimeType("a.txt");
// 获取文件的服务器路径
String realPath = servletContext.getRealPath("a.txt");  // a.txt文件在web目录下
String realPath1 = servletContext.getRealPath("/WEB-INF/b.txt"); // b.txt文件在WEB-INF目录下
String realPath2 = servletContext.getRealPath("/WEB-INF/classes/c.txt"); // c.txt文件在src目录下
        
/**
 * 域对象:共享数据
 */
// 存储一个name,值为tom
servletContext.setAttribute("name","tom");
// 获取name的值
Object name = servletContext.getAttribute("name");
// 删除name
servletContext.removeAttribute("name");
MIME类型:互联网通信中的一种文件数据类型。格式:大类型/小类型。text/html、image/jpeg

getRealPath方法获取的是文件的真实路径,即绝对路径

Cookie对象

Cookie是一种客户端会话技术,一次会话是由多个请求和响应组成,在会话中可共享数据。它是基于响应头set-cookie和请求头cookie实现的,存储在客户端中,发送请求的时候带到服务器中,再由服务器端返回存储到客户端。

  1. cookie的基本使用
// 创建Cookie对象,并设置键值对
Cookie cookie = new Cookie("username","cookieDemo");
// 设置cookie的失效时间为20min,参数以秒为单位
cookie.setMaxAge(60*20);
// 将cookie对象添加到response的响应头中
response.addCookie(cookie);

// 获取cookie
Cookie[] cookies = request.getCookies();
for (Cookie c: cookies) {
   String n = c.getName(); //获取cookie的名称
   String v = c.getValue(); //获取cookie的值
}
  1. cookie的存活时间:
    持久化存储:setMaxAge(int seconds); 其中seconds填入秒,取值的三种情况:
    ① 正数:将Cookie数据存储到硬盘中,在指定时间内有效。
    ② 负数:默认值,浏览器关闭时,Cookie数据被销毁。
    ③ 0:删除cookie数据

  2. 数据共享
    同一个服务器中的多个web项目,默认情况不能共享cookie数据。若设置cookie的获取范围为服务器的虚拟目录,则可以共享cookie数据。
    不同服务器之间cookie数据的共享数据,不同服务器间的一级域名相同即可。

// 设置cookie获取范围的路径
cookie.setPath("/servlet");
// 设置cookie获取范围的域名
cookie.setDomain(".baidu.com"); // 域名为tieba.baidu.com,也可以共享该cookie数据
  1. cookie的特点和作用
    cookie存储数据在客户端浏览器
    浏览器对于单个cookie限制为4kb大小,对同一域名的cookie数量限制为20个

Session对象

服务器端会话技术,在一次会话的对此请求间共享数据,将数据保存在服务器端的对象HttpSession中。客户端带着cookie请求服务器端时,服务器端会在响应头中添加一个名为JSWSSIONID的cookie,值为session的ID,session是依赖cookie实现的。

  1. 持久化存储:在cookie中给名为JSWSSIONID设置持久化操作。
  2. 活化和钝化:避免存储在session中的数据丢失,tomcat已实现
    session的活化:在服务器正常关闭之前,将session对象系列化存储在硬盘中。
    session的钝化:在服务器启动之后,将session文件转化成内存中的session对象,反序列化。
  3. 有效时间:默认失效时间30min
  4. 特点:
    session用于存储一次会话中多次请求的数据,存在服务器端。
    session可以存储任意数据类型,无大小限制。
  5. session和cookie的区别:
    ① session存储在服务器端,cookie存储在客户端。
    ② session没有数据大小限制,单个cookie限制4kb
    ③ session有数据安全,cookie相对于不安全
  6. 获取session对象
HttpSession session = request.getSession();

前端技术

JSP

JSP:Java Server Pages,java服务器端页面,支持html代码和java代码。本质是一个Servlet,继承HttpServlet,能将页面的里面转化为java代码。

  1. 指令:用于配置JSP界面,导入资源文件
    格式:<%@ 指令名称 属性名=属性值 … %>
    例子:<%@ page contentType=“text/html;charset=UTF-8” language=“java” errorPage=“fail.html” %>
    ① page:配置JSP页面
    contentType:设置页面的编码
    import:导java包
    errorPage:指定改页面发生异常之后,跳转到该属性指定的页面中去
    isErrorPage:标识当前页面是否为错误页面。true:是,默认值,可以使用exception内置对象。false,否,则不可以。

    ② include:页面包含。在该页面中导入其他页面
    例子:<%@ include file=“login.html”%>

    ③ taglib:导入资源。
    例子:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

  2. 脚本格式
    <% java代码 %>:定义的java代码,在service方法中。
    <%! java代码 %>:定义的java代码,在jsp转化为servlet类中的成员变量位置,即定义成员变量。
    <%= java代码 %>:展示到页面上。

  3. 内置对象:再JSP界面中不需要创建,就可以直接使用。

变量名java类型作用
pageContextPageContext当前页面共享数据,并且可以获取其他八个内置对象
requestHttpServletRequest请求对象
sessionHttpSessionsession对象
applicationServletContext服务器共享数据
responseHttpServletResponseresponse对象
pageObject当前页面的servlet对象,相当于this
outJspWriterjsp的输出对象,数据输出到页面上展示
configServletConfigservlet的配置对象
exceptionThroable异常对象

EL表达式

  1. EL:Expression Language,表达式语言,简化jsp页面中的java代码
  2. 语法:${表达式}
  3. 注意:jsp默认支持el表达式,忽略el表达式:
    ①在page中设置isELIgnored=“true”。
    ②忽略某个el表达式:${表达式}
  4. 四个域对象
    pageScope
    requestScope
    sessionScope
    applicationScope
  5. empty/not empty:判断对象是否为空或长度是否为0

JSTL表达式

  1. JSTL:JavaServer Pages Tag Library,jsp标准标签库,简化jsp页面的java代码 。使用jstl之前要先引入标签库,<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

  2. 常用jstl标签

<%--
if标签:test="表达式",只接受boolean的表达式
注意:if标签没有else的情况
--%>
<c:if test="3==4">
    <p>if标签</p>
</c:if>

<%--
choose标签
when标签:判断,只接受booleab的表达式
otherwise标签:when情况之外的情况判断
--%>
<c:choose>
 <c:when test="${score>=90}">优秀</c:when>
 <c:when test="${score>=70&&score<90}">良好 </c:when>
 <c:when test="${score>60&&score<70}">及格</c:when>
 <c:otherwise>不及格</c:otherwise>
</c:choose>

<%--
foreach标签
begin属性:开始值
end属性:结束值
var属性:临时变量
step属性:步长
varStatus:循环状态对象,index:容器中元素的索引,从0开始;count:循环次数,从1开始
--%>
<c:forEach begin="0" end="10" var="i" varStatus="s" >
${i} | ${s.index} | ${s.count}
</c:forEach>

<%--
foreach标签:遍历容器List
item属性:容器对象
var属性:临时变量
varStatus:循环状态对象,index:容器中元素的索引,从0开始;count:循环次数,从1开始
--%>
<c:forEach item="list" var="i" varStatus="s">
    ${i.name} | ${s.index} | ${s.count}
</c:forEach>

Ajax请求

  1. 概念:Asynchronous JavaScript And XML,异步的JavaScript和xml。ajax可以局部刷新页面
  2. 异步和同步
    异步:客户端在等待服务器响应里,可以进行其他操作。
    同步:客户端在等待服务器响应里,不可以进行其他操作。
  3. jQuery实现
<script>
    function fun() {
        // ajax请求
        $.ajax({
            url:"demoServlet", // 请求路径
            type:"POST", // 请求方式
            data:{"username":"ajaxDemo","password":"123456"}, // 请求参数
            success:function (data) { // 响应成功后的回调数据,data响应参数
                console.log(data)
            }
        })

        /**
         * get请求,格式:$.get(url,[data],[callback],type)
         * 参数:url:请求路径
         *      data:请求参数
         *      callback:回调函数
         *      type:响应结果的类型
         */
        $.get("demoServlet",{"username":"ajaxDemo","password":"123456"},function (data) {
            console.log(data)
        },"text")

        /**
         * post请求,格式:$.post(url,[data],[callback],type)
         * 参数:url:请求路径
         *      data:请求参数
         *      callback:回调函数
         *      type:响应结果的类型
         */
        $.post("demoServlet",{"username":"ajaxDemo","password":"123456"},function (data) {
            console.log(data)
        },"text")
    }
    
</script>

JSON

  1. 概念:JavaScript Object Notation,JavaScript对象表示法。用于存储和交换数据,进行数据传输,多用于客户端和浏览器之间的数据传输。
  2. JSON解析器:用于与java对象的相互转换,常用的解析器有Jsonlib,Gson,fastjson,jackson。这里不做详细介绍
  3. JSON注解:@JSONIgnore:放在属性上,表示转化JSON时,忽略该属性。@JSONFormat:放在属性上,对该属性值进行格式化。

过滤器和监听器

Filter过滤器

  1. 概念:拦截一些请求,并可以对拦截下来的请求做逻辑处理。
  2. 基础代码:自定义过滤器要实现Filter接口。
import javax.servlet.*;
import java.io.IOException;

public class DemoFilter implements Filter {

    /**
     * 过滤器初始化方法,拦截之前执行
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    /**
     * 过滤器的逻辑代码
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 放行代码
        filterChain.doFilter(servletRequest,servletResponse);
    }

    /**
     * 过滤器销毁时方法
     */
    @Override
    public void destroy() {

    }
}
  1. 配置过滤器的拦截路径
    xml配置:在web.xml中配置
   <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.demo.request.DemoFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <!--拦截路径-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  注解配置

@WebFilter("/*")
public class DemoFilter implements Filter {
// 省略其他代码
}
  1. 过滤器执行的顺序:注解配置的,根据类名的字符串进行比较,小的先执行。xml配置的,<filter-mapping>标签在前面的先执行。

拦截配置

  1. 拦截路径配置:
    具体资源路径:/index.jsp。只有访问index.jsp资源时,过滤器执行。
    拦截目录:/user/*。访问/user目录下的所有资源时,过滤器都会执行。
    后缀名拦截:*.jsp。访问后缀名为jsp的资源时,过滤器会执行。
    拦截所有资源:/*。访问所有资源,过滤器都会执行。

注意:拦截后缀名时,前面不能加/

  1. 拦截方式配置:设置dispatchetTypes属性
    REQUEST:默认值。浏览器直接请求资源
    FORWARD:转发访问资源
    INCLUDE:包含访问资源
    ERROR:错误跳转资源
    ASYNC:异步访问资源

    ①注解配置

@WebFilter(value = "/*",dispatcherTypes = DispatcherType.FORWARD)
public class DemoFilter implements Filter {
// 省略其他代码
}

  ②xml配置

<filter-mapping>
   <filter-name>filter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
</filter-mapping>

Listener监听器

  1. 注解配置
@WebListener
public class DemoListener implements ServletContextListener {
    /**
     * 监听器初始化方法,服务器启动时调用
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
    }

    /**
     * 监听器销毁方法,服务器关闭时调用
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}
  1. xml配置
<listener>
   <listener-class>com.demo.request.DemoListener</listener-class>
</listener>
<!--指定初始化值-->
<context-param>
   <param-name>namespace</param-name>
   <param-value>demo</param-value>
</context-param>

附录

  1. BeanUtils工具:能将一个map封装成一个对象,简化数据封装

    代码演示如下:

   public void demo() throws Exception {
        User userOne = new User();
        Map<String,Object> map = new HashMap<>();
        //...省略赋值过程
        
        // 将map转化为user对象
        BeanUtils.populate(userOne,map);
        
		// 给对象的属性赋值
        User user = new User();
        BeanUtils.setPropery(user,"name","linda");
        // 获取对象的属性值
        String name = BeanUtils.getProperty(user,"name");
    }

注:setPropery和getProperty方法只能给对象的属性赋值或获取属性值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值