文章目录
这是续写
JavaWeb学习笔记(1)-CSDN博客
5 Servlet获取前端提交的参数
前面的数据都是自定义的数据,现实中参数是由前端带数据给servlet,我们要用servlet去接收这些数据
案例
login.jsp 登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--跳转地址为/login,请求方式为post-->
<form action="login" method="post">
<input type="text" name="username" placeholder="请输入账号">
<br>
<input type="text" name="password" placeholder="请输入密码">
</form>
</body>
</html>
/main/java/LoginServlet.java
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//setCharacterEncoding设置请求的编码格式
req.setCharacterEncoding("utf-8");
//getParameter获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//控制台打印
System.out.println("username="+username+"password="+password);
//设置响应的编码格式
resp.setContentType("text/html;charset=utf-8;msg=lisisi");
//将请求的数据响应到页面上
resp.getWriter().write("username="+username+"password="+password);
}
}
启动服务后在url后面输入login.jsp,跳转login页面
点击提交,跳转到login,页面显示提交的数据
通过这个案例可以简单获取前端提供的参数并且响应到前端页面上
6 中文乱码的解决方案
请求时候的乱码问题:
//前端发送数据到Servlet,如果是post请求的话,input输入中文数据的时候,Servlet接到的数据是乱码的。
request.setCharacterEncoding("utf-8");
响应时候中文乱码的问题:
//Servlet响应数据到客户端的时候,如果是中文的话,会乱码
response.setContentType("text/html;charset=utf-8");
7 重定向和转发
7.1重定向
7.1.1概念
用户通过浏览器发送一个请求,Tomcat服务器接收这个请求,会给浏览器发送一个状态码302,并设置一个重定向的路径,浏览器如果接收到了这个302的状态码以后,就会去自动加载服务器设置的路径。
7.1.2特点
- 重定向的过程是浏览器(客户端)的行为
- 实际上浏览器做了2次请求(当点击登录按钮的时候做了两次请求)
- 注意上一次请求的request对象会丢失
- 重定向有一个非常明显的特征,即浏览器的url变化了
7.1.3使用
response.sendRedirect("main.jsp"); //就这一行代码,但是这一行代码必须写在doGet或者doPost方法中
login.jsp
<%--
Created by IntelliJ IDEA.
User: 62727
Date: 2024/5/30
Time: 11:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--提供a标签进行跳转到/forward和/redirect-->
<h1>Redirect</h1>
<a href="redirect">redirect跳转</a>
</body>
</html>
RedirectServlet.java
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//这里再跳转到main.jsp
resp.sendRedirect("main.jsp");
}
}
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %> <!-- 确保这一行存在 -->
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这是main页面</h1>
</body>
</html>
启动服务器,进入login.jsp页面,点击a标签
成功跳转到main.jsp页面
7.2转发
7.2.1概念
用户发送数据请求到服务器,服务器接收当前请求,会调用内部方式(转发)处理该请求,最终把数据响应给客户端
7.2.2特点
- 转发是服务器的行为
- 浏览器在这个过程中只有一次行为
- 转发可以带有数据 request对象中
- url不会发生任何的变化
7.2.3使用
request.getRequestDispatcher(“main.jsp”).forward(request,response);
//这一行代码就表示进行了转发,url没有变,但是响应的结果却是一次请求干了两个活
login.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login" method="post">
<h1>Forward</h1>
<a href="forward">Forward跳转</a>
</form>
</body>
</html>
ForwardServlet.java
@WebServlet("/forward")
public class ForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// //设置字符编码
// req.setCharacterEncoding("utf-8");
req.setAttribute("name","张三");
//转发
req.getRequestDispatcher("main.jsp").forward(req,resp);
}
}
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %> <!-- 确保这一行存在 -->
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这是main页面</h1>
${name}
</body>
</html>
启动服务器
7.3转发和重定向的区别
区别 | 转发foeward() | 重定向redirect() |
---|---|---|
根目录 | 包含项目访问地址 | 没有项目访问地址 |
地址栏 | 不会发生变化 | 会发生变化 |
哪里跳转 | 服务器端进行跳转(servlet—>servlet) | 浏览器端进行跳转(servlet—>borswer) |
请求域中数据 | 不会丢失 | 会丢失 |
8 Servlet的自动加载
默认情况下,第一次访问servlet的时候,创建servlet对象。如果servlet构造函数里面的代码或者init方法里面的代码比较多,就会导致用户第一次访问servlet的时候比较慢。这个时候,我们可以改变servlet对象的创建时机:提前到加载web应用的时候。在servlet的配置信息中,加上一个<load-on-startup>
标签即可。
web.xml
<servlet>
<servlet-name>loadOnStartup</servlet-name>
<servlet-class>com.by.servlet.LoadOnStartupServlet</servlet-class>
<!--容器是否在启动时加载该servlet,数字越小优先级越高越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>loadOnStartup</servlet-name>
<url-pattern>/load</url-pattern>
</servlet-mapping>
LoadOnStartupServlet.java
public class LoadOnStartupServlet extends HttpServlet {
public LoadOnStartupServlet() {
System.out.println("无参构造running");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init running");
}
}
这样配置之后,servlet的构造函数和init方法就会在web应用加载的时候就会执行。
9 ServletConfig对象
9.1概念
ServletConfig是javax.servlet.包下的一个接口,ServletConfig它是Servlet的一个配置对象;
ServletConfig是由tomcat容器创建,通过init方法传入给Servlet;
9.2如何获取
可以通过调用GenericServlet里面的getServletConfig获取ServletConfig实例对象
9.3常用方法
- getInitParameter(String parameterName); //根据参数名称获取指定的参数
- getInitParameterNames(); //获取所有的参数名称
9.4案例
初始化servlet参数
web.xml
<servlet>
<servlet-name>servleconfig</servlet-name>
<servlet-class>com.by.servlet.ServletConfigServlet</servlet-class>
<!--通过init-param初始化两个参数username和password-->
<init-param>
<param-name>username</param-name>
<param-value>王五</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>147258369</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servleconfig</servlet-name>
<url-pattern>/servleconfig</url-pattern>
</servlet-mapping>
ServletConfigServlet.java
public class ServletConfigServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletConfig对象
ServletConfig servletConfig = getServletConfig();
String username = servletConfig.getInitParameter("username");
String password = servletConfig.getInitParameter("password");
System.out.println("username:"+username+"password"+password);
}
}
测试
10 ServletContext对象
10.1概念
ServletContext是javax.servlet包下的一个接口,又称上下文对象,是配置对象也是一个域对象;当服务器启动时,会为服务器中的每一个web应用程序创建一个ServletContext对象;在web应用中的servlet要想实现资源的共享,可以通过ServletContext来完成;可以看作是一个全局域对象
10.2如何获取
和ServletConfig类似,也是通过调用GenericServlet里面的getServletContext获取ServletContext实例对象
10.3常用方法
- getInitParameter() //获取指定参数名称的全局参数值
- getRealPath(String path) //获得当前项目的服务器磁盘路径
- getContextPath() //获取项目的根路径
- getAttribute(String parameterName) //获取ServletContext域中指定名称的参数值;
- setAttribute(String paramterName,Object parameterValue) //存储参数到ServletContext域中;
- removeAttribute(String parameterNam) //将ServletContext域中指定名称的参数移除;
10.4使用
创建3个ServletContext类,实现对同一数据增删
web.xml
<servlet>
<servlet-name>context1</servlet-name>
<servlet-class>com.by.servlet.ServletContextServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context1</servlet-name>
<url-pattern>/context1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>context2</servlet-name>
<servlet-class>com.by.servlet.ServletContextServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context2</servlet-name>
<url-pattern>/context2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>context3</servlet-name>
<servlet-class>com.by.servlet.ServletContextServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context3</servlet-name>
<url-pattern>/context3</url-pattern>
</servlet-mapping>
添加数据ServletContextServlet1
public class ServletContextServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取对象
ServletContext servletContext = getServletContext();
//添加数据
servletContext.setAttribute("msg2","好你");
servletContext.setAttribute("msg","你好");
System.out.println("添加成功!!");
}
}
获取数据ServletContextServlet2
public class ServletContextServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取对象
ServletContext servletContext = getServletContext();
//获取数据
Object msg = servletContext.getAttribute("msg");
System.out.println("msg:"+msg);
Object msg2 = servletContext.getAttribute("msg2");
System.out.println("msg2:"+msg2);
}
}
删除数据ServletContextServlet3
public class ServletContextServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取对象
ServletContext servletContext = getServletContext();
//删除数据
servletContext.removeAttribute("msg");
System.out.println("删除成功!");
}
}
测试结果
10 ServletContext对象
10.1概念
ServletContext是javax.servlet包下的一个接口,又称上下文对象,是配置对象也是一个域对象;当服务器启动时,会为服务器中的每一个web应用程序创建一个ServletContext对象;在web应用中的servlet要想实现资源的共享,可以通过ServletContext来完成;可以看作是一个全局域对象
10.2如何获取
和ServletConfig类似,也是通过调用GenericServlet里面的getServletContext获取ServletContext实例对象
10.3常用方法
- getInitParameter() //获取指定参数名称的全局参数值
- getRealPath(String path) //获得当前项目的服务器磁盘路径
- getContextPath() //获取项目的根路径
- getAttribute(String parameterName) //获取ServletContext域中指定名称的参数值;
- setAttribute(String paramterName,Object parameterValue) //存储参数到ServletContext域中;
- removeAttribute(String parameterNam) //将ServletContext域中指定名称的参数移除;
10.4使用
创建3个ServletContext类,实现对同一数据增删
web.xml
<servlet>
<servlet-name>context1</servlet-name>
<servlet-class>com.by.servlet.ServletContextServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context1</servlet-name>
<url-pattern>/context1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>context2</servlet-name>
<servlet-class>com.by.servlet.ServletContextServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context2</servlet-name>
<url-pattern>/context2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>context3</servlet-name>
<servlet-class>com.by.servlet.ServletContextServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>context3</servlet-name>
<url-pattern>/context3</url-pattern>
</servlet-mapping>
添加数据ServletContextServlet1
public class ServletContextServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取对象
ServletContext servletContext = getServletContext();
//添加数据
servletContext.setAttribute("msg2","好你");
servletContext.setAttribute("msg","你好");
System.out.println("添加成功!!");
}
}
获取数据ServletContextServlet2
public class ServletContextServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取对象
ServletContext servletContext = getServletContext();
//获取数据
Object msg = servletContext.getAttribute("msg");
System.out.println("msg:"+msg);
Object msg2 = servletContext.getAttribute("msg2");
System.out.println("msg2:"+msg2);
}
}
删除数据ServletContextServlet3
public class ServletContextServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取对象
ServletContext servletContext = getServletContext();
//删除数据
servletContext.removeAttribute("msg");
System.out.println("删除成功!");
}
}
测试结果
11 Request对象
11.1概念
ServletRequest是一个接口,用户访问服务器,服务器会生成一个对象包含了http所有请求头,由于使用的是http协议,所以该对象的名字叫HttpServletRequest。
Request是tomcat创建的请求对象和域对象
request对象还包含了前端提交参数和请求头
11.2常用方法
getRequestURL() //获取的完整的URL,即统一资源定位符
getRequestURI() //获取资源的名字,即统一资源标识符
getQueryString() //获取一个url参数部分
getRemoteAddr() //返回的是客户端的ip地址
getRemoteUser() //返回的是客户端的用户
getRemotePort() //返回的是客户端的主机的端口号
getRemoteHost() //返回的是客户端的主机地址
getCookie() //获取Cookie对象
getSession() //获取Session对象
getLocalName() //获取Web服务器主机的名字
getServletContext() //获取上下文对象的
setCharacterEncoding() //设置编码集的
getParameter() //获取前端传过来的数据
setAttribute() //将数据设置给request对象
geAttribute() //获取request对象中的数据
11.3案例
RequestServlet.java
public class RequestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的url
StringBuffer requestURL = req.getRequestURL();
//获取请求的uri
String requestURI = req.getRequestURI();
System.out.println("requestURL:"+requestURL);
System.out.println("requestURI:"+requestURI);
//设置编码格式
req.setCharacterEncoding("UTF-8");
//获取请求头的信息
String AcceptEncoding = req.getHeader("Accept-Encoding");
System.out.println("Accept-Encoding:"+AcceptEncoding);
String accept = req.getHeader("Accept");
System.out.println("Accept:"+accept);
}
}
web.xml
<servlet>
<servlet-name>request</servlet-name>
<servlet-class>com.by.servlet.RequestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>request</servlet-name>
<url-pattern>/request</url-pattern>
</servlet-mapping>
12 Response对象
12.1 概念
是一个响应对象,把数据返回给客户端。Servlet紧紧围绕着两个点(Request,Response)请求和响应
12.2 常用方法
setHeader() //设置响应头的参数
setContentType() //设置字符编码集
getWriter() //获取字符输出流对象
getOutputStream()//获取字节输出流对象,这两个流不能同时出现
addCookie() //对浏览器新增一个Cookie
sendRedirect() //重定向
12.3 案例
ResponseServlet
public class ResponseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*往响应头传递数据 */
//方式一
resp.setHeader("Content-Type",
"text/html;charset=utf-8;msg=hello,response");
//方式二
//resp.setContentType("text/html;charset=utf-8;msg=sb");
/********往响应体传递数据********/
resp.getWriter().write("<h1>Response</h1>");
/************重定向***********/
//方式一
//在响应头中添加302状态码,告诉浏览器需要进行重定向
resp.setStatus(302);
//在响应头中添加Location,指定重定向的位置
resp.setHeader("Location", "https://www.mi.com/html/index.html");
//方式二
resp.sendRedirect("https://www.mi.com/html/index.html"); //包含方法一的两个功能
}
}
13 web三层架构
- web:表现层
com.by.servlet/web:servlet - service:业务层
com.by.service:service接口
com.by.service.impl:service实现类,业务 - dao:数据访问层
com.by.dao:dao接口
com.by.dao.impl:dao实现类,sql
web---->service—>dao
14 Cookie和Session
14.1 Cookie
14.1.2 概念
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客 户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
14.1.2 特点
- cookie是在浏览器中保存的
- 如果想要使用cookie要保证我们的浏览器是开启cookie,所以说有一定的弊端,如果浏览器没有开启cookie,就不能再使用cookie了
- cookie的大小是有限制的,通常是4096byte
- cookie的保存是以键值对的形式存在的
14.1.3 常用方法
//1.cookie的构造方法,目的是实例化出来cookie对象
Cookie(String name,String value)
//2.设置cookie的方法
setValue(String value) //修改cookie的值
getValue(String value) //获得cookie的值
getName(String value) //获得cookie的键
setMaxAge(int time) //设置cookie的有效时间
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);
//4.获得所有cookie
request.getCookies();
14.1.4 案例
对cookie的name和value进行设置,获取和删除。
-
设置cookie
@WebServlet("/setCookie") public class SetCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置请求和响应的编码格式 req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); //获取cookie对象并给name和value赋值 Cookie cookie = new Cookie("msg","这是我自定义msg的value"); //设置有效时间 0是销毁cookie 单位是秒 cookie.setMaxAge(60*60*24); //将cookie发送给浏览器 resp.addCookie(cookie); resp.addCookie(new Cookie("JSESSIONID","这是我自定义JSESSIONID的value")); } }
-
获取cookie
@WebServlet("/getCookie") public class GetCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置请求和响应的编码格式 req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); //获取cookie数组 Cookie[] cookies = req.getCookies(); //遍历cookie,获得cookie对象 for (Cookie cookie : cookies) { //在控制台输出name和value System.out.println("name:"+cookie.getName()+";~~~~value:"+cookie.getValue()); } } }
-
删除cookie
@WebServlet("/destroyCookie") public class DestroyCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //销毁cookie getCookies()返回的是数组 Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) {//遍历数组 //对name是msg的进行删除 if (cookie.getName().equals("msg")){ //setMaxAge()参数是0时为销毁 cookie.setMaxAge(0); //将新的cookie对象发送给浏览器 resp.addCookie(cookie); } } } }
14.2 Session
14.2.1 概念
session在网络应用中称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,session就是一个对象,用于存储信息。
14.2.2 特点
- cookie保存数据类型是单一的,只能保存字符串类型的数据,session可以保存任意类型
- cookie的大小有限制,session没有大小的限制,以键值对形式存放在服务器中
14.2.3 工作原理
简单的工作原理示意图
14.2.4 session的存储形式
session类似于一个Map,里面可以存放多个键值对,是以key-value进行存放的。key必须是一个字符串,value是一个对象。
14.2.5 session底层实现机制
session是每一个游览器(客户端)所唯一的,这个是怎么实现的呢?其实,在访问一个网站时,在HTTP请求中往往会携带一个cookie,这个cookie的名字是JSESSIONID,这个JSESSIONID表示的就是session的id,这个是由服务器创建的,并且是唯一的。服务器在使用session时,会根据JSESSIONID来进行不同操作。
14.2.6 常用方法
request.getSession(); //返回HttpSession
setAttribute(key,value); //设置属性 key ,value
getAttribute(key); //获取key的值
removeAttribute(String key) //通过key值删除数据
invalidate(); //将session中的变量全部清空
setMaxInactiveInterval(int interval); //设置session失效时间,单位为秒
getMaxInactiveInterval();//获取session失效时间
getId(); //获取sessionID
14.2.7 案例
实现新增session,获取session和销毁session
setSessionServlet.java
@WebServlet("/setSession")
public class SetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//设置属性
session.setAttribute("msg","nihao");
//给session设置一个时间,有效果的,里面放的是秒
session.setMaxInactiveInterval(60*60*24);
}
}
getSessionServlet
@WebServlet("/getSession")
public class GetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//获取属性
Object msg = session.getAttribute("msg");
System.out.println("msg:"+msg);
String id = session.getId();
System.out.println("sessionID:"+id);
}
}
destroySessionServlet
@WebServlet("/destroySession")
public class DestroySessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取session对象
HttpSession session = req.getSession();
//销毁当前的session
session.invalidate();
}
}
控制台输出结果,操作是先set,再get,这是获取到了设置的msg值和sessionid,然后destory再get可以看到session对象被销毁,msg的值为null,sessionid也发生改变
15 过滤器和监听器
15.1 过滤器Filter
15.1.1 概念
当浏览器向服务器发送请求的时候,过滤器可以将请求拦截下来,完成一些特殊的功能,比如:编码设置、权限校验、日志记录等。
15.1.2 案例
对请求和响应的数据设置编码格式为中文,filter必须实现Filter接口,过滤的请求执行完毕必须要放行,不然请求不会执行。
public class FilterDemo implements Filter//;实现接口
filterChain.doFilter(servletRequest,servletResponse);//放行
FilterDemo类
public class FilterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//设置编码集
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8"); //设置相应的编码格式
// System.out.println("请求进来,经过过滤器...");
//一个web路径,可以配置多个过滤器,这多个过滤器就被称为过滤器链
//过滤器放行
filterChain.doFilter(servletRequest,servletResponse);
// System.out.println("响应返回,经过过滤器...");
}
@Override
public void destroy() {
}
}
web.xml
<filter>
<filter-name>filter</filter-name>
<filter-class>com.by.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter的拦截路径的配置
1.拦截具体的资源路径:/index.jsp,只有访问index.jsp的时候才会被拦截
2.目录拦截:/user/*,访问/user下的所有资源,都会被拦截
3.后缀名拦截:*.do 访问后缀名为do的资源,都会被拦截
4.拦截所有:/* 访问所有的资源,都会被拦截
15.2 监听器Listener
15.2.1 概念
-
Listener是Servlet的监听器
-
监听客户端的请求和服务器端的操作
-
通过实现Listener接口的类可以在特定事件(Event)发生时,自动激发一些操作
-
监听器是Web应用程序事件模型的一部分
-
Web应用中的某些状态发生改变时会产生相应的事件
ServletContext、HttpSession、ServletRequest三个域对象引发的事件
域对象中的属性引发的事件
15.2.2 分类
15.2.3 案例
监听ServletContext和Session对象的创建和销毁
public class MyListener implements ServletContextListener, HttpSessionListener {//实现ServletContextListener, HttpSessionListener接口重写方法对context和session进行监听
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("tomcat服务器启动,创建servletContext对象");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("tomcat服务器关闭,销毁servletContext对象");
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("游览器第一次访问tomcat,创建session对象");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
web.xml
<listener>
<listener-class>com.by.listener.MyListener</listener-class>
</listener>