文章目录
前言
这是一篇学完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的区别:
- xml标签是自定义的,html标签是预定义的
- xml语法严格,html语法松散
- xml用于存储数据,html用于展示数据
语法:
- xml文档的后缀名是.xml
- 第一行是文档申明<? xml version='1.0' encoding="UTF-8"?>,
属性:
version:指定xml的版本
enconding:指定xml的编码,保持文本和xml的编码一致,
standalone:指定xml是否独立,是否不会依赖其他文件。yes不依赖,no依赖 - 有且仅有一个根标签
- 属性值使用引号(单双引号都可)括起来
- 区分大小写
例子:
<?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常用的解析器:
- JAXP:sun公司提供的解析器,支持dom和sax
- DOM4J:一款非常优秀的解析器
- JSoup:jsoup是一款java的html解析器,可直接解析某个URL地址、HTML文本内容,它提供了一套API,可通过DOM、CSS以及类似jQuery的方法来操作数据
- PULL:Android系统内置解析器,sax方式
Jsoup的使用方法
- 引入依赖或导入jar包,这里使用引入依赖
<!--jsoup,xml解析器-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
- 代码实现
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
- 软件架构:①C/S:客户端/服务器端 ②B/S:浏览器/服务器端
- 网络三要素:IP、端口、传输协议。
①tcp传输协议:安全协议,三次握手,速度稍慢。
②udp传输协议:不安全协议,速度快。
Servlet
Servlet:server applet,运行在服务器的小程序。实则是一个接口,定义了Java类被浏览器访问的规则。
配置方式:
- 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>
- 注解配置
@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
- 基于请求/响应模型,即一次请求对应一次响应
- 无状态,即每次请求之间都相互独立,不能交互数据
请求消息数据格式
- 请求行
请求方式 请求url 请求协议/版本
例:GET /login.html HTTP/1.1
HTTP协议中有7种请求方式,最常用的是GET请求和POST请求
GET请求和POST请求的区别:
① GET请求参数在请求行中,即url后面跟请求参数;POST请求参数在请求体中。
② GET请求的url长度有限自;POST请求的url长度无限制。
③ GET请求不太安全;POST请求相对安全。
④ GET请求无请求体;POST请求有请求体。 - 请求头:浏览器反馈服务器一些浏览器的信息
User-Agent:告诉服务器,浏览器的版本信息,例如谷歌浏览器,User-Agent的值里面会包含Chrome
Referer:告诉服务器端这个请求入口的位置。作用:防盗链,统计工作。 - 请求空行:用来分割POST请求的请求头和请求体
- 请求体:封装POST请求的请求参数。
响应消息数据格式:
- 响应行
组成:协议/版本 响应状态码 状态码描述
例子:HTTP/1.1 200 ok
状态码分类:
① 1xx:服务器接收客户端消息,但还未接收完成,等待一段时间后,发送1xx的状态码
② 2xx:响应成功。例:200
③ 3xx:重定向。例:302(重定向),304(访问缓存)
④ 4xx:客户端错误。例:404(资源找不到,访问路径错误),405(请求方式没有对应的doXxx方法)
⑤ 5xx:服务器端错误。例:500(服务器异常) - 响应头
Content-Type:告诉客户端此次响应体的数据格式和便把
Content-disposition:in-line/attachment;filename=xxx; 其中in-line,默认值,在当前页面中打开;attachment,以附件形式打开。例如文件下载。 - 响应空行:分割响应头和响应体
- 响应体:封装响应参数
核心对象
servlet是用来与浏览器通信的接口,服务器与浏览器之间的请求和响应由request和response对象来实现。request和response对象是由服务器创建,其中request对象是用来获取请求消息,response对象是来设置响应消息的。
request对象
- 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(); //获取所有请求头名称
}
- 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);获取时不会报错,且只会获取第一个参数值。
- 请求中文乱码解决:
request.setCharacterEncoding("utf-8");
- request的转发:
request.getRequestDispatcher("/failServlet").forward(request,response);
response对象
- response的常用方法
// 设置状态码
response.setStatus(200);
// 设置请求头
response.setHeader("Content-disposition","in-line");
- 响应中文乱码解决
// 1. 设置响应数据的编码,解决乱码的问题
response.setCharacterEncoding("utf-8");
// 通知浏览器解析编码,上面那句可以省略
response.setHeader("content-type","text/html;charset=utf-8");
// 2. 简易写法
response.setContentType("text/html;charset=utf-8");
第一种写法还可以省略第一句。
- 获取输出流,将数据回写到浏览器中。分为字符输出流getWriter()和字节输出流getOutputStream()。
// 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("<h1>hello world!</h1>");
writer.write("字符流输出流demo");
// 获取输出流
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("字节流输出demo".getBytes());
- response的重定向,主要使用sendRedirect方法做重定向操作
// 1.设置响应头重定向
response.setStatus(302);
response.setHeader("location","/servlet/demo");
// 2.简单重定向
response.sendRedirect("/servlet/demo");
注:send写绝对路径时要在前面加虚拟路径,即访问项目的根路径。forward可不加
- 重定向和转发的区别:
① 重定向地址栏会发生变化,转发地址栏路径不变
② 重定向可访问其他服务器的资源,转发只能访问自己服务器的资源
③ 重定向有两次请求,转发只有一次请求
④ 重定向不能共享数据,转发可共享数据。
ServletContext对象
在前面通过请求和响应的功能有了request对象和response对象。但它们能共享数据的范围比较有局限性,根据共享数据的范围有ServletContext对象、Cookie对象、Session对象。ServletContext对象在服务器初始化时就会创建,它的对象范围是所有用户的请求资源。
- 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实现的,存储在客户端中,发送请求的时候带到服务器中,再由服务器端返回存储到客户端。
- 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的值
}
-
cookie的存活时间:
持久化存储:setMaxAge(int seconds); 其中seconds填入秒,取值的三种情况:
① 正数:将Cookie数据存储到硬盘中,在指定时间内有效。
② 负数:默认值,浏览器关闭时,Cookie数据被销毁。
③ 0:删除cookie数据 -
数据共享
同一个服务器中的多个web项目,默认情况不能共享cookie数据。若设置cookie的获取范围为服务器的虚拟目录,则可以共享cookie数据。
不同服务器之间cookie数据的共享数据,不同服务器间的一级域名相同即可。
// 设置cookie获取范围的路径
cookie.setPath("/servlet");
// 设置cookie获取范围的域名
cookie.setDomain(".baidu.com"); // 域名为tieba.baidu.com,也可以共享该cookie数据
- cookie的特点和作用
cookie存储数据在客户端浏览器
浏览器对于单个cookie限制为4kb大小,对同一域名的cookie数量限制为20个
Session对象
服务器端会话技术,在一次会话的对此请求间共享数据,将数据保存在服务器端的对象HttpSession中。客户端带着cookie请求服务器端时,服务器端会在响应头中添加一个名为JSWSSIONID的cookie,值为session的ID,session是依赖cookie实现的。
- 持久化存储:在cookie中给名为JSWSSIONID设置持久化操作。
- 活化和钝化:避免存储在session中的数据丢失,tomcat已实现
session的活化:在服务器正常关闭之前,将session对象系列化存储在硬盘中。
session的钝化:在服务器启动之后,将session文件转化成内存中的session对象,反序列化。 - 有效时间:默认失效时间30min
- 特点:
session用于存储一次会话中多次请求的数据,存在服务器端。
session可以存储任意数据类型,无大小限制。 - session和cookie的区别:
① session存储在服务器端,cookie存储在客户端。
② session没有数据大小限制,单个cookie限制4kb
③ session有数据安全,cookie相对于不安全 - 获取session对象
HttpSession session = request.getSession();
前端技术
JSP
JSP:Java Server Pages,java服务器端页面,支持html代码和java代码。本质是一个Servlet,继承HttpServlet,能将页面的里面转化为java代码。
-
指令:用于配置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” %> -
脚本格式
<% java代码 %>:定义的java代码,在service方法中。
<%! java代码 %>:定义的java代码,在jsp转化为servlet类中的成员变量位置,即定义成员变量。
<%= java代码 %>:展示到页面上。 -
内置对象:再JSP界面中不需要创建,就可以直接使用。
变量名 | java类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,并且可以获取其他八个内置对象 |
request | HttpServletRequest | 请求对象 |
session | HttpSession | session对象 |
application | ServletContext | 服务器共享数据 |
response | HttpServletResponse | response对象 |
page | Object | 当前页面的servlet对象,相当于this |
out | JspWriter | jsp的输出对象,数据输出到页面上展示 |
config | ServletConfig | servlet的配置对象 |
exception | Throable | 异常对象 |
EL表达式
- EL:Expression Language,表达式语言,简化jsp页面中的java代码
- 语法:${表达式}
- 注意:jsp默认支持el表达式,忽略el表达式:
①在page中设置isELIgnored=“true”。
②忽略某个el表达式:${表达式} - 四个域对象
pageScope
requestScope
sessionScope
applicationScope - empty/not empty:判断对象是否为空或长度是否为0
JSTL表达式
-
JSTL:JavaServer Pages Tag Library,jsp标准标签库,简化jsp页面的java代码 。使用jstl之前要先引入标签库,<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
-
常用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请求
- 概念:Asynchronous JavaScript And XML,异步的JavaScript和xml。ajax可以局部刷新页面
- 异步和同步
异步:客户端在等待服务器响应里,可以进行其他操作。
同步:客户端在等待服务器响应里,不可以进行其他操作。 - 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
- 概念:JavaScript Object Notation,JavaScript对象表示法。用于存储和交换数据,进行数据传输,多用于客户端和浏览器之间的数据传输。
- JSON解析器:用于与java对象的相互转换,常用的解析器有Jsonlib,Gson,fastjson,jackson。这里不做详细介绍
- JSON注解:@JSONIgnore:放在属性上,表示转化JSON时,忽略该属性。@JSONFormat:放在属性上,对该属性值进行格式化。
过滤器和监听器
Filter过滤器
- 概念:拦截一些请求,并可以对拦截下来的请求做逻辑处理。
- 基础代码:自定义过滤器要实现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() {
}
}
- 配置过滤器的拦截路径
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 {
// 省略其他代码
}
- 过滤器执行的顺序:注解配置的,根据类名的字符串进行比较,小的先执行。xml配置的,<filter-mapping>标签在前面的先执行。
拦截配置
- 拦截路径配置:
具体资源路径:/index.jsp。只有访问index.jsp资源时,过滤器执行。
拦截目录:/user/*。访问/user目录下的所有资源时,过滤器都会执行。
后缀名拦截:*.jsp。访问后缀名为jsp的资源时,过滤器会执行。
拦截所有资源:/*。访问所有资源,过滤器都会执行。
注意:拦截后缀名时,前面不能加/
-
拦截方式配置:设置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监听器
- 注解配置
@WebListener
public class DemoListener implements ServletContextListener {
/**
* 监听器初始化方法,服务器启动时调用
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
}
/**
* 监听器销毁方法,服务器关闭时调用
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
- 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>
附录
-
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方法只能给对象的属性赋值或获取属性值。