本文共 22746 字,大约阅读时间需要 75 分钟。
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服务器对浏览器响应。之后容器将对象销毁。
String username = request.getParameter("name");指定请求参数名称来取得对应的值。如果传来的是"123"这样的字符串值,必须使用Integer.parseInt()这类方法剖析为基本类型。
String[] values = request.getParameterValues("param");就像param=10¶m=20¶m=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 Enumerationnames=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 }
运行结果:
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 }
1 2 3 4 513 14Insert title here 6 7 8
在名称字段上输入“良葛格”,密码上输入“123456”,单机送出按钮,得到:
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 }
1 2 3 4 512 13Insert title here 6 7 8
在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 }
如果有多个文件要上传,可以使用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
1 2 3 4 514 15Insert title here 6 7 8
在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 }
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 }
运行结果:网页上看到响应顺序是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 }
1 package cc.openhome; 2 3 import java.util.*; 4 5 6 7 public class HelloModel { 8 private Mapmessages=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 }
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 }
运行结果:(Model2架构)
当神已无能为力,那便是魔渡众生
转载地址:http://phykm.baihongyu.com/