HttpServletRequest
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,
HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。
request运行流程:
因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请 求头和请求体
通过request获得请求行
①获得客户端的请求方式:String getMethod()
②获得请求的资源:
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web应用的名称(很重要)
String getQueryString() ---- get提交url地址后的参数字符串
username=zhangsan&password=123
注意:request可以获得客户机(客户端)的一些信息
request.getRemoteAddr() --- 获得访问的客户端IP地址
通过request获得请求头
①long getDateHeader(String name)
②String getHeader(String name)(很重要)
③Enumeration getHeaderNames()
④Enumeration getHeaders(String name)
⑤int getIntHeader(String name)
举例:
获取头部名称:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取指定的头 String header=request.getHeader("User-Agent"); System.out.println(header); //获取所有头部名称 Enumeration<String> headNames=request.getHeaderNames(); while(headNames.hasMoreElements()){ String headName=headNames.nextElement(); String headerValue=request.getHeader(headName); System.out.println(headName+"...."+headerValue); } }
referer头的作用:执行该此访问的的来源
做防盗链
演示:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取refer的信息 String refer=request.getHeader("referer"); //对referer进行判断 response.setContentType("text/html;charset=UTF-8"); if(refer!=null&&refer.startsWith("http://localhost")){ response.getWriter().write("站在痛苦之外规劝受苦的人,是件很容易的事。"); }else{ response.getWriter().write("盗链可耻"); } }
通过request获得请求体
获得请求参数:
①String getParameter(String name)(很重要)
②String[] getParameterValues(String name)
③Enumeration getParameterNames()
④Map<String,String[]> getParameterMap()(很重要)
注意:get请求方式的请求参数 上述的方法一样可以获得
①解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
②解决get提交的方式的乱码:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
演示:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取单个值 String username=request.getParameter("username"); System.out.println(username); //获取指定元素的value值 String[] hobbys=request.getParameterValues("hobby"); for(String h:hobbys){ System.out.println(h); } //获取所有参数,并封装到一个Map集合中 request.setCharacterEncoding("UTF-8"); Map<String,String[]> map=request.getParameterMap(); for(Map.Entry<String,String[]> entry:map.entrySet()){ System.out.println(entry.getKey()); for(String str:entry.getValue()){ System.out.println(str); } System.out.println("----------------"); } }
request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
①setAttribute(String name, Object o)
②getAttribute(String name)
③removeAttribute(String name)
注意:request域的作用范围:一次请求中
请求转发
获得请求转发器----path是转发的地址
RequestDispatcher getRequestDispatcher(String path)
通过转发器对象转发
requestDispathcer.forward(ServletRequest request, ServletResponse response)
演示:
servlet01
public class servlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("name", "张三"); request.getRequestDispatcher("/serlvet02").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
serlvet02
public class serlvet02 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String name=(String)request.getAttribute("name"); response.getWriter().write(name); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
ServletContext域与Request域的生命周期比较
ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中
转发与重定向的区别?
1)重定向两次请求,转发一次请求
2)重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站 转发只能访问内部资源
4)转发的性能要优于重定向