Servlet-2-请求与响应

一、从容器到HttpServlet

  1. Web容器做了什么
    Web容器收集请求信息并创建请求和响应对象 在这里插入图片描述从请求到响应流程示意图
    在这里插入图片描述2. 令人茫然的doXXX()方法
    Servlet中的service()方法有多种方法:doGet()、doPost()、doHead()等。当Method是POST时,请求会调用doPost()方法;当Method是GET时,请求会调用doGet()方法。

二、HttpServletRequest对象

定义:请求封装对象,由Web容器生成。使用该对象可以取得HTTP请求中的信息。在Servlet中,也是使用该对象进行请求的处理。

  • 使用getReader()、getInputStream()读取Body内容
  • 使用getPart()、getParts()取得上传文件
  • 使用RequestDispatcher调派请求

例子一,使用getReader()、getInputStream()读取Body内容

//使用getReader()、getInputStream()读取Body内容
public class GetReaderBody extends HttpServlet {
     public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
             BufferedReader br = request.getReader();//获取BufferedReader对象
             String input ="";
            String body = "";
            while((input = br.readLine())!=null){//遍历body内容
                    body+=input+"<br/>";
             }
             response.setContentType("text/html;charset=UTF-8");//设置响应的类型和编码
             PrintWriter out = response.getWriter();//取得PrintWriter()对象
             out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
             out.println("<HTML>");
             out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
             out.println("  <BODY>");
             out.print(body);
             out.println("  </BODY>");
             out.println("</HTML>");
             out.flush();
             out.close();
    }
}

在这里插入图片描述
在这里插入图片描述
例子二,使用getPart()、getParts()取得上传文件

//使用getPart()、getParts()取得上传文件
@MultipartConfig(location = "D:/tmp/", maxFileSize = 1024 * 1024 * 10)
@WebServlet(name = "getPartBodyContentServlet", urlPatterns = { "/upload.do" }, loadOnStartup = 0)
public class GetPartBodyContent extends HttpServlet {
   public void doPost(HttpServletRequest request, HttpServletResponse response)   throws ServletException, IOException {
	//设置处理编码
	request.setCharacterEncoding("UTF-8");
	Part part = request.getPart("filename");
	// 获得文件名字
	String filename = getFilename(part);
	part.write(filename);
	// 返回页面消息
	response.setContentType("text/html;charset=UTF-8");// 设置响应的类型和编码
	PrintWriter out = response.getWriter();// 取得PrintWriter()对象
	out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
	out.println("<HTML>");
	out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
	out.println("  <script>alert(\"上传成功\")</script><BODY>");
	out.println("  </BODY>");
	out.println("</HTML>");
	out.flush();
	out.close();
     }
     // 获取文件名称
    private String getFilename(Part part) {
           if (part == null)    return null;
            String fileName = part.getHeader("content-disposition");
             if (StringUtils.isBlank(fileName)) {
	return null;
             }
           return StringUtils.substringBetween(fileName, "filename=\"", "\"");
     }
}

@@MultipartConfig属性介绍

属性说明
fileSizeThread数值类型,当上传文件大小大于该值时,内容将先写入缓存文件,默认值为0。
location字符串类型,设置存放生成的文件目录地址,它既是保存路径(在写入的时候,可以忽略路径设定),又是上传过程中临时文件的保存路径,执行Part.write()方法之后,临时文件将被清除。
maxFileSize数值类型,设置允许文件上传的最大值。默认值为 -1L,表示不限制大小。
maxRequestSize数值类型,限制multipart/form-data 请求的最大数,默认值为-1L,表示没有限制大小

三、HttpServletResponse对象

定义:是用于对浏览器的做出响应的操作对象。用它可以设置响应类型,可以直接输出HTML内容。

  • 使用getWriter()输出字符
  • 使用getOutputStream()输出二进制字符
  • 使用sendRedirect()、sendError()方法

例子一、使用getWriter()输出字符

//使用getWriter()输出字符 
@WebServlet(name = "starSurvey", urlPatterns = { "/diaocha.do" })
public class StarSurvey extends HttpServlet{
      public void doPost(HttpServletRequest request, HttpServletResponse response)  
               throws ServletException, IOException {
               request.setCharacterEncoding("UTF-8");
               String username = request.getParameter("username");
               String email = request.getParameter("email");
               String[] starname = request.getParameterValues("starname");
               response.setContentType("text/html;charset=UTF-8");
               PrintWriter out = response.getWriter();
               out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
               out.println("<HTML><HEAD><TITLE>感谢您的调查</TITLE></HEAD><BODY>");
               out.println("联系人:<a href='"+email+"'>"+username+"</a>");
               out.println("<br/>喜欢的明星:");
              String str = "";
              for(int i=0;i<starname.length;i++){
                  str +=starname[i]+",";  
                  str = str.substring(0, str.length()-1);
                  out.println(str);
                  out.println("  </BODY></HTML>");
                  out.close();
             }
}

在这里插入图片描述

例子二、使用getOutputStream()输出二进制字符

//使用getOutputStream()输出二进制字符
@WebServlet(name = "downloadServlet", urlPatterns = { "/download.do" })
public class DownloadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
      //设置响应的内容类型
      response.setContentType("application/msword");
      //设置响应的标头内容
      response.addHeader("Content-disposition","attachment;filename=test.doc");
      //获取资源文件
      InputStream in = getServletContext().getResourceAsStream("/doc/test.doc");
      //输出到浏览器中
      ServletOutputStream os = response.getOutputStream();
      byte[] bytes = new byte[1024];
      int len = -1;
      while((len=in.read(bytes))!=-1){
          os.write(bytes, 0, len);
      }
      //关闭输出输入流
      in.close();
       os.close();
  }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值