java request怎么定义_java之 Request

0x01、Request

什么是request

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

f8fd00d0c6b4dbdd12bfde1a9a2e4f1e.png

​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);

}

}

操作请求头

5b55c00b39bf767322cf32b38321367a.png

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 getParameterMap()

获得所有的请求参数。key为参数名,value为key对应的所有的值。

乱码设置:

1acf1236dc066b99884fff83f0f3cf2b.png

get方式, 我们现在使用的tomcat>=8.0了, 乱码tomcat已经处理好了

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 parameterMap = request.getParameterMap();

//遍历出每一个请求参数

Set> entries = parameterMap.entrySet();

for (Map.Entry entry : entries) {

String parameterName = entry.getKey();

String[] values = entry.getValue();

for (String value : values) {

System.out.println("参数名:" + parameterName + ",参数值:" + value);

}

}

}

}

使用BeanUtils封装

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

使用步骤:

导入jar

使用BeanUtils.populate(user,map)

表单

注册页面

用户名

密码

性别男

兴趣爱好

篮球

足球

乒乓球

羽毛球

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 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) ; 移除

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

a8d866817ea2e52556a24aebb95afd79.png

实例代码

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"));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值