Request&Response
2019-05-16 / JAVA / 968 次围观 / 0 次吐槽 /HttpServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象
响应正文(主体)
getWrite(); 字符输出流
getOutputStream(); 字节输出流
响应编码
案例:向客户端输出中文
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应类型和字符编码为UTF-8, 这样支持汉字显示 // resp.setContentType("text/html"); // resp.setCharacterEncoding("UTF-8"); //设置客户编码类型 resp.setHeader("Content-Type", "text/html;charset=utf-8"); //不设置编译类型,默认编码发送数据 ISO-8859-1(没有中国二字编码),此时会发生乱码 resp.getWriter().write("hello你好"); }
响应状态码
常见的状态码参照:http://tool.oschina.net/commons?type=5
404 请求失败,请求所希望得到的资源未被在服务器上发现
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
302 重定向
500 服务抛出异常
Ø 掌握如何设置状态响应码
设置客户端不需要缓存
@Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { //浏览器刷新时就不会有缓存 response.addHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", "0"); ValidateCode code = new ValidateCode(WIDTH, HEIGHT, 4, 6); code.write(response.getOutputStream()); }
自动刷新功能
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=UTF-8"); //response.setHeader("Refresh", "1");//每隔一秒刷新一次 response.setHeader("Refresh", "5;URL=index.html");//3秒后转到另一页面 response.getWriter().write("注册成功!3秒后会自动跳转,苦没有中转点击<a href='index.html'>这里</a>"); }
请求重定向
请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。
重定向特点:地址栏会变,并发送2次请求,增加服务器负担
实现方式
response.sendRedirect()
实现原理:
302/307状态码和location头即可实现重定向
转发特点:地址栏不会变,客户端发送一次请求
response细节
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
request常用方法
获得客户端信息
Ø getRequestURL方法返回客户端发出请求时的完整URL。
Ø getRequestURI方法返回请求行中的资源名部分。
Ø getQueryString 方法返回请求行中的参数部分。
Ø getRemoteAddr方法返回发出请求的客户机的IP地址
Ø getRemoteHost方法返回发出请求的客户机的完整主机名
Ø getRemotePort方法返回客户机所使用的网络端口号
Ø getLocalAddr方法返回WEB服务器的IP地址。
Ø getLocalName方法返回WEB服务器的主机名
Ø getMethod得到客户机请求方式
获得客户端请求头
Ø getHeader(name)方法
Ø getHeaders(String name)方法
Ø getHeaderNames方法
获得客户端请求参数(客户端提交的数据)
Ø getParameter(name) //获取参数的值
Ø getParameterValues(String name)//获取一个参数的多个值
Ø getParameterNames //获取所有参数的名字
Ø getParameterMap //获取所有参数和值,并且存入map中
Map<String,String[]> map = request.getParameterMap();
Ø getInputStream //以字节读取数据 post
Request的应用
获取表单数据一
通过getParameter和getParameterValues获取请求参数
掌握POST和GET请求解决乱码的方案
掌握表单提交通过都用POST方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); String gender = req.getParameter("gender"); String remarks = req.getParameter("remarks"); String[] hobby = req.getParameterValues("hobby"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // String username = req.getParameter("username"); // String password = req.getParameter("password"); // String gender = req.getParameter("gender"); // String remarks = req.getParameter("remarks"); // String[] hobby = req.getParameterValues("hobby"); // ServletInputStream servlet = req.getInputStream(); byte[] buf = new byte[1024]; int len = 0; while((len = servlet.read(buf)) != -1) { //buf转字符串 String s = new String(buf,0,len); //url解码 s = URLDecoder.decode(s,"utf-8"); System.out.println(s); } }
在GET请求中,tomcat8不会有乱码,tomcat7会有乱码
因为tomcat7的接收参数时采用了IOS-8859-1编码
获取表单数据二
获取表单数据三
通过beanutils来封装请求参数,首先需要导入下面两个包
获取原始表单数据
通过InputStream来获取最原始的表单数据
实现请求转发
请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //跳转到web2 request.getRequestDispatcher("/web2").forward(request, response); }
实现请求重定向
重定向机制的运作流程
1、用户在浏览器端输入特定URL,请求访问服务器端的某个组件
2、服务器端的组件返回一个状态码为302的响应结果。
3、当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件
4、浏览器端接收到来自另一个web组件的响应结果。
HttpServeltResponse的sendRedirect(String location)用于重定向
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //重定向 String path = request.getContextPath();//上下文路径 response.sendRedirect(path + "/web");//跳转需要加上全部路径 }
转发和重定向的区别
域对象:session,request,page。。。
域:区间、范围
Ø 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
Ø 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
- 上一篇:HTTP
- 下一篇:Servlet文件下载
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.