day12_servlet常用对象

day12_servlet常用对象

1.servlet的线程特性

单实例 多线程

1.成员变量是共享数据 如果对成员变量有写操作 线程不安全

2.加锁 效率下降比较明显

在servlet中不要随意使用成员变量 (是共享数据)

注意如果使用ThreadLocal 数据使用完毕需要清空

2.域对象

域对象
    1服务器自动创建的对象
    2每个对象有不同的生命周期
    3设计目的是在服务器访问过程中共享数据
    
    .setAttrivute("key",Object);
    .getAttribute("key")

1request域

1请求进入是生效 请求返回失效(每次请求都是新的对象)

2在一次请求间共享数据

3配合请求转发使用 才有实际共享数据的意义

package com.javasm.controller;
​
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
 * @author: gfs
 * @date: 2025/10/16 10:21
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/reqDemo1")
public class RequestDemo1 extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //request域 HttpServletRequest 合并到这个对象中
​
        req.setAttribute("reqKey","reqVal");
​
        String reqKey =(String) req.getAttribute("reqKey");
​
        System.out.println("demo1:"+reqKey);
        //请求转发
        req.getRequestDispatcher("reqDemo2").forward(req,resp);
​
    }
}
​
package com.javasm.controller;
​
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
 * @author: gfs
 * @date: 2025/10/16 10:21
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/reqDemo2")
public class RequestDemo2 extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //request域 HttpServletRequest 合并到这个对象中
​
        String reqKey =(String) req.getAttribute("reqKey");
        
        System.out.println("demo2:"+reqKey);
    }
}
​

2session域

1与浏览器进程绑定 同一个浏览器进程用同一个session对象

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

3失效条件

1浏览器关闭

2超过有效时间 (心跳机制 tomcat默认设置半个小时)

3通过代码直接设置失效

package com.javasm.controller;
​
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
 * @author: gfs
 * @date: 2025/10/16 10:27
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@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.controller;
​
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
 * @author: gfs
 * @date: 2025/10/16 10:27
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@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);
    }
}
​

3servletContext域

1服务器启动创建 服务器关闭 销毁 全局共享

2一般用来放公共参数 做读取使用

package com.javasm.controller;
​
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
 * @author: gfs
 * @date: 2025/10/16 10:27
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/scDemo1")
public class ServletContextDemo1 extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //session 会话
        ServletContext servletContext = req.getServletContext();
​
        servletContext.setAttribute("scKey","scVal");
​
        String sesKey =(String) servletContext.getAttribute("scKey");
​
        System.out.println("demo1:"+sesKey);
    }
}
​
package com.javasm.controller;
​
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
 * @author: gfs
 * @date: 2025/10/16 10:27
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/scDemo2")
public class ServletContextDemo2 extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //session 会话
        ServletContext servletContext = req.getServletContext();
​
        String sesKey =(String) servletContext.getAttribute("scKey");
​
        System.out.println("demo2:"+sesKey);
    }
}
​

3Servlet中常用对象

3.1ServletContext
//ServletContext  服务器对象 application
/*
* 方法大多与全局参数 设置相关
* servletContext.getContextPath()            获得项目根路径/day12
* servletContext.getRealPath("/")            获得部署的实际路径
* servletContext.getInitParameter("charset") 获得全局初始化参数
* */
package com.javasm.controller2;
​
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
 * @author: gfs
 * @date: 2025/10/16 10:37
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/servletContextDemo")
public class ServletContextDemo extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //ServletContext  服务器对象 application
       /*
       * 方法大多与全局参数 设置相关
       * servletContext.getContextPath()            获得项目根路径/day12
       * servletContext.getRealPath("/")            获得部署的实际路径
       * servletContext.getInitParameter("charset") 获得全局初始化参数
       * */
        ServletContext servletContext = req.getServletContext();
        //获取项目入口  项目根 /day12 方便拼接路径
        String contextPath = servletContext.getContextPath();
        System.out.println(contextPath);
        //获取项目运行的实际路径 本地IO操作 配合服务器访问
        String realPath = servletContext.getRealPath("/");
        System.out.println(realPath);
        //可以把参数配置到配置文件中
        String charset = servletContext.getInitParameter("charset");
        System.out.println(charset);
​
    }
}
​
3.2servletConfig(了解)

servlet配置信息对象

用来获取servlet中的配置参数

3.3HttpServletRequest 请求对象
//HttpServletRequest  加入了对http报文结构的解析
/*
* 1 解析了http请求报文
* 2 做域对象
* 3 控制请求转发
*
* */
1获取请求报文参数
        * 获取参数
        * req.getParameter("name")         获取单个参数
        * req.getParameterValues("hobby")  获取一组参数
        * req.getParameterMap()            获取tomcat解析后的完整参数map
        * req.getInputStream()             获取请求体的输入流 配合自定义解析数据使用
        *                                  让tomcat读 或者自己读 两种方式有互斥
package com.javasm.controller2;
​
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: RequestDemo
 * @author: gfs
 * @date: 2025/10/16 10:53
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/requestDemo")
public class RequestDemo extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //HttpServletRequest  加入了对http报文结构的解析
        /*
        * 1 解析了http请求报文
        * 2 做域对象
        * 3 控制请求转发
        *
        * */
        //设置请求字符编码 搭配post方式使用 需要在第一次解析前调用
        req.setCharacterEncoding("utf-8");
​
        /*
        * 获取参数
        * req.getParameter("name")         获取单个参数
        * req.getParameterValues("hobby")  获取一组参数
        * req.getParameterMap()            获取tomcat解析后的完整参数map
        * req.getInputStream()             获取请求体的输入流 配合自定义解析数据使用
        *                                  让tomcat读 或者自己读 两种方式有互斥
        *
        *
        * */
​
        //获取请求参数 get/post都用这个方法
//        String name = req.getParameter("name");
//        System.out.println(name);
//
//        String hobby = req.getParameter("hobby");
//        System.out.println(hobby);
//        String[] hobbies = req.getParameterValues("hobby");
​
//        Map<String, String[]> parameterMap = req.getParameterMap();
//
//        System.out.println(parameterMap.get("name")[0]);
//        System.out.println(parameterMap.get("hobby")[0]);
//        System.out.println(parameterMap.get("hobby")[1]);
​
        //读请求体 报文原始数据
        ServletInputStream inputStream = req.getInputStream();
        //自定义数据解析格式 需要搭配post 启用请求体
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        System.out.println(br.readLine());
​
        //流只能读一次
        String username = req.getParameter("username");
        System.out.println(username);
​
​
​
​
    }
}
​
2获取请求路径相关信息
                // 获得项目根路径/day12
                String contextPath = req.getContextPath();
                System.out.println(contextPath);
                //协议
                System.out.println(req.getScheme());
                //主机
                System.out.println(req.getServerName());
                //端口
                System.out.println(req.getServerPort());
                //统一资源定位符
                System.out.println(req.getRequestURL());
                //统一资源标识符
                System.out.println(req.getRequestURI());
                //获取servlet配置的路径
                System.out.println(req.getServletPath());
3做域对象
.setAttrivute("key",Object);
.getAttribute("key")
4.做请求转发
//请求转发
req.getRequestDispatcher("reqDemo2").forward(req,resp);
3.4HttpServletResponse 响应对象
1 设置响应报文相关参数
2 获得输出流 输出返回信息  页面/json字符串
3 推200之外的响应码    
4 做页面重定向  通知浏览器 向指定地址再发一次请求    

package com.javasm.controller2;
​
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: ResponseDemo
 * @author: gfs
 * @date: 2025/10/16 11:34
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/responseDemo")
public class ResponseDemo extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //HttpServletResponse 响应对象
        //标记响应数据类型
//        resp.setContentType("text/html;charset=utf-8");
//        //resp.setContentType("application/json;charset=utf-8");
//        //获得输出流
        PrintWriter writer = resp.getWriter();
        //输出页面html标签
        //标准json格式字符串
        //最终转成字符发送
        //writer.print();
​
        //推响应码
        //resp.sendError(500);
        //写cookie
        //resp.addCookie();
        //换一个页面
        //resp.sendRedirect("/day12/myPage.html");
​
    }
}
​

3.5HttpSession对象

做域对象

        //设置
        session.setAttribute("key","value");
        // 读取
        String key =(String) session.getAttribute("key");
        //删除
        session.removeAttribute("key");

控制session

        //检查是否是同一个session对象
        String id = session.getId();
        System.out.println(id);
​
        //设置有效时间 默认tomcat半小时 可以通过代码设置
        //session.setMaxInactiveInterval(5);
        //立即失效
        session.invalidate();

package com.javasm.controller2;
​
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: SessionDemo
 * @author: gfs
 * @date: 2025/10/16 14:31
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
@WebServlet("/sessionDemo")
public class SessionDemo extends HttpServlet {
​
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​
        //session对象(HttpSession  )  会话域
        //session获取
        HttpSession session = req.getSession();
        //设置
        session.setAttribute("key","value");
        // 读取
        String key =(String) session.getAttribute("key");
        //删除
        session.removeAttribute("key");
​
        //检查是否是同一个session对象
        String id = session.getId();
        System.out.println(id);
​
        //设置有效时间 默认tomcat半小时 可以通过代码设置
        //session.setMaxInactiveInterval(5);
        //立即失效
        session.invalidate();
​
        /*
        * 1. 做数据共享 在用户访问过程中读取和使用
        * 2. 做访问控制
        *
        * */
​
​
    }
}
​

访问控制场景

4后端代码分层

控制层 controller

业务逻辑层 service

数据持久层 dao

jdbc

本质是TCP连接

package com.javasm.dao.impl;
​
import com.javasm.dao.LoginDao;
import com.javasm.entity.User;
​
import java.sql.*;
​
/**
 * @className: LoginDaoImpl
 * @author: gfs
 * @date: 2025/10/16 15:21
 * @version: 0.1
 * @since: jdk17
 * @description:
 */
public class LoginDaoImpl implements LoginDao {
​
    @Override
    public User login(String name, String password) {
        //jdbc 流程比较复杂
        User user = null;
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //1 创建连接
            //加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //创建连接
            connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "root");
            //2准备请求数据请求
            String sql = "select * from `user` where `name` = ? and `password` = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,name);
            preparedStatement.setString(2,password);
            //3发送请求 接收反馈
            resultSet = preparedStatement.executeQuery();
            //4读取响应报文中的数据内容 做成java中的对象数据
            if(resultSet.next()){
                int id = resultSet.getInt("id");
                String nameDB = resultSet.getString("name");
                String passwordDB = resultSet.getString("password");
                String addr = resultSet.getString("addr");
                int age = resultSet.getInt("age");
                user = new User(id, nameDB, passwordDB, age, addr);
            }
​
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            try{
                if(resultSet!=null)resultSet.close();
                if(preparedStatement!=null)preparedStatement.close();
                if(connection!=null)connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
​
        }
        return user;
    }
}
​

servlet 动态网页技术 数据是动态生成的 通过逻辑控制数据的动态显示

html 静态网页技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值