day12_servlet常用对象

day12_servlet常用对象

1servlet线程特性

1.tomcat服务器是多线程的

2.servlet是单实例的

servlet是否线程安全 1是否有共享数据 2写操作

成员变量是共享数据

对成员变量 做写操作 线程不安全

不要使用成员变量 做写操作

2通过域对象做数据共享

request 请求域

1一次请求间有效
2当访问到服务器时 request域对象自动创建  响应返回即销毁
3需要搭配请求转发使用    请求转发 一次请求可以访问多个servlet 通过request域共享数据

session 会话域

1访问到服务器时自动创建 需要通过代码触发
2同一个浏览器进程 多次访问间 可以使用到同一个session对象 在多次访问间共享数据
3失效条件
     1浏览器进程关闭
     2默认时效到期 心跳机制 
     3通过服务端的代码直接失效

servletContext 服务器域

1服务器启动时自动创建   服务器关闭时自动销毁   
2全局共享的对象  
3主要用来放服务器的公共参数 不要做写操作    

域对象 (共享数据) 空map

setAttribute('key',Object)

getAttribute('key')

image-20250808101534065

request域对象的使用

1每次请求都是新的request对象 默认不能共享

2需要搭配请求转发使用 一次请求中 多个service()可以共享request对象 和其中的数据

写+读

package com.javasm.scopedemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @className: RequestDemo1
 * @description:
 * @author: gfs
 * @date: 2025/8/8 10:34
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/reqDemo1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //request域  req

        req.setAttribute("reqkey","reqval");
        String reqkey =(String) req.getAttribute("reqkey");
        System.out.println(reqkey);


        req.getRequestDispatcher("reqDemo2").forward(req,resp);

    }
}

package com.javasm.scopedemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @className: RequestDemo1
 * @description:
 * @author: gfs
 * @date: 2025/8/8 10:34
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/reqDemo2")
public class RequestDemo2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //request域  req

        String reqkey =(String) req.getAttribute("reqkey");
        System.out.println(reqkey);

    }
}

session域对象

1绑定浏览器进程 不同的浏览器进程有独立的对象(有数据隔离)

2同一个浏览器进程 多次访问间 可以共享数据

3占用服务器内存 不能无限期有效 失效条件

​ 1浏览器进程关闭

​ 2超过访问间隔

​ 3通过代码设置session失效

写+读

package com.javasm.scopedemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @className: SessionDemo1
 * @description:
 * @author: gfs
 * @date: 2025/8/8 10:43
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/sesDemo1")
public class SessionDemo1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //绑定浏览器进程
        //获取session
        HttpSession session = req.getSession();

        session.setAttribute("seskey","sesval");
        String seskey =(String) session.getAttribute("seskey");
        System.out.println("Demo1打印"+seskey);

    }
}

package com.javasm.scopedemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @className: SessionDemo1
 * @description:
 * @author: gfs
 * @date: 2025/8/8 10:43
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/sesDemo2")
public class SessionDemo2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //绑定浏览器进程
        //获取session
        HttpSession session = req.getSession();

        String seskey =(String) session.getAttribute("seskey");
        System.out.println("Demo2打印"+seskey);

    }
}

servletContext域对象

1全局共享 用来放公共参数

2服务器启动自动创建 服务器关闭自动销毁

写+读

package com.javasm.scopedemo;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @className: SessionDemo1
 * @description:
 * @author: gfs
 * @date: 2025/8/8 10:43
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/scDemo1")
public class ServletContextDemo1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext servletContext = req.getServletContext();
        //ServletContext servletContext1 = this.getServletContext();


        servletContext.setAttribute("sckey","scval");
        String sckey =(String) servletContext.getAttribute("sckey");
        System.out.println("Demo1打印"+sckey);

    }
}

package com.javasm.scopedemo;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @className: SessionDemo1
 * @description:
 * @author: gfs
 * @date: 2025/8/8 10:43
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/scDemo2")
public class ServletContextDemo2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext servletContext = req.getServletContext();
        //ServletContext servletContext1 = this.getServletContext();

        String sckey =(String) servletContext.getAttribute("sckey");
        System.out.println("Demo2打印"+sckey);

    }
}

3常用对象

3.1 HttpServletContext

服务器对象 主要是全局的设置和获取

package com.javasm.javaEEObj;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @className: ServletContextDemo
 * @description:
 * @author: gfs
 * @date: 2025/8/8 10:59
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/servletContextDemo")
public class ServletContextDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ServletContext 服务器对象
        ServletContext servletContext = req.getServletContext();
        //可以做域对象
        //可以动态获取到配置的项目名 主要拼相对根路径使用
        String contextPath = servletContext.getContextPath();
        System.out.println(contextPath);
        //可以动态获取运行代码的实际目录 使用本地IO操作
        String realPath = servletContext.getRealPath("/");
        System.out.println(realPath);
        //web服务器启动时 一般都会自动读取指定的配置文件 配合服务器功能使用
        String charset = servletContext.getInitParameter("charset");
        System.out.println(charset);


    }
}

3.2ServletConfig

servlet配置对象 获取servlet配置的信息 了解即可

3.3 HttpServletRequest

请求对象 主要三个作用

1 解析了请求报文 把报文中主要参数放入request对象
2 request域的域对象
3 做请求跳转(请求转发)    
        req.setCharacterEncoding("utf-8");  设置字符编码 处理请求乱码
        req.getParameter("参数key")          获取请求参数
        req.getParameterValues("hobby")     获取同名参数 hobby=1&hobby=2 返回值字符串数组
        req.getParameterMap()               Map<String, String[]>
        req.getInputStream()                获得请求体输入流 可以自定义解析请求体中的数据
        
        //获得项目入口(项目名路径)    
        System.out.println(req.getContextPath());

        //URL 统一资源定位符  可以实际访问的地址
        System.out.println(req.getRequestURL());
        //URI 统一资源标识符   /day12/reqDemo
        System.out.println(req.getRequestURI());
        //获取servlet配置的路径
        System.out.println(req.getServletPath());
//         req.setAttribute() 域对象设置键值对
//         req.getAttribute() 域对象读取键值对
req.getRequestDispatcher("地址").forward(req,resp);
一次请求中 在不同的servlet之间跳转
package com.javasm.javaEEObj;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;

/**
 * @className: HttpRequestDemo
 * @description:
 * @author: gfs
 * @date: 2025/8/8 11:30
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/reqDemo")
public class HttpRequestDemo extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //HttpServletRequest 请求对象
       //1 解析了请求报文 把报文中主要参数放入request对象
//        req.setCharacterEncoding("utf-8");  设置字符编码 处理请求乱码
//        req.getParameter("参数key")          获取请求参数
//        req.getParameterValues("hobby")     获取同名参数 hobby=1&hobby=2 返回值字符串数组
//        req.getParameterMap()               Map<String, String[]>
//        req.getInputStream()                获得请求体输入流 可以自定义解析请求体中的数据
       //2 request域的域对象
//         req.setAttribute();
//         req.getAttribute()
       //3 做请求跳转(请求转发)
//        req.getRequestDispatcher("地址").forward(req,resp);

        req.setCharacterEncoding("utf-8");
//        String parameter = req.getParameter("name");
//        System.out.println(parameter);
//        //空值   没有key     null
//        //      有key没有值  ""
//        String[] hobby = req.getParameterValues("hobby");
//        System.out.println(hobby[2]);

//        会把参数解析成map集合
//        Map<String, String[]> parameterMap = req.getParameterMap();
//        System.out.println(parameterMap.get("name")[0]);
//        System.out.println(parameterMap.get("hobby")[2]);

//        可以手动读取和解析请求体的数据
        //只有请求体的输入流
        //自己读取参数流 与tomcat默认封装护持 流默认只能读一次
//        ServletInputStream inputStream = req.getInputStream();
//        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//        System.out.println(bufferedReader.readLine());
//        //框架中会利用这个功能 把数据直接转对象
//        System.out.println(req.getParameter("name"));


        System.out.println(req.getProtocol());
        System.out.println(req.getServerName());
        System.out.println(req.getServerPort());
        System.out.println(req.getContextPath());

        //URL 统一资源定位符  可以实际访问的地址
        System.out.println(req.getRequestURL());
        //URI 统一资源标识符   /day12/reqDemo
        System.out.println(req.getRequestURI());
        //获取servlet配置的路径
        System.out.println(req.getServletPath());

    }
}

3.4HttpServletResponse

1.向浏览器输出页面标签/json数据
2.向浏览器推送响应码
3.通知浏览器做重定向     
        //返回html页面
        //resp.setContentType("text/html;charset=utf-8"); 
		//返回json数据
        resp.setContentType("application/json;charset=utf-8");
        //resp.getWriter() 获得输出流 通过输出流可以输出响应报文信息
        //响应体
        PrintWriter writer = resp.getWriter();

       //页面标签
        //writer.print("<h1>你好</h1>");
       //json字符串
 		writer.print("{\"name\":\"jack\",\"age\":15}");
        writer.close();
		//让tomcat传响应码给浏览器        
		resp.sendError(HttpServletResponse.SC_NOT_FOUND);
		//HttpServletResponse对象中 有响应码的常量数据

		//响应重定向  通知浏览器  再访问指定的地址		
		resp.sendRedirect("/day12/reqDemePage.html");
package com.javasm.javaEEObj;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @className: HttpResponseDemo
 * @description:
 * @author: gfs
 * @date: 2025/8/8 14:43
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/respDemo")
public class HttpResponseDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


        //返回html页面
        //resp.setContentType("text/html;charset=utf-8");
        resp.setContentType("application/json;charset=utf-8");
        //resp.getWriter() 获得输出流 通过输出流可以输出响应报文信息
        //响应体
        PrintWriter writer = resp.getWriter();

        writer.print("{\"name\":\"jack\",\"age\":15}");
        //writer.print("<h1>你好</h1>");
        writer.close();


        //resp.sendError(HttpServletResponse.SC_NOT_FOUND);

       // resp.sendRedirect("/day12/reqDemePage.html");
    }
}

3.5 HttpSession

session 会话对象 做域对象

1访问到服务器时自动创建 需要通过代码触发
2同一个浏览器进程 多次访问间 可以使用到同一个session对象 在多次访问间共享数据
3失效条件
     1浏览器进程关闭
     2默认时效到期 心跳机制 
     3通过服务端的代码直接失效
session.getId();   					检查是否同一个session对象
session.setMaxInactiveInterval(5);  设置失效的访问间隔    
session.invalidate();				session立即失效
    
session.setAttribute("key",value)   设置键值对
session.getAttribute("key")    		读取键值对
session.removeAttribute("key")    	删除键值对
package com.javasm.javaEEObj;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @className: HttpSessionDemo
 * @description:
 * @author: gfs
 * @date: 2025/8/8 14:56
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/sessionDemo")
public class HttpSessionDemo extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取session
        HttpSession session = req.getSession();
        //可以设置值获取值

        //两次访问的间隔时间 单位秒 tomcat默认半小时
       // session.setMaxInactiveInterval(5);

        //session编号 主要用来检查是否是同一个session对象
        String id = session.getId();
        System.out.println(id);

        //立刻让session失效
        //session.invalidate();
        session.setAttribute("session","sesionval");
        System.out.println(session.getAttribute("session"));
        session.removeAttribute("session");
        System.out.println(session.getAttribute("session"));




    }
}

session对象的常用功能

1 共享数据
2 访问控制     

image-20250808153914039

/login

package com.javasm.sessionDemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @className: LoginServlet
 * @description:
 * @author: gfs
 * @date: 2025/8/8 15:30
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("登录 验证用户名密码.....");

        /*相当于买票的过程*/
        HttpSession session = req.getSession();
        session.setAttribute("loginUser","xxxxx");

    }
}

/user

package com.javasm.sessionDemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @className: UserServlet
 * @description:
 * @author: gfs
 * @date: 2025/8/8 15:28
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/user")
public class UserServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();

        Object loginUser = session.getAttribute("loginUser");

        if(loginUser!=null){
            System.out.println("正常的服务代码...查用户信息");
        }else{
            System.out.println("没有登录...");
        }


    }
}

/logout

package com.javasm.sessionDemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @className: LogoutServlet
 * @description:
 * @author: gfs
 * @date: 2025/8/8 15:35
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        //session.invalidate();

        session.removeAttribute("loginUser");


    }
}

后端代码三层结构

image-20250808162751276

三层结构调用关系 controller 调用service service调用dao

image-20250808170640435

posted @ 2025-08-09 22:14  小胡coding  阅读(11)  评论(0)    收藏  举报