Request、Response
前言
了解HttpServletRequest和HttpServletResponse接口。
一、请求和响应
1、HttpServletRequest
A.作用
每一次请求过来,tomcat解析请求数据并将解析数据封装在HttpServletRequest中,然后传递到Service方法中,然后分流到doGet和doPost中。
B.常用方法
我们知道请求的所有信息都被解析并封装到了HttpServletRequest对象中,此时可用来获取请求信息。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置解析数据流的解码格式
req.setCharacterEncoding("utf-8");
//super.doPost(req, resp);不能调用这个方法,这是用来发送doPost未实现的error
//获取请求资源路径
System.out.println(req.getRequestURI());
//获取请求的统一资源定位符即绝对路径
System.out.println(req.getRequestURL());
//获取IP IP+port(Addr) Port
System.out.println(req.getRemoteHost());
System.out.println(req.getRemoteAddr());
System.out.println(req.getRemotePort());
//获取请求头
System.out.println(req.getHeader("User-Agent"));
//获取请求参数,单值或多值
System.out.println(req.getParameter("user"));
System.out.println(Arrays.toString(req.getParameterValues("interest")));
//获取请求类型
System.out.println(req.getMethod());
//获取请求转发对象
System.out.println(req.getRequestDispatcher("/hello"));
//添加或取出一个请求域的key,vale
req.setAttribute("status", "ok");
//请求体中的数据获取不了,获取的是链接后带的参数
System.out.println(req.getAttribute("status"));
}
C.请求转发
用请求调度器将请求转发到另一个Servlet2处理,将请求延长,一次请求,JSP,Servlet1,Servlet2共享该请求域的所有参数.
req.getRequestDispatcher("/hello").forward(req,resp);
为何如此做?
1)实现业务分离及合作。
2)能转发请求到受服务器保护的WEB-INF目录下,既能保护Servlet2又能使用其功能。
注:只能调度到该功能所拥有的资源处
2、Web中/的意义
1)对于浏览器
/被解析为http://ip:port/
2)对于服务器
/被解析为http://ip:port/工程路径
注:当response.sendRidrect(“/”),这是去让浏览器重定向,也就是浏览器去解析。
3、HttpServletResponse
A.作用
和request一样,每次请求由tomcat创建response对象然后传递给service使用,response可以处理响应相关信息。
B.响应流
1)字节流,常用于下载,二进制文件,如图片等。
resp.getOutputStream();
2)字符流,回传字符串。
resp.getWriter();
注:一次只能用一种流往回传,毕竟响应一次。
C.响应编码
resp.setCharacterEncoding("utf-8");
当然也可以设置浏览器的解码格式,就在响应头里。
resp.setHeader("Content-Type","text/html;charset=ISO-8895-1");
同时设置服务端和客户端的编码解码格式,统一起来
resp.setContentType("text/html;charset=UTF-8");
注:这个request解析数据的解码格式和response响应的编码格式都是默认的ISO-8859-1,一种国际化标准格式。毕竟tomcat又不是专门为中国开发的,所以需要设置能完美解析汉字的编码和解码格式。
请求时,用到浏览器编码为UTF-8,tomcat解码为ISO-8859-1;
响应时,tomcat编码为ISO-8859-1,浏览器解码为UTF-8;
D.请求重定向
服务器告诉浏览器去访问我给的新的地址,比如有的地址已经更新为其它地方了。
resp.sendRedirect("/book/newHello");
/moudleName/资源路径
或者
resp.setStatus(302);resp.setHeader("Location","/book/newHello")
总结
1)HttpServletRequest
2)HttpServletResponse
参考文献
[1] Java Web 尚硅谷
附录
1、Java EE 三层架构
2、项目维护和升级
为了便于项目的维护和升级,就需要对代码之间进行解耦。
主要分出来的包如下:
3、MVC思想
MVC(Model,View,Controller)将web层的代码分成不同组件,实现解耦,以便于编程的协作、项目的维护和升级。(让代码合理分层,方便管理。)
1)View 视图,只负责完整页面的展示和数据的填充。
2)Model 模型,将业务逻辑相关的数据封装到一个Bean/POJO类中,从此用一个对象代表所有业务逻辑数据。
3)Controller 控制器,View与Model的桥接器,用于处理View过来的请求和数据(封装到Model中),然后得到数据(封装到model中)并响应客户端。