博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet的请求HttpServletRequest
阅读量:7187 次
发布时间:2019-06-29

本文共 22746 字,大约阅读时间需要 75 分钟。

一、从容器到HttpServlet

1、web容器作了什么

  web容器做的事情就是,创建Servlet实例,并完成Servlet的名称注册及URL模式的对应。在请求来到时,web容器会转发给正确的Servlet来处理请求。

  当请求来到http服务器时,而http服务器转交请求给容器时,容器会创建一个代表档次请求的HttpServletRequest对象,并将请求相关信息设置给该对象。同时,容器会创建一个HttpServletResponse对象,作为稍后要对客户端进行相应的java对象。

     

  接着,容器会根据读取的@webServlet标注或者xml的设置,找出处理该请求的servlet,调用它的service()方法,将创建的HttpServletRequest对象、HttpServletResponse对象传入作为参数,service()方法中会根据HTTP请求的方式,调用对应的doXXX()方法。接着再doXXX()方法中,可以使用request、resposne对象,如:getParameter()取得请求参数,使用getWriter()取得输出用的PrintWriter对象,并进行各项响应处理。对PrintWriter做的输出操作,最后由容器转换为HTTP响应,再由HTTP服务器对浏览器响应。之后容器将对象销毁。

    

2、关于HttpServletRequest

2.1 处理请求参数与标头

  String username = request.getParameter("name");指定请求参数名称来取得对应的值。如果传来的是"123"这样的字符串值,必须使用Integer.parseInt()这类方法剖析为基本类型。

  String[] values = request.getParameterValues("param");就像param=10&param=20&param=30,此时用getParameterValues()取得一个String数组。

  如果想要知道请求中有多少请求参数,则可以使用getParameterNames()方法,会返回一个Enumeration对象。

    Enumeration<String> e = request.getParameterNames();

    while(e.hasMoreElements()){

      String param = e.nextElement();

      ...

    }

  对于HTTP标头的信息(Header),可以通过以下方法取得:

    1、getHeader():使用方式与getParameter类似。

    2、getHeaders():与getParameterValues类似。

    3、getHeaderNames():与getParameterNames类似。

  以下的实例如何取得并显示浏览器送出的标头信息。

1 package cc.openhome; 2  3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Enumeration; 6  7 import javax.servlet.ServletException; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet;10 import javax.servlet.http.HttpServletRequest;11 import javax.servlet.http.HttpServletResponse;12 13 /**14  * Servlet implementation class HeaderServlet15  */16 @WebServlet("/header.view")17 public class HeaderServlet extends HttpServlet {18     private static final long serialVersionUID = 1L;19        20     /**21      * @see HttpServlet#HttpServlet()22      */23     public HeaderServlet() {24         super();25         // TODO Auto-generated constructor stub26     }27 28     /**29      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)30      */31     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {32         // TODO Auto-generated method stub33         PrintWriter out=response.getWriter();34         out.println("");35         out.println("");36         out.println("HeadServlet");37         out.println("");38         out.println("");39         out.println("

HeaderServlet at "+request.getContextPath()+"

");//取得应用程序环境路径40 Enumeration
names=request.getHeaderNames();//取得所有标头名称41 while(names.hasMoreElements()){42 String name=names.nextElement();43 out.println(name+": "+request.getHeader(name)+"
");//输出所有的标头值44 }45 out.println("");46 out.println("");47 out.close();48 }49 50 /**51 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)52 */53 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {54 // TODO Auto-generated method stub55 }56 57 }
HeaderServlet

  运行结果:

    

2.2 getReader()、getInputStream()读取Body内容

  getReader()方法,可以取得一个BufferedReader对象,可以读取Body数据。

  例子1:读取请求Body内容

1 package cc.openhome; 2  3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.PrintWriter; 6  7 import javax.servlet.ServletException; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet;10 import javax.servlet.http.HttpServletRequest;11 import javax.servlet.http.HttpServletResponse;12 13 /**14  * Servlet implementation class BodyServlet15  */16 @WebServlet("/body.view")17 public class BodyServlet extends HttpServlet {18     private static final long serialVersionUID = 1L;19        20     /**21      * @see HttpServlet#HttpServlet()22      */23     public BodyServlet() {24         super();25         // TODO Auto-generated constructor stub26     }27 28     /**29      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)30      */31     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {32         // TODO Auto-generated method stub33         34     }35 36     private String readBody(HttpServletRequest request) throws IOException {37         // TODO Auto-generated method stub38         BufferedReader reader=request.getReader();//取得BufferedReader对象39         String input=null;40         String requestBody="";41         while((input=reader.readLine())!=null){42             requestBody=requestBody+input+"
";43 }44 return requestBody;45 }46 47 /**48 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)49 */50 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {51 // TODO Auto-generated method stub52 String body=readBody(request);53 PrintWriter out=response.getWriter();//取得响应输出对象54 out.println("");55 out.println("");56 out.println("Servlet BodyView");57 out.println("");58 out.println("");59 out.println(body);60 out.println("");61 out.println("");62 out.close();63 }64 65 }
BodyServlet
1  2  3  4 
5 Insert title here 6 7 8
9 名称:
10 密码:
11
12
13 14
form.html

 

 在名称字段上输入“良葛格”,密码上输入“123456”,单机送出按钮,得到:

    

2.3 getPart()、getParts()取得上传文件

  Servlet3.0中,新增了Part接口,可以方便进行文件上传处理。可以通过request对象的getPart()方法取得Part对象。

  例1:上传文件到指定目录。

1 package cc.openhome; 2  3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7  8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.MultipartConfig;10 import javax.servlet.annotation.WebServlet;11 import javax.servlet.http.HttpServlet;12 import javax.servlet.http.HttpServletRequest;13 import javax.servlet.http.HttpServletResponse;14 import javax.servlet.http.Part;15 16 17 /**18  * Servlet implementation class PhotoServlet19  */20 @MultipartConfig(location="e:/java web/workspace/")//设置location属性21 @WebServlet("/photo.do")22 public class PhotoServlet extends HttpServlet {23     private static final long serialVersionUID = 1L;24        25     /**26      * @see HttpServlet#HttpServlet()27      */28     public PhotoServlet() {29         super();30         // TODO Auto-generated constructor stub31     }32 33     /**34      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)35      */36     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {37         // TODO Auto-generated method stub38     }39 40     /**41      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)42      */43     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {44         // TODO Auto-generated method stub45         request.setCharacterEncoding("UTF-8");46         Part part=request.getPart("photo");47         String filename=getFilename(part);48         //writeTo(filename,part);49         part.write(filename);//将文件写入location的指定目录50     }51 52 //    private void writeTo(String filename, Part part) throws IOException {53 //        // TODO Auto-generated method stub54 //        InputStream in=part.getInputStream();55 //        OutputStream out=new FileOutputStream("e:/java web/workspace/"+filename);56 //        byte[] buffer=new byte[1024];57 //        int length=-1;58 //        while((length=in.read(buffer))!=-1){59 //            out.write(buffer,0,length);60 //        }61 //        in.close();62 //        out.close();63 //    }64 65     private String getFilename(Part part) {66         // TODO Auto-generated method stub67         String header=part.getHeader("Content-Disposition");68         String filename=header.substring(header.indexOf("filename=\"")+10,header.lastIndexOf("\""));69         return filename;70     71     }72 73 }
UploadServlet.java
1  2  3  4 
5 Insert title here 6 7 8
9 上传相片:
10
11
12 13
upload.html

  在Tomcat中必须设置@MultipartConfig标注才能使用getPart()相关API。@MultipartConfig也可以设置属性,比如location。@MultipartConfig(location="c:/workspace"),则上例子就可以修改为:

1 package cc.openhome; 2  3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7  8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.MultipartConfig;10 import javax.servlet.annotation.WebServlet;11 import javax.servlet.http.HttpServlet;12 import javax.servlet.http.HttpServletRequest;13 import javax.servlet.http.HttpServletResponse;14 import javax.servlet.http.Part;15 16 17 /**18  * Servlet implementation class PhotoServlet19  */20 @MultipartConfig(location="e:/java web/workspace/")//设置location属性21 @WebServlet("/photo.do")22 public class PhotoServlet extends HttpServlet {23     private static final long serialVersionUID = 1L;24        25     /**26      * @see HttpServlet#HttpServlet()27      */28     public PhotoServlet() {29         super();30         // TODO Auto-generated constructor stub31     }32 33     /**34      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)35      */36     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {37         // TODO Auto-generated method stub38     }39 40     /**41      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)42      */43     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {44         // TODO Auto-generated method stub45         request.setCharacterEncoding("UTF-8");46         Part part=request.getPart("photo");47         String filename=getFilename(part);48         //writeTo(filename,part);49         part.write(filename);//将文件写入location的指定目录50     }51 52 //    private void writeTo(String filename, Part part) throws IOException {53 //        // TODO Auto-generated method stub54 //        InputStream in=part.getInputStream();55 //        OutputStream out=new FileOutputStream("e:/java web/workspace/"+filename);56 //        byte[] buffer=new byte[1024];57 //        int length=-1;58 //        while((length=in.read(buffer))!=-1){59 //            out.write(buffer,0,length);60 //        }61 //        in.close();62 //        out.close();63 //    }64 65     private String getFilename(Part part) {66         // TODO Auto-generated method stub67         String header=part.getHeader("Content-Disposition");68         String filename=header.substring(header.indexOf("filename=\"")+10,header.lastIndexOf("\""));69         return filename;70     71     }72 73 }
UploadServlet.java

  如果有多个文件要上传,可以使用getParts方法,这回返回一个Collection<Part>,其中是每个上传文件的part对象。  

  例子2:上传多个文件

1 package cc.openhome;  2   3 import java.io.DataInputStream;  4 import java.io.FileOutputStream;  5 import java.io.IOException;  6 import java.io.UnsupportedEncodingException;  7   8 import javax.servlet.ServletException;  9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13  14  15  16 /** 17  * Servlet implementation class UploadServlet 18  */ 19 @WebServlet("/upload.do") 20 public class UploadServlet extends HttpServlet { 21     private static final long serialVersionUID = 1L; 22         23     /** 24      * @see HttpServlet#HttpServlet() 25      */ 26     public UploadServlet() { 27         super(); 28         // TODO Auto-generated constructor stub 29     } 30  31     /** 32      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 33      */ 34     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 35         // TODO Auto-generated method stub 36     } 37  38     /** 39      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 40      */ 41     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 42         // TODO Auto-generated method stub 43         request.setCharacterEncoding("UTF-8"); 44         //锟斤拷取锟斤拷锟斤拷Body 45         byte[] body=readBody(request); 46         //取锟斤拷锟斤拷锟斤拷Body锟斤拷锟捷碉拷锟街凤拷锟斤拷锟斤拷示 47         String textBody=new String(body,"UTF-8"); 48         //取锟斤拷锟较达拷锟斤拷锟斤拷锟斤拷锟侥硷拷 49         String filename=getFilename(textBody); 50         //取锟斤拷锟侥硷拷锟斤拷始锟斤拷锟斤拷锟轿伙拷锟� 51         Position p=getFilePosition(request,textBody); 52         //锟斤拷锟斤拷锟斤拷募锟� 53         writeTo(filename,body,p); 54     } 55  56     private void writeTo(String filename, byte[] body, Position p) throws IOException { 57         // TODO Auto-generated method stub 58         FileOutputStream fileOutputStream=new FileOutputStream("e:/java web/workspace/"+filename); 59         fileOutputStream.write(body,p.begin,(p.end-p.begin)); 60         fileOutputStream.flush(); 61         fileOutputStream.close(); 62     } 63  64     private Position getFilePosition(HttpServletRequest request, String textBody) throws UnsupportedEncodingException { 65         // TODO Auto-generated method stub 66         //取得实际上传的文件 67         String contentType=request.getContentType(); 68         String boundaryText=contentType.substring(contentType.lastIndexOf("=")+1,contentType.length()); 69         //取得实际上传的文件 70         int pos=textBody.indexOf("filename=\""); 71         pos=textBody.indexOf("\n",pos)+1; 72         pos=textBody.indexOf("\n",pos)+1; 73         pos=textBody.indexOf("\n",pos)+1; 74         int boundaryLoc=textBody.indexOf(boundaryText,pos)-4; 75         int begin=((textBody.substring(0,pos)).getBytes("GBK")).length; 76         int end=((textBody.substring(0,boundaryLoc)).getBytes("GBK")).length; 77         return new Position(begin, end); 78     } 79  80     private String getFilename(String textBody) { 81         // TODO Auto-generated method stub 82         String filename=textBody.substring(textBody.indexOf("filename=\"")+10); 83         filename=filename.substring(0,filename.indexOf("\n")); 84         filename=filename.substring(filename.lastIndexOf("\\")+1,filename.indexOf("\"")); 85         return filename;         86     } 87  88     private byte[] readBody(HttpServletRequest request) throws IOException { 89         // TODO Auto-generated method stub 90         int formatDataLength=request.getContentLength(); 91         DataInputStream dataStream=new DataInputStream(request.getInputStream());//取锟斤拷InputStraem锟侥讹拷锟斤拷 92         byte body[]=new byte[formatDataLength]; 93         int totalBytes=0; 94         while(totalBytes
UploadServlet2.java
1  2  3  4 
5 Insert title here 6 7 8
9 文件1:
10 文件2:
11 文件3:
12
13
14 15
multi-upload.html

2.4 使用RequestDispatcher调派请求

  在web应用程序中,经常需要多个Servlet来完成请求。例如,将另一个Servlet的请求处理流程包含进来,或者将请求转发forward给别的servlet处理。可以使用:

    RequestDispatcher dispatcher = request.getRequestDispatcher("some.do");

  (1)、使用include()方法

    将另一个servlet的操作流程包括至目前的servlet操作之中。

    例1:include方法

1 package cc.openhome; 2  3 import java.io.IOException; 4 import java.io.PrintWriter; 5  6 import javax.servlet.RequestDispatcher; 7 import javax.servlet.ServletException; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet;10 import javax.servlet.http.HttpServletRequest;11 import javax.servlet.http.HttpServletResponse;12 13 /**14  * Servlet implementation class Some15  */16 @WebServlet("/some.view")17 public class Some extends HttpServlet {18     private static final long serialVersionUID = 1L;19        20     /**21      * @see HttpServlet#HttpServlet()22      */23     public Some() {24         super();25         // TODO Auto-generated constructor stub26     }27 28     /**29      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)30      */31     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {32         // TODO Auto-generated method stub33         PrintWriter out=response.getWriter();34         out.println("Some do one...");35         RequestDispatcher dispatcher=request.getRequestDispatcher("other.view?data=123456");36         dispatcher.include(request, response);37         out.println("Some do two...");38         out.close();39     }40 41     /**42      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)43      */44     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {45         // TODO Auto-generated method stub46     }47 48 }
some.java
1 package cc.openhome; 2  3 import java.io.IOException; 4 import java.io.PrintWriter; 5  6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest;10 import javax.servlet.http.HttpServletResponse;11 12 /**13  * Servlet implementation class OtherServlet14  */15 @WebServlet("/other.view")16 public class OtherServlet extends HttpServlet {17     private static final long serialVersionUID = 1L;18        19     /**20      * @see HttpServlet#HttpServlet()21      */22     public OtherServlet() {23         super();24         // TODO Auto-generated constructor stub25     }26 27     /**28      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)29      */30     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {31         // TODO Auto-generated method stub32         PrintWriter out=response.getWriter();33         out.println("Other do one..");34     }35 36     /**37      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)38      */39     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {40         // TODO Auto-generated method stub41     }42 43 }
othersome.java

   运行结果:网页上看到响应顺序是Some do one ... Other do one... Some do two.. .    

  (2)、使用forward()方法

    将处理请求转发给别的Servlet。

    例2:forwod方法

1 package cc.openhome; 2  3 import java.io.IOException; 4  5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse;10 11 import com.sun.javafx.sg.prism.NGShape.Mode;12 import com.sun.media.sound.ModelAbstractChannelMixer;13 14 /**15  * Servlet implementation class HelloController16  */17 @WebServlet("/hello.do")18 public class HelloController extends HttpServlet {19     private static final long serialVersionUID = 1L;20     private HelloModel model=new HelloModel();21     /**22      * @see HttpServlet#HttpServlet()23      */24     public HelloController() {25         super();26         // TODO Auto-generated constructor stub27     }28 29     /**30      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)31      */32     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {33         // TODO Auto-generated method stub34         String name=request.getParameter("user");//收集请求参数35         String message=model.doHello(name);//委托HelloModel对象处理36         request.setAttribute("message", message);//将结果信息设置至请求对像成属性37         request.getRequestDispatcher("hello1.view").forward(request, response);38     }39 40     /**41      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)42      */43     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {44         // TODO Auto-generated method stub45         46     }47 48 }
HelloController.java
1 package cc.openhome; 2  3 import java.util.*; 4  5  6  7 public class HelloModel { 8     private Map
messages=new HashMap
(); 9 public HelloModel(){10 messages.put("caterpillar", "Hello");11 messages.put("Justin", "Welcome");12 messages.put("momor", "Hi");13 }14 public String doHello(String user){15 String message=messages.get(user);16 return message+", "+user+"!";17 }18 }
HelloModel.java 
1 package cc.openhome; 2  3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 /**11  * Servlet implementation class HelloView12  */13 @WebServlet("/hello1.view")14 public class HelloView extends HttpServlet {15     private static final long serialVersionUID = 1L;16     private String htmlTemplate=17               ""18             +     ""19             +        "
"21 + "%s"22 + ""23 + ""24 + "

%s

"25 + ""26 +""; 27 /**28 * @see HttpServlet#HttpServlet()29 */30 public HelloView() {31 super();32 // TODO Auto-generated constructor stub33 }34 35 /**36 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)37 */38 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {39 // TODO Auto-generated method stub40 String user=request.getParameter("user");//取得请求参数41 String message=(String) request.getAttribute("message");//取得请求属性42 String html=String.format(htmlTemplate, user,message);//产生html结果43 response.getWriter().print(html);//输出html结果44 45 }46 47 /**48 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)49 */50 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {51 // TODO Auto-generated method stub52 }53 54 }
HelloView.java

  运行结果:(Model2架构)

    

 

当神已无能为力,那便是魔渡众生

转载地址:http://phykm.baihongyu.com/

你可能感兴趣的文章
1.8 字典 1.9 字典练习 2.0/2.1 流程控制-if条件判断
查看>>
软件包安装
查看>>
CentOS6下配置Tomcat7以非root用户在80端口自启动(JSVC)
查看>>
elasticsearch5.0.0中聚合和脚本的变化
查看>>
修改 Docker 中 MySQL 容器的编码
查看>>
HeadFirst设计模式篇七:模板方法模式
查看>>
给自己的区块链添加POW-工作量证明
查看>>
unix ‘’ “” 等笔记
查看>>
子域名间 的session共享
查看>>
webpack使用的一些看法
查看>>
大数据学习系列----文章汇总
查看>>
ios开发:使用sqlite存储数据
查看>>
C++ map下标访问的问题
查看>>
go filepath Abs
查看>>
透视JVM之垃圾回收
查看>>
【MySQL】replace into
查看>>
jxl 操作模板,自适应高度HssfCellStyle 自适应。
查看>>
从SharePoint当前状态看企业未来发展
查看>>
css02
查看>>
Hot Standby 与 Stream Replication
查看>>