Request和Response

Request&Response

  1. request对象和response对象原理
    • request和response是由服务器创建的
    • request对象是用于获取请求消息
    • response对象用于设置响应消息

Request

  1. 体系结构
继承
实现
ServletRequset-接口
HttpServlet-接口
org,apache.catalina.connector.RequestFacade-类tomcat创建
  1. Requset功能
    • 获取请求消息数据
      1. 获取请求行数据:请求方法 /URI?key=value... HTTP/1.1
        • 获取请求方式(请求方法):String getMethod()
        • 获取虚拟目录(/资源地址):String getContxtPath()
        • 获取Servlet路径:String getServletPath()
        • 获取请求参数:Sting getQueryString()
        • 获取请求的URI(/URI):String getRequestURI()
        • 获取URL:String getRequestURL()
        • 获取协议及版本:String getProtocol()
        • 获取客户机IP:String getRemoteAddr()
      2. 获取请求头数据
        • 根据名称获取值:String getHeader(String name)
        • 获取全部的名称:Enumeration getHeaderNames()
        • user-agent:浏览器版本信息-可用于适配不同浏览器
        • referer:获取来源-可用于防盗链操作
      3. 获取请求体数据(只有POST请求方式才有请求体,封装了请求的参数)
        • 获取步骤:
          1. 获取流对象
            • 字符输入流:BufferedReader getReader()
            • 字节输入流:ServletInputStream getInputStream()
          2. 从流对象中获取数据
    • 其他功能:
      1. 获取请求参数通用方式
        1. String getParameter(String name) -> 根据参数名称获取参数值
        2. String[ ] getParameterValues(String name) -> 根据参数名称获取参数值数组(复选框)
        3. Enumeration getParameterNames() -> 获取所有的请求参数名
        4. Map<String, String[ ]> getParameterMap() ->获取所有参数的map集合
      2. 请求转发:一种在服务器内部的资源跳转方式
        • 转发步骤:
          1. 通过request对象回去请求转发器对象:RequestDispatcher getRequsetDispatcher(String path)
          2. 使用RequestDispatcher对象进行转发:forward(ServletRequest req, ServletResponse resp)
        • 特点:
          1. 浏览器地址栏不会发生变化
          2. 只能转发到当前服务器内部的资源
          3. 转发是一次请求
      3. 共享数据
        • 域对象:一个有作用范围的对象,可以在范围内共享数据
        • Request域:代表一次请求范围,一般用于请求转发的多个资源中共享数据
        • 共享方法:
          1. void setAttribute(String name, Object obj) -> 存储数据
          2. Object getAttribute(String name) -> 通过键获取数据
          3. void removeAttribute(String name) -> 通过名称移除数据
      4. 获取ServletContext
        • ServletContext getServletContext():org.apache.catalina.core.ApplicationContextFacade
    • 中文乱码:Tomcat8以上以get方式请求的数据不会乱码
      • POST方式解决办法(设置requset编码):req.setCharacterEncoding("utf-8");
登录案例
  • 用户登录案例需求:
    1. 编写login.html登录界面
    2. 使用Druid数据库连接池技术操作mysql
    3. 使用JdbcTemplate技术封装JDBC
    4. 登录成功后跳转到SuccessServlet展示:登录成功!用户名,欢迎您
    5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
  • 开发步骤
    1. 创建项目,编写html页面,配置文件,导入jar包
    2. 创建数据库环境
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32) UNIQUE NOT NULL,
	password varchar(32) NOT NULL
);
  1. 创建cn.study.domain,创建User类
public class User {

    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  1. 创建cn.study.dao,创建类UserDao,提供login方法

public class UserDao {

    /**
     * 声明JdbcTemplate公用
     */
    private final JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());

    /**
     * 登录方法
     * @param loginUser 只有用户名和密码
     * @return user包含所有的用户信息
     */
    public User login(User loginUser){
        try{
            //编写sql
            String sql = "SELECT * FROM USER WHERE username = ? and password = ?";
            //调用query方法
            User user = template.queryForObject(sql,
                    new BeanPropertyRowMapper<User>(User.class),
                    loginUser.getUsername(),loginUser.getPassword());
            return user;
        }catch (DataAccessException e){
            e.printStackTrace();
            return null;
        }
    }
}
  1. 编写cn.study.web.servlet.LoginServlet
  2. BeanUtils:简化数据的封装
    • 用于封装JavaBean:标准的Java类
      1. 类必须被public修饰
      2. 必须提供空参构造器
      3. 成员变量必须使用private
      4. 提供公共的setter,getter
    • 功能:封装数据
    • 方法:
      1. getProperty() -> 获取属性
      2. setProperty() -> 设置属性
      3. populate(Object obj,Map map) -> 封装对象

Response对象

  1. 功能:设置响应消息:
    1. 设置响应行
      • 设置状态码:setStatus(int sc)
    2. 设置响应头
      • 设置头:setHeader(String name, String value)
    3. 设置响应体(流)
      • 使用步骤:
        1. 获取输出流
          • 字符输出流:PrintWriter getWriter()
          • 字节输出流:ServletOutputStream getOutputStream()
        2. 使用输出流,将数据输出到客户端浏览器
    4. 完成重定向:资源跳转的方式
      • response.sendRedirect("URI")
      • 重定向特点
        1. 地址栏发生变化
        2. 重定向可以访问其他站点的资源
        3. 重定向是两次请求,不能使用request对象共享数据
      • 路径写法
        1. 路径的分类
          • 相对路径:不能确定唯一资源,以./开头
          • 绝对路径:可以确定唯一资源,以/开头
            • 规则:判断定义的路径给谁使用-判断请求从哪发出
              1. 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
              2. 给服务器使用:不需要加虚拟目录
    5. 服务器输出字符数据
      1. 获取字符输出流
      2. 输出数据
      • 乱码解决:resp.setContentType("text/html;charset=utf-8");
    6. 服务器输出字节数据
      1. 获取字节输出流
      2. 输出数据
验证码案例

ServletContext对象

代表整个Web应用,可以和程序的容器(服务器)来通信

  1. 获取ServletContext对象:
    • 通过Request对象获取 -> request.getServletContext();
    • 通过HttpServlet对象获取 -> this.getServletContext();
  2. 功能:
    1. 获取MIME类型:
      • MIME类型:在互联网通信过程中定义的一种文件时数据类型;格式:大类型/小类型(text/html)
      • getMimeType(String fileName);
    2. 域对象(所有用户请求的数据):
      • setAttribute(String name, Object obj)
      • getAttribute(String neme);
      • remeAttribute(Stting name);
    3. 获取文件的真实路径(服务器路径)
      • getRealPath(String path)
      • web目录对应:/
      • src目录对应:/WEB-INF/classes/
文件下载案例

需求:1.页面显示超链接 2.点击超链接弹出下载提示框 3.完成图片文件下载

  1. 步骤:
    1. 定义页面,编辑href属性,指向serlvet,传递资源名称filename
    2. 定义servlet
      1. 获取文件名称
      2. 使用字节输入流加载文件进内存
      3. 指定response的响应头:以附件形式打开
      4. 将数据写出到response输出流
    3. 中文文件名
      1. 获取客户端使用的浏览器版本信息
      2. 根据不同的版本信息,设置filename
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值