HttpServletResponse
web服务器接收到客户端http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象
常见应用
1.向浏览器输出消息
2.下载文件
1.获取下载文件路径 2.下载文件名是啥? 3.设置想办法让浏览器能够支持下载我们需要的东西 4.获取下载文件的输入流 5.创建缓冲区 6.获取outputstream对象 7.将fileoutputstream流写到buffer缓冲区 8.使用outputstream将缓冲区中的数据输出到客户端!
下载文件代码:
package com.kuang.servlet; import com.sun.deploy.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; public class FileServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.获取下载文件路径 String realPath = "C:\\Users\\LLh\\Desktop\\1.jpg"; // 2.下载文件名是啥? System.out.println("下载文件的路径:"+realPath); final String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3.设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码 resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); // 4.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); // 5.创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; // 6.获取outputstream对象 ServletOutputStream out = resp.getOutputStream(); // 7.将fileoutputstream流写到buffer缓冲区 while ((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); // 8.使用outputstream将缓冲区中的数据输出到客户端! } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } }
web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>filedown</servlet-name> <servlet-class>com.kuang.servlet.FileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>filedown</servlet-name> <url-pattern>/down</url-pattern> </servlet-mapping> </web-app>
3.验证码功能
验证怎么来?
前端实现
后端实现,需要用到Java的图片类,生产一个图片。
Java代码如下:
package com.kuang.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如果让浏览器3秒自动刷新一次; resp.setHeader("refesh","3"); //在内存中创建一个图片 BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_BGR); //得到图片 Graphics graphics = bufferedImage.getGraphics();//笔 //设置图片的背景颜色 graphics.setColor(Color.white); graphics.fillRect(0,0,80,20); //给图片写数据 graphics.setColor(Color.BLUE); graphics.setFont(new Font(null,Font.BOLD,20)); graphics.drawString(makeNum(),0,20); //告诉浏览器,这个请求用图片的方式打开 resp.setContentType("image/jpeg"); //网站存在缓存,不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片写给浏览器 ImageIO.write(bufferedImage,"jpg",resp.getOutputStream()); } //生产随机数 private String makeNum(){ Random random = new Random(); String num = random.nextInt(9999999)+""; StringBuffer sb = new StringBuffer(); for(int i = 0;i < 7-num.length(); i++){ sb.append("0"); } num = sb.toString()+num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
web.xml配置:
<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>com.kuang.servlet.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/img</url-pattern> </servlet-mapping>
4.实现重定向
B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向
常见场景:
用户登录
代码如下:
package com.kuang.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RequestTest extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进来了"); //从request获取请求参数 String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("username = "+username+" password = "+password); resp.sendRedirect("/success.jsp");//返回这个页面 } }
html
<html> <body> <h2>Hello World!</h2> </body> <%--这里提交的路径,需要寻找到项目的路径--%> <%-- ${pageContext.reuqest.contextPath} 代表根路径--%> <form action="/login" method="get"> <input type="text" name="username" >br <input type="password" name="password"> <input type="submit" value="提交"> </form> </html>
web.xml
<servlet> <servlet-name>login</servlet-name> <servlet-class>com.kuang.servlet.RequestTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>