Day04 request
一、request概述
表示请求
有两种含义
1、Http中的request
Http请求包含三部分:请求行、请求头、请求体。
2、servlet中的request
doGet/doPost方法的request的类型是HttpServletRequest
在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法。
二、request获取请求行
//1.获取请求行中的请求方法
String method = request.getMethod();
//2.获取请求行中的项目访问路径
String path = request.getContextPath();
三、request-获取请求头
1、什么是请求头
请求中的键值对
2、方法
根据键获取对应的值
String getHeader(String name)
//获取当前浏览器的类型
String type = request.getHeader("User-Agent");
四、request-获取请求体
1、请求体是什么?
提交的参数
2、有什么特点?
(1)只有POST请求才有请求体
(2)请求体中包含的是请求的参数
3、方法
(1)根据一个参数名,获取参数的值
String getParameter(String name)
如果表单中的参数,是一个key对应一个value。
String username = request.getParameter("username");
String password = request.getParameter("password");
其中,Tomcat 8.5 已经默认可以处理GET请求的中文的提交,但POST没有。
所以请求为POST时,要加上下列代码。
if("POST".equals(request.getMethod())){
//设置请求体的数据的编码为utf-8
request.setCharacterEncoding("UTF-8");
}
(2)获取多个参数和所有参数
1)根据一个参数名,获取参数的多个值。如果没有值,则返回null
String[] getParameterValues(String name)
如果表单中的参数,是一个key对应多个value
String [] hobby = request.getParameterValues("hobby");
2)获取所有的参数名和参数值
Map<String,String[]> getParameterMap()
写得很麻烦 , 一个一个地获取,再一个一个的设置。
等下用BeanUtils工具装数据
五、apache BeanUtils工具类
1、BeanUtils是什么?
BeanUtils 是 Apache commons组件的成员之一
2、作用
主要用于简化JavaBean封装数据的操作。
使用第三方工具,需要导入jar包:
3、使用步骤
(1)添加Jar包到web/WEB-INF/lib目录
(2)选中所有jar包,右击–>add as Library…
(3)调用populate()方法
//1.获取所有参数
Map<String, String[]> map = request.getParameterMap();
//2.创建一个javabean对象
User user = new User();
try {
//参数1,新建的javabean对象,没有值;参数2,有key-value的map
BeanUtils.populate(user,map);
} catch (Exception e) {
e.printStackTrace();
}
必须做到让参数的参数名与类的成员变量名一致
public class User {
private String username;
private String password;
private String[] hobby;
private String sex;
(4)底层原理
1)根据获取的Map中的key,使用拼接法,在这个key名前加set,来生成set方法。
2)从而调用同名set方法给成员变量赋值(反射)。
六、转发的原理
1、什么是请求转发
浏览器访问Servlet1,Servlet1将参数处理得到结果,没有直接返回给浏览器,而是将结果带给Servlet2,由Servlet2再处理之后返回给浏览器。
2、类比
面试者的简历给前台,前台收到之后转给面试官。
3、在哪里使用?
搜索功能,还有很多地方。
4、代码实现
(1)方法
- setAttribute(key,value) 存一个key-value数据到请求中
- getAttribute(key) 根据key将对应的value取出来
- getRequestDispatcher("/demo7").forward(request, response);
back 后退 forward前进
pack04_dispatch\Demo06Servlet.java
@WebServlet("/demo06")
public class Demo06Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.存数据
request.setAttribute("name","游戏本");
//2.请求转发
request.getRequestDispatcher("/demo07").forward(request,response);
}
}
pack04_dispatch\Demo06Servlet.java
@WebServlet("/demo07")
public class Demo07Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//取数据
String name = (String) request.getAttribute("name");
//2 组装标签后,响应给浏览器
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("<font color='red'>"+name+"</font>");
}
}
5、转发和重定向的区别
(1)重定向
两次请求,两次响应
重定向不携带数据
重定向地址栏发生改变
(2)转发
一次请求,一次响应
转发需要携带数据
转发地址栏不会发生变化