4.Servlet的Response和Request
一.综述
-
web服务器接受到客户端的HTTP请求,对于这个请求分别创建一个代表请求的对象HttpServletRequest和一个代表响应的对象HttpServletResponse。
-
如果要获得客户端请求过来的参数:找HttpServletRequest
-
如果要给客户端响应一些参数信息:找HttpServletResponse
-
二.HttpServletResponse
1.简单分类
负责向浏览器发送数据的方法
1 public ServletOutputStream getOutputStream() throws IOException; 2 public PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
1 public void setCharacterEncoding(String charset); 2 public void setContentLength(int len); 3 public void setContentLengthLong(long len); 4 public void setContentType(String type); 5 public void setBufferSize(int size); 6 public void setLocale(Locale loc); 7 8 public void setDateHeader(String name, long date); 9 public void addDateHeader(String name, long date); 10 public void setHeader(String name, String value); 11 public void addHeader(String name, String value); 12 public void setIntHeader(String name, int value); 13 public void addIntHeader(String name, int value); 14 public void setStatus(int sc);
响应的状态码常量
1 int SC_CONTINUE = 100; 2 int SC_SWITCHING_PROTOCOLS = 101; 3 int SC_OK = 200; 4 int SC_CREATED = 201; 5 int SC_ACCEPTED = 202; 6 int SC_NON_AUTHORITATIVE_INFORMATION = 203; 7 int SC_NO_CONTENT = 204; 8 int SC_RESET_CONTENT = 205; 9 int SC_PARTIAL_CONTENT = 206; 10 int SC_MULTIPLE_CHOICES = 300; 11 int SC_MOVED_PERMANENTLY = 301; 12 int SC_MOVED_TEMPORARILY = 302; 13 int SC_FOUND = 302; 14 int SC_SEE_OTHER = 303; 15 int SC_NOT_MODIFIED = 304; 16 int SC_USE_PROXY = 305; 17 int SC_TEMPORARY_REDIRECT = 307; 18 int SC_BAD_REQUEST = 400; 19 int SC_UNAUTHORIZED = 401; 20 int SC_PAYMENT_REQUIRED = 402; 21 int SC_FORBIDDEN = 403; 22 int SC_NOT_FOUND = 404; 23 int SC_METHOD_NOT_ALLOWED = 405; 24 int SC_NOT_ACCEPTABLE = 406; 25 int SC_PROXY_AUTHENTICATION_REQUIRED = 407; 26 int SC_REQUEST_TIMEOUT = 408; 27 int SC_CONFLICT = 409; 28 int SC_GONE = 410; 29 int SC_LENGTH_REQUIRED = 411; 30 int SC_PRECONDITION_FAILED = 412; 31 int SC_REQUEST_ENTITY_TOO_LARGE = 413; 32 int SC_REQUEST_URI_TOO_LONG = 414; 33 int SC_UNSUPPORTED_MEDIA_TYPE = 415; 34 int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; 35 int SC_EXPECTATION_FAILED = 417; 36 int SC_INTERNAL_SERVER_ERROR = 500; 37 int SC_NOT_IMPLEMENTED = 501; 38 int SC_BAD_GATEWAY = 502; 39 int SC_SERVICE_UNAVAILABLE = 503; 40 int SC_GATEWAY_TIMEOUT = 504; 41 int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2.常见应用
-
向浏览器输出消息
-
下载文件
-
获得要下载文件的路径和文件名
-
设置浏览器能够支持下载
-
获取下载文件的输入流
-
创建缓冲区
-
获取OutputStream对象
-
将FileOutputStream流写入到buffer缓冲区中
-
使用OutputStream将缓冲区中的数据输出到客户端
-
-
验证码功能
-
实现重定向:使用场景用户登陆
注:
-
重定向的 / 表示:http://服务器ip:端口/ ,重定向编码302
-
请求转发的 / 表示:http://服务器ip:端口/项目名 ,请求转发编码307
下载文件代码:
1 public class FileServlet extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 4 //1.获取要下载的文件路径 5 String realPath = "F:\\java_code\\ServletCode\\Servlet-response\\src\\main\\resources\\1.jpg"; 6 System.out.println("下载文件的路径:" + realPath); 7 8 //2.获取下载文件名 9 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); 10 11 //3.设置浏览器支持,设置将文件名进行编码,防止中文乱码 12 resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); 13 14 //4.获取下载文件的输入流 15 FileInputStream in = new FileInputStream(realPath); 16 17 //5.创建缓冲区 18 int len = 0; 19 byte[] buffer = new byte[1024]; 20 21 //6.获取OutputStream对象 22 ServletOutputStream out = resp.getOutputStream(); 23 24 //7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端 25 while ((len = in.read(buffer)) > 0) { 26 out.write(buffer, 0, len); 27 } 28 29 in.close(); 30 out.close(); 31 32 33 } 34 35 @Override 36 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 37 doGet(req, resp); 38 } 39 }
验证码功能:
1 public class ImageServlet extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 4 5 //设置浏览器3秒刷新一次 6 resp.setHeader("refresh","3"); 7 8 //在内存中建立一个图片 9 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); 10 11 //得到图片 12 Graphics2D g = (Graphics2D) image.getGraphics(); 13 14 //设置图片样式 15 g.setColor(Color.gray); 16 g.fillRect(0,0,80,20); 17 18 //给图片填充数据 19 g.setColor(Color.orange); 20 g.setFont(new Font(null,Font.BOLD,20)); 21 g.drawString(makeNum(7),0,20); 22 23 //设置浏览器打开图片的方式 24 resp.setContentType("image/jpeg"); 25 //设置浏览器不缓存 26 resp.setDateHeader("expires",-1); 27 resp.setHeader("Cache-Control","no-cache"); 28 resp.setHeader("Pragma","no-cache"); 29 30 //将图片写给浏览器 31 ImageIO.write(image,"jpg",resp.getOutputStream()); 32 33 } 34 35 //生成随机数 36 private String makeNum(int len) { 37 Random random = new Random(); 38 StringBuffer num = new StringBuffer(); 39 while (len > 0) { 40 num.append(random.nextInt(9) + ""); 41 len--; 42 } 43 return num.toString(); 44 } 45 46 @Override 47 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 48 doGet(req, resp); 49 } 50 }
重定向实现
1 public class RedirectServlet extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 4 5 /* 6 传入参数为项目打包的路径名(sr1)+重定向的路径名(image) 7 resp.sendRedirect("/sr1/image"); 8 等价于下面语句 9 resp.setHeader("Location","/sr1/image"); 10 resp.setStatus(302); 11 */ 12 13 14 resp.sendRedirect("/sr1/image"); 15 } 16 17 @Override 18 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 doGet(req, resp); 20 } 21 }
重定向案例:登陆后重定向
- 在index.jsp中登陆
- 在RequestTestServlet中处理,然后重定向
- 重定向到Success.jsp中
RequestTestServlet:
1 public class RequestTestServlet extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 String username = req.getParameter("username"); 7 String password = req.getParameter("password"); 8 9 System.out.println(username + ":" + password); 10 11 resp.sendRedirect("/sr1/success.jsp"); 12 } 13 14 @Override 15 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 16 doGet(req, resp); 17 } 18 }
index.jsp:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <body> 4 <h2>Hello World!</h2> 5 6 <%--${pageContext.request.contextPath}代表当前的项目名,login为web.xml中注册绑定的处理Servlet--%> 7 <form action="${pageContext.request.contextPath}/login" method="get"> 8 用户名:<input type="text" name="username"> <br> 9 密码:<input type="password" name="password"> <br> 10 <input type="submit"> 11 </form> 12 13 14 </body> 15 </html>
success.jsp:
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>Title</title> 5 </head> 6 <body> 7 8 <h1>Success</h1> 9 10 </body> 11 </html>
二.HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过HttpServletRequest的方法,获得客户端的所有信息
1.HttpServletRequest中的一些方法:
2.主要应用
-
获取前端传递的参数(主要是两个方法)
-
public String getParameter(String name);
-
public String[] getParameterValues(String name);
-
-
请求转发
请求转发案例:前端提交登录表单,Servlet处理并转发
LoginServlet:
1 public class LoginServlet extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 req.setCharacterEncoding("utf-8"); 7 resp.setCharacterEncoding("utf-8"); 8 9 String username = req.getParameter("username"); 10 11 String password = req.getParameter("password"); 12 13 String[] hobbys = req.getParameterValues("hobbys"); 14 15 System.out.println(username); 16 System.out.println(password); 17 System.out.println(Arrays.toString(hobbys)); 18 19 20 //通过请求转发 21 req.getRequestDispatcher("/success.jsp").forward(req, resp); 22 23 } 24 25 @Override 26 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 27 doGet(req, resp); 28 } 29 }
登录页面:index.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>登录</title> 5 </head> 6 <body> 7 8 9 <h1>登录</h1> 10 <div> 11 <form action="${pageContext.request.contextPath}/login" method="post"> 12 用户名:<input type="text" name="username"> <br> 13 密码:<input type="password" name="password"> <br> 14 爱好: 15 <input type="checkbox" name="hobbys" value="打篮球"> 打篮球 16 <input type="checkbox" name="hobbys" value="写代码"> 写代码 17 <input type="checkbox" name="hobbys" value="玩游戏"> 玩游戏 18 <input type="checkbox" name="hobbys" value="看电影"> 看电影 19 <br> 20 21 <input type="submit"> 22 </form> 23 </div> 24 25 </body> 26 </html>
成功登录页面:success.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>Success</title> 5 </head> 6 <body> 7 8 <h1>登录成功</h1> 9 </body> 10 </html>