一、从容器到HttpServlet
- 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();
}
}