在建立Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为表明请求的request和表明响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更增强大。
由于request表明请求,因此咱们能够经过该对象分别得到Http请求的请求行,请求头和请求体。
请求头html
请求体java
得到客户端的请求方式:String getMethod()得到请求的资源:
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web应用的名称
String getQueryString() ---- get提交url地址后的参数字符串
username=zhangsan&password=123
request.getRemoteAddr() --- 得到访问的客户端IP地址web
//1.得到请求方式 String method = request.getMethod(); System.out.println("method:" + method); //2.得到请求的资源相关的内容 String requestURI = request.getRequestURI(); System.out.println("requestURI:" + requestURI); StringBuffer requestURL = request.getRequestURL(); System.out.println("requestURL:" + requestURL); //3.得到web应用的名称 String contextPath = request.getContextPath(); System.out.println("web应用:" + contextPath); //4.地址后的参数的字符串 String queryString = request.getQueryString(); System.out.println("queryString:" + queryString); //5.得到客户端的IP地址 String remoteAddr = request.getRemoteAddr(); System.out.println("remoteAddr:" + remoteAddr);
<form action="/request/line" method="post"> <input type="text" name="username"><br> <input type="password" name="password"><br> <input type="submit" name="提交"><br> </form>
long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
//1.得到指定的头 String header = request.getHeader("User-Agent"); System.out.println(header); //2.得到全部头的名字 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String headerName = headerNames.nextElement(); String headerValue = request.getHeader(headerName); System.out.println(headerName + ":" + headerValue); }
referer头的做用:执行该此访问的的来源, 作防盗链浏览器
//对该新闻的来源进行判断 String header = request.getHeader("referer"); if (header!=null&&header.startsWith("http://localhost")) { //是从我本身的网站跳转过去的,能够看新闻 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("英雄联盟IG战队夺冠..."); }else{ response.getWriter().write("请不要盗链!"); }
请求体中的内容是经过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key value username [zhangsan] password [123] hobby [football,basketball]
以上面参数为例,经过一下方法得到请求参数:
String getParameter(String name)
String(#getParameterValues(java.lang.String))(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()
注意:get请求方式的请求参数 上述的方法同样能够得到
request.setCharacterEncoding("utf-8"); //1.得到单个表单值 String username = request.getParameter("username"); System.out.println(username); String password = request.getParameter("password"); System.out.println(password); //2.得到多个表单的值 String[] hobbys = request.getParameterValues("hobby"); for (String hobby:hobbys){ System.out.println(hobby); } //3.得到全部的请求参数的名称 Enumeration<String> parameterNames = request.getParameterNames(); while(parameterNames.hasMoreElements()){ System.out.println(parameterNames.nextElement()); } System.out.println("----------------------"); //4.得到全部的参数,封装到一个Map<String,String[]> Map<String, String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry:parameterMap.entrySet()){ System.out.println(entry.getKey()); for (String str:entry.getValue()){ System.out.println(str); } System.out.println("----------------------"); }
post提交乱码:request.setCharacterEncoding("UTF-8"); get提交乱码:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
request对象也是一个存储数据的区域对象,因此也具备以下方法:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
注意:request域的做用范围:一次请求中
得到请求转发器----path是转发的地址
RequestDispatcher getRequestDispatcher(String path)经过转发器对象转发
requestDispathcer.forward(ServletRequest request, ServletResponse response)服务器
ServletContext域与Request域的生命周期比较?工具
Servlet Context:post
request:性能
转发与重定向的区别?网站
客户端地址与服务器端地址的写法?url
客户端地址:
服务器端地址:
request得到行的内容
request得到头的内容
request得到体(请求参数)
得到中文乱码的解决:
request转发和域