java之 Request

0x01、Request

什么是request

在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求头和请求体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法.

​ Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

1、操作请求行和请求头

操作请求行

  • getMethod();获取请求方式
  • getRemoteAddr() ;获取客户机的IP地址(知道是谁请求的)
  • getContextPath(); 获得当前应用工程名(部署的路径);
  • getRequestURI();获得请求地址,不带主机名
  • getRequestURL();获得请求地址,带主机名
  • getServerPort();获得服务端的端口
  • getQueryString();获的请求参数(get请求的,URL的?后面的. eg:username=zs&password=123456)

实例代码:

@WebServlet("/demo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用request对象获取请求行的信息:
        //1. 获取请求的方式(可能会用)
        String method = request.getMethod();
        //System.out.println("请求方式为:" + method);

        //2. 获取客户端的ip地址
        String remoteAddr = request.getRemoteAddr();
        //System.out.println("客户端的ip地址是:" + remoteAddr);

        //3. 获取项目部署的路径(以后可能用到)
        String contextPath = request.getContextPath();
        //System.out.println("项目部署路径是:" + contextPath);

        //4. 获取请求的url: 统一资源定位符 http://localhost:8080/requestDemo/demo01
        String url = request.getRequestURL().toString();
        //System.out.println("此次请求的url是:" + url);

        //5. 获取请求的uri: 统一资源标识符,在url的基础上省略了服务器路径"http://loaclhost:8080"
        String uri = request.getRequestURI();
        System.out.println(uri);
    }
}

操作请求头

  • User-Agent: 浏览器信息
  • Referer:来自哪个网站(防盗链)
  • 等等
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //根据请求头的name获取value
        //目标:获取name为user-agent的请求头的信息
        String header = request.getHeader("user-agent");
        System.out.println("获取的请求头agent为:" + header);
    }
}

2、操作请求参数

  • 获得请求参数
  • 请求参数乱码的处理
  • 使用BeanUtils封装请求参数到JavaBean
法名 描述
String getParameter(String name) 获得指定参数名对应的值。如果没有则返回null,如果有多个获得第一个。 例如:username=jack
String[] getParameterValues(String name) 获得指定参数名对应的所有的值。此方法专业为复选框提供的。 例如:hobby=抽烟&hobby=喝酒&hobby=敲代码
Map<String,String[]> getParameterMap() 获得所有的请求参数。key为参数名,value为key对应的所有的值。

乱码设置:

  1. get方式, 我们现在使用的tomcat>=8.0了, 乱码tomcat已经处理好了
  2. post方式, 就需要自己处理
void setCharacterEncoding(String env); //设置请求体的编码

代码实例:

@WebServlet("/demo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //1. 根据参数名,获取一个参数值
        String username = request.getParameter("username");
        //System.out.println("获取的请求参数username=" + username);

        //2. 根据参数名,获取多个参数值:比如说注册时候的兴趣爱好的复选框
        String[] hobbies = request.getParameterValues("hobby");
        /*for (String hobby : hobbies) {
            System.out.println(hobby);
        }*/

        //3. 获取所有的请求参数
        //getParameterMap()获取所有请求参数,请求参数的参数名就是map的key,请求参数的参数值就是map的value
        Map<String, String[]> parameterMap = request.getParameterMap();
        //遍历出每一个请求参数
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String, String[]> entry : entries) {
            String parameterName = entry.getKey();
            String[] values = entry.getValue();
            for (String value : values) {
                System.out.println("参数名:" + parameterName + ",参数值:" + value);
            }
        }
    }
}

使用BeanUtils封装

​ BeanUtils是Apache Commons组件的成员之一,主要用于 简化JavaBean封装数据 的操作。

使用步骤:

  1. 导入jar
  2. 使用BeanUtils.populate(user,map)
  • 表单
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
    <form action="/requestDemo/demo04" method="post">
        用户名<input type="text" name="username"><br>
        密码<input type="text" name="password"><br>
        性别<input type="radio" name="gender" value="male">男
        <input type="radio" name="gender" value="female">女
        <br>
        兴趣爱好
        <input type="checkbox" name="hobby" value="basketball">篮球
        <input type="checkbox" name="hobby" value="football">足球
        <input type="checkbox" name="hobby" value="ppball">乒乓球
        <input type="checkbox" name="hobby" value="yumaoball">羽毛球
        <br>
        <input type="submit" value="注册">
    </form>
</body>
</html>
  • User.java

需要有getter和setter,无参/有参方法、toString重写

public class User implements Serializable {
    private String username;
    private String password;
    private String gender;
    private String[] hobby;

    public User() {
    }

    public User(String username, String password, String gender, String[] hobby) {
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }

    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;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
}
  • ServletDemo01
@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //1. 获取所有的请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        //2. 将请求参数封装到User对象中
        User user = new User();
        //3. 使用BeanUtils框架自动将map中的数据封装到对象中
        try {
            BeanUtils.populate(user,parameterMap);

            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 如果请求参数有多个需要封装到JavaBean里面, 建议先获得Map, 再使用BeanUtils封装到JavaBean对象

注意: JavaBean属性需要和Map的key一致 说白了也就是JavaBean属性需要和表单的name一致

3、请求转发

格式:

request.getRequestDispatcher("url").forward(request, response);//转发
  • 请求转发的作用:跳转页面,比如说添加完数据之后跳转到数据的展示页面,删除完数据之后跳转到展示页面

  • 请求转发的特征

    • 跳转操作是由服务器执行的,所以客户端地址栏不会发生变化
    • 跳转操作不会发起新的请求
    • 可以跳转到WEB-INF中的资源,但是不能跳转到其它项目的资源

4、作为域对象存取值

ServletContext: 范围 整个应用(无论多少次请求,只要是这个应用里面的都是可以共享的)

​ request范围: 一次请求有效

​ 域对象是一个容器,这种容器主要用于Servlet与Servlet/JSP之间的数据传输使用的。

  • Object getAttribute(String name) ;
  • void setAttribute(String name,Object object) ;
  • void removeAttribute(String name) ;

常用方法

Object getAttribute(String name) ;  取值
void setAttribute(String name,Object object)  ; 存值
void removeAttribute(String name)  ; 移除

一次请求有效(转发可以使用)

实例代码

  • ServletDemo01
// 目标: 在ServletDemo02中获取ServletDemo01中的变量username的值
// 要求只能是由ServletDemo01跳转到ServletDemo02的时候才能获取
String username = "周杰棍";

//将username存储到request域对象中
request.setAttribute("name",username);

//请求转发跳转到ServletDemo07
request.getRequestDispatcher("/demo07").forward(request, response);
  • ServletDemo02
 System.out.println("在ServletDemo07中获取username的值:"+request.getAttribute("name"));
posted @ 2021-01-26 15:07  0X7e  阅读(498)  评论(0编辑  收藏  举报