JavaWeb学习笔记(2)


这是续写
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 特点

  1. cookie是在浏览器中保存的
  2. 如果想要使用cookie要保证我们的浏览器是开启cookie,所以说有一定的弊端,如果浏览器没有开启cookie,就不能再使用cookie了
  3. cookie的大小是有限制的,通常是4096byte
  4. 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进行设置,获取和删除。

  1. 设置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"));
        }
    }
    
  2. 获取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());
            }
        }
    }
    
  3. 删除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 特点

  1. cookie保存数据类型是单一的,只能保存字符串类型的数据,session可以保存任意类型
  2. cookie的大小有限制,session没有大小的限制,以键值对形式存放在服务器中

14.2.3 工作原理

简单的工作原理示意图

image-20240604191003801

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也发生改变image-20240604192701808

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 概念

  1. Listener是Servlet的监听器

  2. 监听客户端的请求和服务器端的操作

  3. 通过实现Listener接口的类可以在特定事件(Event)发生时,自动激发一些操作

  4. 监听器是Web应用程序事件模型的一部分

  5. Web应用中的某些状态发生改变时会产生相应的事件

ServletContext、HttpSession、ServletRequest三个域对象引发的事件

域对象中的属性引发的事件

15.2.2 分类

image-20240604193213873

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>

image-20240604194535756

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值