request:
处理客户端的请求协议
获取请求行的相关信息:
getMethod(); //方法
getRequestURI(); //URI路径
getContextPath(); //项目
getScheme(); //协议约束
getRequestURL(); //URL路径
获取请求头的相关信息:(请求头是键值对形式,所以遍历迭代器)
Enumeration<String> names = request.getHeaderNames() //返回请求头的所有键的信息
while(names.hasMoreElements()){
String name = names.nextElement();
String value = request.getHeader(name);
System.out.println(name + " == " + value);
}
获取请求体的相关信息:(直接通过提交时的name键得到值)
getParameter(name) //根据键获取值(多个值得到第一个)
getParameterValues(name) //根据键获取值组织成的数组
getParameterMap() //返回键值组织成Map集合,值是一个数组的形式
BeanUtils:(面向对象的思想:将提交的数据封装为一个javaBean对象,BeanUtils自动封装JavaBean)
BeanUtils.populate(JavaBean对象,Map集合)
注意:
1:BeanUtils会自动进行数据类型转化
但是只能进行简单的数据类型转换 int double boolean String
2:Map的键和JavaBean的字段名以及对应的setXxx方法名必须保持一致
3:如果字段名不一致,不会正常赋值
BeanUtils自定义转换器:
1.创建一个时间转换器
DateConverter dc = new DateConverter();
2.声明当前时间转换器可以转换的字符串的格式
dc.setPattern("yyyy-MM-dd");
3.在BeanUtils中注册时间转换器
ConvertUtils.register(dc, Date.class);
/*作用,直接将一个1990-10-01格式的字符串转换成一个java.util.Date对象*/
使用请求转发:(解耦合)
request.getRequestDispatcher("/servlet的路径").forward(ruquest,response);
携带数据:
request.setAttribute("键","值");
这时不能用servletContext存储数据,因为并发访问时可能会出问题
新页面获取值:
request.getAttribute("键");
在请求转发的时候因为用的是同一个response对象,所以一定要在开流之前定义响应的编码集
response.setContentType("text/html;charset=utf-8");
数据输出理论上只能由最后一个Servlet发出,不然会被覆盖
重新定向:
A:调用response.sendRedirect("带/项目名称的URL");
B:A的数据设置进响应头,被浏览器解析,浏览器访问该URL
相当于:response.setStatus(302); //设置状态码告诉客户端需要重定向
response.setHeader("Location","/day36demo/路径")
请求转发与重定向区别
A:本质区别:发生跳转这个动作产生的场合不同
请求转发在服务器端发生跳转,而重定向发生在浏览器
B:请求转发只有一次请求,只有一次响应
重定向重定向一次,请求两次,响应了两次
C:重定向地址栏会发生改变
请求转发不会
原因:最后访问的资源的URL当前浏览器是否可以获得
D:路径项目名:
重定向必须有
请求转发没有
E:请求转发的路径只能是项目内资源
而重定向可以定位到网络上的任意资源,不单只是项目内的
定时刷新页面也是一种特殊的重定向