Servlet的API(二)

简介:

目录(?)[+]

        web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。request和response对象既然代表请求和响应,那我们获取客户机提交过来的数据,只需要找request对象即可,要向客户机输出数据,只需要找response对象即可。这一节我们来看看Servlet的这两个对象:HttpServletResponse对象和HttpServletRequest对象。

1. HttpServletRequest对象

        HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象中的方法,可以获得客户的这些信息。

        1)获取客户机环境信息常用的方法如下:(具体见Demo1)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. getRequestURL();   //返回客户端发出请求时的完整URL  
  2. getRequestURI();   //返回请求行中的资源名部分  
  3. getQueryString();  //返回请求行中的参数部分  
  4. getRemoteAddr();   //返回发出请求的客户机的IP地址  
  5. getRemoteHost();   //返回发出请求的客户机完整主机名  
  6. getRemotePort();   //返回客户机所使用的网络端口号  
  7. getLocalAddr();    //返回WEB服务器的IP地址  
  8. getLocalName();    //返回WEB服务器的主机名  
  9. getMethod();       //得到客户机请求方式  
        相应的示例代码Demo1如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //获取客户机环境信息常见的方法  
  2. public class RequestDemo1 extends HttpServlet {  
  3.   
  4.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  5.             throws ServletException, IOException {  
  6.   
  7.         //uri标识一个资源,url标识互联网上的一个资源,所以url是uri的子集  
  8.         System.out.println(request.getRequestURL());//会打印出http://localhost:8080/test/servlet/RequestDemo1  
  9.         System.out.println(request.getRequestURI());//会打印出/test/servlet/RequestDemo1  
  10.           
  11.         //请求http://localhost:8080/test/servlet/RequestDemo1?name=eson_15  
  12.         System.out.println(request.getQueryString());//打印出name=eson_15  
  13.           
  14.         System.out.println(request.getRemoteAddr());//打印出来访地址:127.0.0.1       
  15.         System.out.println(request.getRemoteHost());//打印来访主机:127.0.0.1        
  16.         System.out.println(request.getRemotePort());//打印来访端口号:3969  
  17.         System.out.println(request.getLocalAddr());//打印出服务器地址:127.0.0.1   
  18.           
  19.         System.out.println(request.getMethod());//打印访问方式:GET/POST  
  20.     }  
  21.   
  22.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.   
  25.         doGet(request, response);  
  26.     }  
  27. }  

        2)获取请求信息常用的方法--Map如下:(Demo2)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //获得客户机请求头  
  2. getHeader(String name);  
  3. getHeaders(String name);  //获取指定名称的头的所有值  
  4. getHeaderNames(); //获取所有头的名称  
  5.   
  6. //获得客户机请求参数(客户端提交的数据)  
  7. getParameter(name);  
  8. getParameterValues(String name);  //获取指定参数名的所有值  
  9. getParameterNames();  //获取所有参数名  
  10. getParameterMap();  //获取封装数据的map集合,在框架中使用频繁  
        相应的示例代码Demo2如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class RequestDemo2 extends HttpServlet {  
  2.   
  3.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  4.             throws ServletException, IOException {  
  5.         <pre name="code" class="java">                //获取压缩方式 gzip,deflate.实际中在输出数据之前可以用该方法先判断浏览器是否支持gzip方式  
  6.         System.out.println(request.getHeader("Accept-Encoding"));  
  7.           
  8.         //获取指定名称的头的所有值  
  9.         Enumeration e = request.getHeaders("Accept-Encoding");  
  10.         while(e.hasMoreElements()) {  
  11.             String value = (String) e.nextElement();  
  12.             System.out.println(value);  
  13.         }         
  14.         System.out.println("----------------------------");       
  15.         //获取所有的头和值  
  16.         e = request.getHeaderNames();  
  17.         while(e.hasMoreElements()) {  
  18.             String name = (String) e.nextElement();  
  19.             String value = request.getHeader(name);  
  20.             System.out.println(name + "=" + value);  
  21.         }         
  22.         System.out.println("----------------------------");       
  23.         //http://localhost:8080/day06/servlet/RequestDemo2?name=eson_15  
  24.         System.out.println(request.getParameter("name"));//eson_15  
  25.           
  26.         //http://localhost:8080/day06/servlet/RequestDemo2?like=sing&like=dance  
  27.         String likes[] = request.getParameterValues("like");//获取指定参数名的所有值  
  28.         //重要!获取数组数据的方式(可避免空指针异常)  
  29.         for(int i = 0; likes != null && i < likes.length; i++) {  
  30.             System.out.println(likes[i]);//sing dance  
  31.         }         
  32.         System.out.println("----------------------------");       
  33.         //http://localhost:8080/day06/servlet/RequestDemo2?name=eson_15&like=swim&love=you  
  34.         e = request.getParameterNames();//获取所有参数名  
  35.         while(e.hasMoreElements()) {  
  36.             String name = (String) e.nextElement();  
  37.             String value = request.getParameter(name);  
  38.             System.out.println(name + "=" + value);  
  39.         }         
  40.         System.out.println("----------------------------");       
  41.         ////http://localhost:8080/day06/servlet/RequestDemo2?name=eson_15&like=swim&love=you  
  42.         Map<String, String[]> map = request.getParameterMap();  
  43.         for(Map.Entry<String, String[]> me : map.entrySet()) {  
  44.             String name = me.getKey();  
  45.             String value[] = me.getValue();  
  46.             System.out.println(name + "=" + value[0]);  
  47.         }  
  48.     }  
  49.   
  50.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  51.             throws ServletException, IOException {  
  52.         doGet(request, response);  
  53.     }  
  54. }  

 
 

        3)实现请求转发:(Demo3/test.jsp/Demo4)

        request对象实现请求转发:请求转发指一个web资源受到客户端请求后,通知服务器去调用另一个web资源进行处理。请求转发应用场景:MVC设计模式        request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forwoard方法可以实现请求转发。        request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其他web资源处理。相关方法如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. setAttribute();    //设置属性  
  2. getAttribute();    //获得属性值  
  3. removeAttribute(); //删除某个属性  
  4. getAttributeNames(); //获得所有属性名  
  5. //以上所有方法中的参数我都省略了,括号里为空并不代表没有参数!!   
        相应的示例代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //Demo3:请求转发:MVC 重点  
  2. public class RequestDemo3 extends HttpServlet {  
  3.   
  4.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  5.             throws ServletException, IOException {  
  6.           
  7.         String data = "abcd";  
  8.           
  9.         //开发中不能用ServletContext做容器,因为用户公用一个ServletContext,一个用户设置了数据后,另一个用户如果也设置了,将会覆盖第一个用户的值       
  10. //      this.getServletContext().setAttribute("data", data);  
  11.           
  12.         //request本身就是一个容器,我们可以用request来传递数据,不同的用户有不同的request,相互之间不会产生影响  
  13.         request.setAttribute("data", data);  
  14.                       
  15.         //转发方法1,框架习惯用这种  
  16.       //    RequestDispatcher  rd = this.getServletContext().getRequestDispatcher("/test.jsp");  
  17.       //    rd.forward(request, response);  
  18.           
  19.         //转发方法2, 开发习惯用这种。这两种方法没有区别  
  20.         RequestDispatcher rd = request.getRequestDispatcher("/test.jsp");  
  21.         rd.forward(request, response);  
  22.     }  
  23.   
  24.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  25.             throws ServletException, IOException {  
  26.   
  27.         doGet(request, response);  
  28.     }  
  29. }  
        相应的test.jsp页面如下:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <html>  
  2.   <head>     
  3.   </head>  
  4.   <body>  
  5.     <%  
  6.         //String data = (String) this.getServletContext().getAttribute("data");  
  7.         String data = (String) request.getAttribute("data");  
  8.         out.write(data);  
  9.      %>  
  10.   </body>  
  11. </html>  
        4)获取用户提交数据(Demo4/form.html)
        首先看一下前台页面form.html,主要是获得几个参数:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html>  
  3.   <head>  
  4.     <title>form.html</title>  
  5.       
  6.     <meta name="keywords" content="keyword1,keyword2,keyword3">  
  7.     <meta name="description" content="this is my page">  
  8.     <meta name="content-type" content="text/html; charset=UTF-8">  
  9.     <meta http-equiv="content-type" content="text/html;charset=UTF-8">  
  10.     <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  
  11.   
  12.   </head>  
  13.     
  14.   <body>  
  15.     <form action="/test/servlet/RequestDemo4" method="get">  
  16.         用户名:<input type="text" name="username"/><br/>  
  17.         密码:<input type="password" name="password"/><br/>  
  18.         性别:  
  19.             <input type="radio" name="gender" value="male"/>男  
  20.             <input type="radio" name="gender" value="female"/><br/>  
  21.               
  22.         城市:  
  23.             <select name="city">  
  24.                 <option value="beijing">北京</option>  
  25.                 <option value="shanghai">上海</option>  
  26.                 <option value="guangzhou">广州</option>  
  27.             </select><br/>  
  28.               
  29.         爱好:  
  30.             <input type="checkbox" name="like" value="sing">唱歌  
  31.             <input type="checkbox" name="like" value="dance">跳舞  
  32.             <input type="checkbox" name="like" value="basketball">篮球  
  33.             <input type="checkbox" name="like" value="football">足球  
  34.             <br/>  
  35.               
  36.         简历:  
  37.             <textarea rows="5" cols="60" name="resume">请输入简历</textarea>  
  38.             <br/>  
  39.               
  40.         相片:  
  41.             <input type="file" name="file"/><br/>  
  42.               
  43.             <input type="hidden" name="name" value="xxx"><br/>  
  44.               
  45.         <input type="submit" value="提交"/>  
  46.           
  47.     </form>  
  48.   </body>  
  49. </html>  
        当用户提交后,自动跳转到RequestDemo4这个Servlet来处理:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class RequestDemo4 extends HttpServlet {  
  2.   
  3.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  4.             throws ServletException, IOException {        
  5.           
  6.         request.setCharacterEncoding("UTF-8");//通过UTF-8获得浏览器中的数据 (post方式有效)  
  7.         //关于GET方式,请见下面这个帖子,写的很详细,请认真阅读一下  
  8.         //http://blog.csdn.net/xh16319/article/details/8456547  
  9.   
  10.         System.out.println(request.getParameter("username"));  
  11.         System.out.println(request.getParameter("gender"));  
  12.         System.out.println(request.getParameter("city"));  
  13.           
  14.         String likes[] = request.getParameterValues("like");  
  15.         for(int i = 0; likes != null && i < likes.length; i++){  
  16.             System.out.println(likes[i]);  
  17.         }  
  18.           
  19.         System.out.println(request.getParameter("resume"));  
  20.         System.out.println(request.getParameter("name"));  
  21.     }  
  22.   
  23.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  24.             throws ServletException, IOException {  
  25.   
  26.         doGet(request, response);  
  27.     }  
  28.   
  29. }  
        request比较简单,在开发中主要是用来获取前台带来的数据,以及实现跳转等等。下面看看response对象。

2. HttpServletResponse对象

        这个对象是指服务器的响应,这个对象中封装了想客户端发送数据,发送响应头,发送响应状态码的方法。如:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. PrintWriter getWriter();  /得到字符流  
  2. ServletOutputStream getOutputStream(); //得到字节流  
  3. void setStatus(int sc);  //设置要发送的状态码  
  4. void setHead(String name, String value);   //响应头 等等  
        response常见应用有如下几个:

        1)向客户端输出中文数据:分别以OutputStream和PrintWriter输出(Demo1)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class ResponseDemo1 extends HttpServlet {  
  2.   
  3.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  4.             throws ServletException, IOException {  
  5.           
  6. //      outputChineseByByte(response);  
  7.         outputChineseByChar(response);  
  8.     }  
  9.   
  10.     private void outputChineseByChar(HttpServletResponse response)  
  11.             throws IOException {  
  12.         String data = "中国";   
  13.           
  14.         response.setHeader("content-type""text/html;charset=UTF-8");//通知浏览器以UTF-8打开,注意里面是分号不是逗号  
  15.         response.setCharacterEncoding("UTF-8");//通过response以UTF-8输出  
  16.         /* 
  17.          * 上面两个步骤可以用一个方法来等价 
  18.          * response.setContentType("text/html;charset=UTF-8"); 
  19.          * 在这个方法里相当于做了以上两件事,开发中用该方法比较方便,但是不方便理解,视个人习惯而定 
  20.         */  
  21.         PrintWriter out = response.getWriter();//一定要先将上面设置好才能输出  
  22.         out.write(data);  
  23.     }  
  24.   
  25.     //以字节流方式输出  
  26.     private void outputChineseByByte(HttpServletResponse response)  
  27.             throws IOException, UnsupportedEncodingException {  
  28.         //在服务器端,数据是以哪个码表输出的,那么就要控制浏览器用哪个码表打开  
  29.         String data = "中国";       
  30.         OutputStream out = response.getOutputStream();  
  31.           
  32.         response.setHeader("content-type""text/html;charset=UTF-8");//告诉浏览器用utf-8编码打开  
  33. //      这种用html来模拟http响应头的方式也可以,即告诉浏览器以UTF-8的方式打开  
  34. //      out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());  
  35.           
  36.         out.write(data.getBytes("UTF-8"));//将“中国”这个字符通过字节输出,一定会查码表,浏览器在打开的时候若查的不是这个码表,则就会出错  
  37.     }  
  38.   
  39.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  40.             throws ServletException, IOException {  
  41.   
  42.         doGet(request, response);  
  43.     }  
  44.   
  45. }  

        2)文件下载和中文文件下载(Demo2)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class ResponseDemo2 extends HttpServlet {  
  2.   
  3.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  4.             throws ServletException, IOException {  
  5.   
  6. //      downloadFile(response);  
  7.           
  8.         downloadErrorDemo(response);  
  9.     }  
  10.   
  11.     //中文文件的下载,中文文件名要经过URL编码  
  12.     private void downloadFile(HttpServletResponse response) throws FileNotFoundException, IOException {  
  13.         String realPath = this.getServletContext().getRealPath("/狗狗.jpg"); //狗狗.jpg存放在WebRoot下  
  14.         String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);  
  15.           
  16.         //URLEncoding  
  17.         response.setHeader("content-disposition""attachment;filename=" + URLEncoder.encode(fileName));  
  18.           
  19.         FileInputStream in = new FileInputStream(realPath);  
  20.         int len = 0;  
  21.         byte buffer[] = new byte[1024];  
  22.         OutputStream out = response.getOutputStream();  
  23.         while((len = in.read(buffer)) > 0) {  
  24.             out.write(buffer, 0, len);  
  25.         }  
  26.           
  27.         in.close();  
  28.     }  
  29.       
  30.     //文件下载注意事项:字节流可以处理任意类型的数据,字符流只能处理字符数据,如果用字符流处理字节数据会导致数据丢失  
  31.     private void downloadErrorDemo(HttpServletResponse response) throws FileNotFoundException, IOException {  
  32.         String realPath = this.getServletContext().getRealPath("/狗狗.jpg");  
  33.         String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);  
  34.           
  35.         response.setHeader("content-disposition""attachment;filename=" + URLEncoder.encode(fileName));  
  36.           
  37.         FileReader in = new FileReader(realPath);  
  38.         int len = 0;  
  39.         char buffer[] = new char[1024];  
  40.         PrintWriter out = response.getWriter();  
  41.         while((len = in.read(buffer)) > 0){  
  42.             out.write(buffer, 0, len);  
  43.         }  
  44.         /* 
  45.          * 该程序下载下来的文件无法打开的原因: 
  46.          * 因为任意文件都是通过二进制保存的,那么字符流在读取图片文件时,每次读取一个字符大小的二进制数,该二进制数在gb2312中可能并没有相对应的码,结果就用?代替。 
  47.          * 然后写到浏览器的时候,浏览器拿到?并不能正确解析出原始的二进制数,就用0代替,这样就造成了数据的丢失。 
  48.          * 所以字符流不能去读取字节数据,会导致数据的丢失 
  49.          *  
  50.         */  
  51.         in.close();  
  52.     }  
  53.   
  54.   
  55.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  56.             throws ServletException, IOException {  
  57.   
  58.         doGet(request, response);  
  59.     }  
  60.   
  61. }  

        3)输出随机图片(Demo3)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class ResponseDemo3 extends HttpServlet {  
  2.   
  3.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  4.   
  5.         //6. 设置头,控制浏览器不要缓存图片数据  
  6.         response.setHeader("cache-control""no-cache");  
  7.           
  8.         //5. 通知浏览器以图片方式打开  
  9.         response.setHeader("content-type","image/jpeg");  
  10.           
  11.         //1. 在内存中创建一幅图片  
  12.         BufferedImage image = new BufferedImage(8020, BufferedImage.TYPE_INT_RGB);  
  13.           
  14.         //2. 得到图片  
  15.         Graphics2D g = (Graphics2D)image.getGraphics();  
  16.         g.setColor(Color.WHITE);  
  17.         g.fillRect(008020);//用白色填充整个矩形背景  
  18.           
  19.         //3. 向图片上写数据  
  20.         g.setColor(Color.RED);//设置图片背景  
  21.         g.setFont(new Font(null,Font.BOLD,20));//设置文字  
  22.         g.drawString(makeNum(), 020);//写上随机数  
  23.           
  24.         //4. 将图片写给浏览器  
  25.         ImageIO.write(image, "jpg", response.getOutputStream());  
  26.     }  
  27.   
  28.      private String makeNum() {   
  29.         Random r = new Random();  
  30.         String num = r.nextInt(9999999) + "";//0-9999999  
  31.         StringBuffer sb = new StringBuffer();  
  32.         for(int i = 0; i < 7-num.length(); i++){  
  33.             sb.append("0");  
  34.         }         
  35.         return sb.toString() + num;  
  36.     }  
  37.   
  38.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  39.             throws ServletException, IOException {  
  40.   
  41.         doGet(request, response);  
  42.     }  
  43.   
  44. }  

        4)发送http头以及请求重定向(这一块放在下一篇博客里解说)

3. web工程中url地址的写法

        在程序中有写:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //web工程中url地址的写法  
  2. public class ResponseDemo4 extends HttpServlet {  
  3.   
  4.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  5.             throws ServletException, IOException {  
  6.           
  7.         /*只要是写地址,请统统以"/"开始,若"/"是给服务器用的则代表web工程,若"/"是给浏览器用的则代表webapps**/  
  8.           
  9.         //servletContext  
  10.         this.getServletContext().getRealPath("/dog.jpg");//给服务器用的  
  11.           
  12.         //forward  
  13.         this.getServletContext().getRequestDispatcher("/servlet/ResponseDemo3");//给服务器用的  
  14.           
  15.         //sendRedirect        
  16.         response.sendRedirect("/test/servlet/ResponseDemo3");//给浏览器用的  
  17.           
  18.         //html  <a href="/test/servlet/ResponseDemo3"></a> //给浏览器用的  
  19.     }  
  20.   
  21.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  22.             throws ServletException, IOException {  
  23.   
  24.         doGet(request, response);  
  25.     }  
  26.   
  27. }  
        HttpServletRequest和HttpServletResponse就介绍这么多,如有错误之处,欢迎留言指正~

         相关阅读:http://blog.csdn.net/column/details/servletandjsp.html

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!

-----更多文章请看:http://blog.csdn.net/eson_15

相关文章
|
6月前
|
API
05JavaWeb基础 - Servlet的相关API
05JavaWeb基础 - Servlet的相关API
19 0
|
3月前
|
JSON Java 应用服务中间件
|
8月前
|
JSON 应用服务中间件 API
【计算机网络】Servlet API重点知识汇总
【计算机网络】Servlet API重点知识汇总
|
9月前
|
网络协议 应用服务中间件 API
Servlet的常用Api—HttpServletResponse
Servlet的常用Api—HttpServletResponse
Servlet的常用Api—HttpServletResponse
|
10月前
|
JSON 编解码 前端开发
【JavaEE】Servlet的API详解
【JavaEE】Servlet的API详解
72 0
|
11月前
|
API
java202304java学习笔记第六十二天-ssm-获取servlet相关api
java202304java学习笔记第六十二天-ssm-获取servlet相关api
57 0
|
11月前
|
API
java202304java学习笔记第六十二天-ssm-获取servlet相关api
java202304java学习笔记第六十二天-ssm-获取servlet相关api
67 0
|
应用服务中间件 API
Servlet API 详解
Servlet API 详解
214 0
Servlet API 详解
|
应用服务中间件 API 容器
Servlet入门案例(三)Servlet的生命周期、api和请求方式、工作原理、注解开发
Servlet入门案例(三)Servlet的生命周期、api和请求方式、工作原理、注解开发
91 0
Servlet入门案例(三)Servlet的生命周期、api和请求方式、工作原理、注解开发
|
前端开发 Java API
Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象
Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象
239 0