本文共 12327 字,大约阅读时间需要 41 分钟。
前言:我们上一节已经研究了。下面这一节我们来研究request。
概述:
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。 service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。
我们在了解response的时候,我们已经说过了response的运行流程,其实已经包含了request的流程,下面我就仅仅贴张图算了。
在请求行中,我们知道,只有两个重要的信息:
1、请求方式:get、post 2、请求资源:web/form.htmlWebContent下创建form1.html
Insert title here
在src目录下创建servlet:requestLine
package httpservletRequest;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class requestLine */public class requestLine extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、获取请求方式: String method=request.getMethod(); System.out.println(method); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}访问结果:
方式:
1、String getRequestURI() 2、StringBuffer getRequestURL() 3、String getContextPath() —web应用的名称 4、String getQueryString() ---- get方式提交url地址后的参数字符串username=zhangsan&password=123 同样适用form1.html
Insert title here
servlet 方法:
package httpservletRequest;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class requestLine */public class requestLine extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、获取请求方式: String method=request.getMethod(); System.out.println(method); //2、请求资源内容: String requestURI=request.getRequestURI(); System.out.println("requestURI:"+requestURI); StringBuffer requestURL=request.getRequestURL(); System.out.println("requestURL:"+requestURL); String contextpath=request.getContextPath(); System.out.println("Web 应用名称contextpath:"+contextpath); String QueryString =request.getQueryString(); System.out.println("地址后面参数的字符串QueryString:"+QueryString); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
点击提交按钮后:
注意;
最后一样之所以是null,那是 因为我们采用 的是post提交方式,如果是采用get提交方式的话,将会打印字符串: 补充: 我们依旧可以使用request对象获取客户机的一些信息,比如ip request.getRemoteAddr() — 获得访问的客户端IP地址
long getDateHeader(String name)
String getHeader(String name) —常用 Enumeration getHeaderNames() --获取所以请求头中所有的名字 Enumeration getHeaders(String name) —获取某一请求头中所有的值,即,一个请求头,对应着多个值。 int getIntHeader(String name)
创建一个新的servlet:Header
package httpservletRequest;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class Header */public class Header extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、获取制定的头: String header=request.getHeader("User-Agent"); System.out.println("User-Agent:"+header); System.out.println("++++++++++++++++++++++++++++++++++"); //2、获取的头的名称: EnumerationheaderNames=request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headername=headerNames.nextElement(); String headervalue=request.getHeader(headername); System.out.println(headername+":"+headervalue); } System.out.println("++++++++++++++++++++++++++++++++++"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
执行结果:
在最上面的照片中,我们可以发现,请求头中还有referer。置于为什么没有在上面的例子中出现,那是因为我们直接访问的地址http://localhost:8080/httpservlet_request/Header,而不是在这个地址的基础上访问的。
举个栗子: 我们创建from2.htmlInsert title here 访问servletHeader资源
界面如下:
点击链接: 打印如下内容; 大家可以清楚的看到,这个referer就是访问的来源。也就是说,用户是在http://localhost:8080/httpservlet_request/form2.html这个页面上点击的请求链接。判断执行该此访问的的来源,防盗链。
比如公司A有网站:。
网站上有一个新闻,链接为:公司B有网站:
想使用A公司的新闻,为此,在B网站上需要引入A公司的新闻链接。为此可以再B网站的页面上增加一个链接: <a href=“”>访问A公司新闻资源</a>但是A公司不想让其他公司引用自己的链接,只想让用户来自己的A网址上访问新闻,以增加浏览量。
为此可以采用这种防盗链技术。
因为如果是在B网址上访问A网址的新闻,那么referer中就会不包含 。为此我们通过判断referer中是否以www.AAA.com开头即可防止防盗链了。package httpservletRequest;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class Header */public class Header extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用referer进行防盗链判断: //对连接新闻的来源进行判断: String referer=request.getHeader("referer"); if(referer!=null && referer.startsWith("www.AAA.com")) { //这是从自己网站上访问的,可以跳转。 System.out.println("这是从自己网站上访问的,可以跳转"); } else { //这不是从自己网站上访问的,不可以跳转。 System.out.println("这不是从自己网站上访问的,不可以跳转。"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
请求体中的内容是通过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball获取方法:
String getParameter(String name) String[] getParameterValues(String name) Enumeration getParameterNames() Map<String,String[]> getParameterMap()
增加一个网页:
新建一个servlet:requestBodyInsert title here
package httpservletRequest;import java.io.IOException;import java.util.Enumeration;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class requestBody */public class requestBody extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、获取单个请求表单值: String username=request.getParameter("username"); System.out.println(username); System.out.println("+++++++++++++++++++++++++++++"); //2、获取多个表单值: String[] hobbys=request.getParameterValues("hobby"); for(String hobby:hobbys) { System.out.println(hobby); } System.out.println("+++++++++++++++++++++++++++++"); //3、获取所以的请求参数值: EnumerationparaNames=request.getParameterNames(); while(paraNames.hasMoreElements()) { System.out.println(paraNames.nextElement()); } System.out.println("+++++++++++++++++++++++++++++"); //4、获取所有的参数,并封装到map Map parameterMap=request.getParameterMap(); for(Map.Entry entry:parameterMap.entrySet()) { System.out.println(entry.getKey()); for(String str:entry.getValue()) { System.out.println(str); } System.out.println("&&&&&&&&&&&&&&&"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
注意:get请求方式的请求参数 上述的方法一样可以获得
解决post提交方式的乱码: request.setCharacterEncoding(“UTF-8”); 解决get提交的方式的乱码: parameter = new String(parameter.getbytes(“iso8859-1”),“utf-8”);
说道请求转发,我们要和response中的重定向进行对比了。详细了解重定向用法,访问:
我们下面通过一个 图来对比重定向和请求转发:转发与重定向的区别?
1)重定向两次请求,转发一次请求 2)重定向地址栏的地址变化,转发地址不变 3)重新定向可以访问外部网站 转发只能访问内部资源 4)转发的性能要优于重定向
实现请求转发需要以下两个方法:
获得请求转发器----path是转发的地址
RequestDispatcher getRequestDispatcher(String path) 通过转发器对象转发 requestDispathcer.forward(ServletRequest request, ServletResponse response)
我们分别创建servlet1和servlet2
servlet1package httpservletRequest;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class servlet1 */public class servlet1 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //servlet1将请求转给servlet2 RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet2");//注意,这里的地址是相对servlet1的。 //执行转发方法: dispatcher.forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
servlet2
package httpservletRequest;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class servlet2 */public class servlet2 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("hello ,my name is servlet2"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
通过上面转发的实例中,我们可以发现,从servlet1向servlet2传送的request是同一个数据域。在此次访问中,如果在servlet1中将request稍加改动,那么在servlet2中接收 到的request就是改动后的结果。
为此,我可以知道: request对象也是一个存储数据的区域对象,只要是域对象,那么就具有如下方法:setAttribute(String name, Object o)
getAttribute(String name) removeAttribute(String name)
我们前面了解到ServletContext对象也是个域对象。它也具有如上三种方法,详见:
注意:request域的作用范围:一次请求中。
ServletContext域与Request域的生命周期比较?
1、ServletContext: 创建:服务器启动 销毁:服务器关闭 域的作用范围:整个web应用 2、request: 创建:访问时创建request 销毁:响应结束request销毁 域的作用范围:一次请求中
转发与重定向的区别?
1)重定向两次请求,转发一次请求 2)重定向地址栏的地址变化,转发地址不变 3)重新定向可以访问外部网站 转发只能访问内部资源 4)转发的性能要优于重定向
客户端地址与服务器端地址的写法?
1、客户端地址: 是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名称 应用: 重定向 2、服务器端地址:服务器内部资源的跳转的地址,特点:不需要写web应用的名称 应用: 转发
转载地址:http://pxhbb.baihongyu.com/