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 getParameterMap()
获得所有的请求参数。key为参数名,value为key对应的所有的值。
乱码设置:
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) ; 移除
一次请求有效(转发可以使用)
实例代码
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"));