JavaWeb中关于request的总结

request

request获取请求消息内容
请求行
请求头
请求参数(体)

request概述

用户通过浏览器访问服务器时,Tomcat将HTTP请求中所有的信息都封装在Request对象中
作用:开发人员可以通过request对象方法,来获取浏览器发送的所有信息.

request体系结构

	ServletRequest
		|
	HttpServletRequest
		|
	org.apache.catalina.connector.RequestFacade(由tomcat厂商提供实现类)

Request获取Http请求信息

获取请求行信息

相关API:

  1. 获取请求方式
    String getMrthod()
  2. 获取项目的虚拟路径
    String getContextPath()
  3. 获取URI(统一资源标识符,范围广)
    String getRequestURI()
  4. 获取URL(统一资源定位符,确定某一个地址)
    StringBuffer getRequestURL()
  5. 获取协议和版本号
    String getProtocol()
  6. 获取客户端的IP地址
    String getLocalAddr()
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("请求方式" + req.getMethod());
        System.out.println("虚拟路径" + req.getContextPath());
        System.out.println("获取URI" + req.getRequestURI());
        System.out.println("获取URL" + req.getRequestURL());
        System.out.println("获取协议和版本号" + req.getProtocol());
        System.out.println("获取客户端IP" + req.getLocalAddr());
    }

结果为:

请求方式GET
虚拟路径/day09_request
获取URI/day09_request/requestDemo1
获取URLhttp://localhost:8080/day09_request/requestDemo1
获取协议和版本号HTTP/1.1
获取客户端IP0:0:0:0:0:0:0:1

获取请求头信息

相关API

  1. 获取知道请求头名称对应的值,不区分大小写
    String getHeader(String name)
  2. 获取所以请求头的信息
    Enumeration getHeaderNames()

案例

视频防盗链

@WebServlet("/referRequest")
public class ReferRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        //获取请求的来源,如果是浏览器地址直接访问的话,referer就是null
        String header = req.getHeader("referer");
        //判断是不是自家的网站发起的请求
        if (header != null && header.startsWith("http://localhost:8080")) {
            resp.getWriter().write("正常播放视频");
        } else {
            resp.getWriter().write("来优酷吧");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

浏览器兼容性问题

@WebServlet("/userAgentServlet")
public class UserAgentServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //获取浏览器版本信息
        String header = request.getHeader("user-agent");
        //判断浏览器版本
        if (header.contains("Chrome")) {
            response.getWriter().write("浏览器是谷歌");
        } else if (header.contains("Firefox")) {
            response.getWriter().write("浏览器是火狐");
        } else {
            response.getWriter().write("其他浏览器");
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}

获取请求参数(体)

API

  1. 获取指定参数名的值(例如:姓名)
    String getParameter(String name)
  2. 获取指定参数名的值,返回的是一个数组(例如:爱好)
    String [ ]getParameterValues(String name)
  3. 获取所有参数名和对应值数组,参数名 name,值数组 value,封装map集合
    Map<String ,String [ ]>getParametermap

注意:中文乱码问题
get:在tomcat8及以上版本,内部URL编码(UTF-8)
post:编码解码不一致,造成乱码现象
客户端(浏览器)编码:UTF-8
服务器默认 解码:ISO-8859-1 拉丁文
指定解码:void setCharacterEncoding(String env) 注:必须在方法内行首

@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //手动获取
        System.out.println("手动获取");
        String username = req.getParameter("username");
        System.out.println("用户:" + username);
        String password = req.getParameter("password");
        System.out.println("密码:" + password);
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println("爱好:" + Arrays.toString(hobbies));
        //自动
        System.out.println("自动获取");
        Map<String, String[]> map = req.getParameterMap();
        map.forEach((k, v) -> {
            System.out.println(k + "=" + Arrays.toString(v));
        });

        //将前端的表单数据赋值到user对象中,保存到数据库中

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //指定post的解码方式
        req.setCharacterEncoding("UTF-8");
        System.out.println("post提交方法,再去调用get");
        this.doGet(req, resp);
    }
}

BeanUtils

是由Apache组织,提供的一套工具类,简化参数的封装,即:将前端提交的数据,直接封装到想要的JavaBean中

  1. 导入架包
    lib目录必须在WEB-INF之下
  2. 使用工具类进行封装

案例实现

//获取请求参数
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    // 使用BeanUtils快速封装数据到 User对象中
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //指定post的解码方式
        req.setCharacterEncoding("UTF-8");
        //获取所有参数的map集合
        Map<String, String[]> parameterMap = req.getParameterMap();
        //创建对象
        User user = new User();
        //调用工具,实现封装
        try {
            BeanUtils.populate(user, parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println(user);
    }
}

request其他功能

请求转发

一种在服务器内部的资源跳转方式
API

  1. 通过request对象,获得转发器对象
    RequestDispatcher getRequestDispatcher(String path)
  2. 通过转发器对象实现转发的功能
    void forward(ServletRequest request, ServletResponse response)
    特点:
    浏览器:发了一次请求、地址栏:没有发生改变、只能转发到服务器内部的资源
    链式编程:request.getRequestDispatcher("/bServlet").forward(reqeust,response)

域对象(共享数据)

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据

  • API

    1. 设置数据
      void setAttribute(String name, Object o)

    2. 获取数据
      Object getAttribute(String name)

    3. 删除数据
      void removeAttribute(String name)

  • 生命周期

    1. 何时创建?
      用户发送请求时,创建request

    2. 何时销毁
      服务器返回响应是,销毁request

    3. 作用范围?
      一次请求,包含多次转发

练习

需求:
实现用户的登录功能
登录成功跳转到SuccessServlet展示:登录成功!xxx,欢迎您
登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
代码实现:

  1. 创建web项目
  2. 导入BeanUtils工具类
  3. 编写index.xml文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>index</title>

</head>
<body>
<h4>用户登录</h4>
<form action="/day09_login/loginServlet" method="post">
    用户:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    <input type="submit" value="登录">
</form>

</body>
</html>
  1. User实体类
// 用户对象
public class User {

    private String username;// 用户名

    private String password;// 密码

    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{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  1. LoginServlet
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置解码方式
        request.setCharacterEncoding("utf-8");
        //获取浏览器请求参数,map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        //使用BeanUtils工具类,封装user对象
        //将对象信息写死
        User user = new User("jack","123");
        try {
            BeanUtils.populate(user, parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        if ("jack".equals(user.getUsername()) && "123".equals(user.getPassword())) {
            // 正确
            request.setAttribute("user", user);
            request.getRequestDispatcher("/successServlet").forward(request, response);
        } else {
            // 错误
            request.getRequestDispatcher("/failServlet").forward(request, response);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }

  1. SuccessServlet
@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从request域获取对象
        User user = (User) request.getAttribute("user");
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("登录成功");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
  1. FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("登录失败");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
发布了34 篇原创文章 · 获赞 9 · 访问量 1266

猜你喜欢

转载自blog.csdn.net/weixin_43616750/article/details/105527913
今日推荐