前面已经说到,当客户端向服务器发起请求时,容器会将请求有关的信息封装成一个HttpServletRequest,将输出信息封装成一个HttpServletResponse。
一、 HttpServletRequest对象
其中最常用的就是获取参数,不过现在有了spring和struct,就很少直接使用这个方法了。
System.out.println("parameter name:"+request.getParameter("name"));
获取请求的信息
System.out.println("uri:"+request.getRequestURI());
System.out.println("context path:"+request.getContextPath());
System.out.println("servlet path:"+request.getServletPath());
System.out.println("path info:"+request.getPathInfo());
System.out.println("Scheme:"+request.getScheme());
System.out.println("请求方式:"+request.getMethod());
System.out.println("ServerPort:"+request.getServerPort());
System.out.println("LocalPort:"+request.getLocalPort());
System.out.println("url:"+request.getRequestURL());
//post请求需要用到request.getInputStream()从请求体拿到参数字符串
//get请求使用request.getInputStream()拿不到任何东西
System.out.println("URL问号(?)后面的参数字符串:"+request.getQueryString());
获取客户端信息
System.out.println("浏览器信息:"+request.getHeader("User-Agent"));
System.out.println("RemoteHost:"+request.getRemoteHost());
System.out.println("RemoteAddr():"+request.getRemoteAddr());
System.out.println("RemotePort:"+request.getRemotePort());
获取session和cookie信息
Cookie[] cookies = request.getCookies();
HttpSession session = request.getSession();
其他
request.getRequestDispatcher("").forward(request, response);//转发
首先我们来看下getRequestURI和getRequestURL的区别,Request URI = context path + servlet path + path info,不包含协议(scheme)和主机(host)信息(但我看API有说明在http1.0中get请求会返回全路径),所以,如果我们需要获取全路径,则最好调用getRequestURL。
contextPath是web应用名称,servletPath和pathInfo在<url-pattern></url-pattern>
设置为/*或/会有区别。假设我们的contextPath为helloweb,请求http://localhost:8080/helloweb/abc
:
设置<url-pattern>/*</url-pattern>
时:
servlet path:
path info:/abc
设置<url-pattern>/</url-pattern>
时:
servlet path:/abc
path info:null
由此可以看出,url-pattern为/时pathInfo为null,url-pattern为/*时servletPath为空(不是null)
getServerPort和getLocalPort:
在一般情况下getServerPort和getLocalPort是一样的,区别就在于ServerPort就是URL中的host里冒号(:)后面的部分,是明显可以确定的,但是LocalPort是请求实际到达的端口,有时候不一定跟ServerPort相同。
关于获取客户端信息的getRemoteXXX方法,拿到的不一定是发起请求的客户端的信息,如果中间经过代理(例如Apache,Squid,Nginx等反向代理软件)的话,返回的信息是最后一个代理服务器的。获取真实的客户端的信息在这里就不阐述了,有需要的可以找度娘。
二、HttpServletResponse对象
输出:
PrintWriter writer = response.getWriter();//字符流
ServletOutputStream outputStream = response.getOutputStream();//字节流
设置编码(防止乱码)
response.setCharacterEncoding("utf-8");
response.setHeader("contentType", "text/html; charset=utf-8");
//相当于执行上面两条
response.setContentType("text/html;charset=UTF-8");
会话保持
String encodeURL=response.encodeRedirectURL(url);//返回值仅用于sendRedirect
response.sendRedirect(encodeURL);
response.encodeURL("");
设置header、cookie
//下载文件
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
//设置cookie
response.addCookie(cookie);
关于response.setContextType(),默认为html/text,点击这里查看更多的MIME类型。
对于sendRedirect来说,如果客户端禁用了cookie,为了保持会话,我们需要先使用encodeRedirectURL对URL进行处理,此时处理后的URL后面会自动拼接加上jsessionid信息。