AI智能
改变未来

HttpServletRespnse 对象 相关基本应用


HttpServletRespnse 对象相关基本应用

向浏览器输出数据

getOutputStream()

@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("Content-Type","text/html;charset=UTF-8");resp.getOutputStream().write("你好,aaaa".getBytes("UTF-8"));}

或者

getWriter()

//设置消息头,设置编码,自动刷新时间resp.setHeader("Refresh","5");resp.setHeader("Content-Type","text/html;charset=UTF-8");//显示时间resp.getWriter().write("实时时间是"+System.currentTimeMillis());/*登录后3秒跳转可用此方法实现*/

注意事项

  1. getWriter()和getOutputStream()两个⽅法不能同时调⽤。如果同时调⽤就会出现异常。
  2. Servlet程序向ServletOutputStream或PrintWriter对象中写⼊的数据将被Servlet引擎从response⾥⾯获取,Servlet引擎将这些数据当作响应消息的正⽂,然后再与响应状态⾏和各响应头组合后输出到客户端。
  3. Servlet的serice()⽅法结束后【也就是doPost()或者doGet()结束后】,Servlet引擎将检查getWriter或getOutputStream⽅法返回的输出流对象是否已经调⽤过close⽅法,如果没有,Servlet引擎将调⽤close⽅法关闭该输出流对象。

实现文件下载

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws  IOException {//获取资源路径String realPath = this.getServletContext().getRealPath("/download/二维码.jpg");//读取资源FileInputStream fileInputStream = new FileInputStream(realPath);//获取文件名String filename = realPath.substring(realPath.lastIndexOf("\\\\") + 1);//设置消息头,告知浏览器,需要下载该文件resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8")   //设置编码,解决乱码问题);//        将读取到的内容返回给浏览器//按字节读取文件,输出流按字节输出文件ServletOutputStream outputStream = resp.getOutputStream();byte[] bytes =new byte[fileInputStream.available()];  //获取文件字节大小并设置int len = 0;while(  ( len = fileInputStream.read(bytes)) > 0){outputStream.write(bytes , 0 , len);}//关闭流outputStream.close();fileInputStream.close();}

注意事项:

  1. windows系统获取文件的路径分隔符为 “ \\\\” 。

  2. 中文文件名需要加上设置编码,否则会出想下载到的文件名乱码。

  3. 注意最后要关闭流。

  4. 获取文件大小(字节)通过 FileInputStream 的 available() 方法获得。

    以下是通过Debug 下验证获取的文件大小与文件本身大小是否一致。

设置缓存

//首先要明确哪些页面需要缓存。//还是通过设置消息头,设置缓存。@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置不缓存/*resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma", "no-cache");resp.setDateHeader("Expires",-1);*///设置缓存,缓存一分钟resp.setDateHeader("Expires",System.currentTimeMillis() + 1000 * 60);resp.setHeader("Cache-Control","max-age");//输出增加时间便于观察/*配置消息头和消息编码,即可解决浏览器端乱码*/resp.setHeader("Content-Type","text/html;charset=UTF-8");resp.getWriter().print("你好,aaaaa");}

通过调试模式可以查看到缓存的期限。

实现数据压缩

@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//压缩数据String ss = "fsdfhsdfhuisdhfusdhfuids" +"fsdfdsfsdfsdfdsfdafdsfhsdjfhsdjkfhkjds" +"fdsfjdslkfjsldkfjsdlkfjsdkfsdjkff" +"fsjdfjdsklfjdsklfjkldsfjlksdjflksdjflkds" +"dsjfklsdjflsdjfkldsfkjsdkfjsldkfjsdlfk" +"fdsjlkfjdslkfjsdlkfjlkasjflk";//获取GZIP类ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);//输出数据gzipOutputStream.write(ss.getBytes());//GZIPOutputStream有缓存,关闭流清理缓存gzipOutputStream.close();//将压缩的数据取出来byte[] bytes = byteArrayOutputStream.toByteArray();//  resp.getWriter().write(ss+"</br>"+"</br>"+"</br>");System.out.println("原来的长度:    "+ss.getBytes().length);System.out.println("压缩后的长度:    "+bytes.length);//设置编码resp.setHeader("Content-Encoding","gzip");//把数据写到浏览器,让浏览器获取到压缩的数据resp.getOutputStream().write(bytes);}

注意: 回到前面提到的 getWriter() 和 getOutputStream() 不能同时使用。

生出随机图片

@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过java提供的 BufferedImage 生成一张图片BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);//获取这张图片Graphics graphics = image.getGraphics();//设置图片内容,颜色graphics.setColor(Color.white);graphics.setFont(new Font(null,Font.BOLD,20));//随机数字使用自定义方法graphics.drawString(this.getNum(),0,20);//  graphics.fillRect(0,0,80,20);   不需要填充//告知浏览器,发送的是一张图片resp.setHeader("ContentType","jpeg");//Java提供图⽚流给我们使⽤,这是⼀个⼯具类发送图片ImageIO.write(image,"jpeg",resp.getOutputStream());}private String getNum() {   //自定义生成随机数字方法Random random = new Random();int nextInt = random.nextInt(9999999);String num = String.valueOf(nextInt);StringBuilder stringBuffer =new StringBuilder();//不够数字就填充for (int i =0 ;7- num.length() > i ;i++){stringBuffer.append("0");}return stringBuffer.append(num).toString();}

注意 :是否要使用Graphics . fillRect() 方法填充, 填充是否会覆盖要显示的内容,这需要使用者自己衡量决定使用哪一种。

重定向跳转

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//重定向resp.sendRedirect("/hello.jsp");}

注意: jsp 页面是否放在正确的路径上。

web.xml 配置文件

<!DOCTYPE web-app PU56cBLIC"-//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去一个名字,一般是和类名一致--><servlet-name>demoServlet</servlet-name><!--Servlet的位置,有包名需要加上包名--><servlet-class>com.ling.demoServlet</servlet-class></servlet><servlet><!--为这个Servlet去一个名字,一般是和类名一致--><servlet-name>demoHttpServlet</servlet-name><!--Servlet的位置,有包名需要加上包名--><servlet-class>com.ling.demoHttpServlet</servlet-class></servlet><servlet><!--为这个Servlet去一个名字,一般是和类名一致--><servlet-name>downloadServlet</servlet-name><!--Servlet的位置,有包名需要加上包名--><servlet-class>com.ling.downloadServlet</servlet-class></servlet><servlet><!--为这个Servlet去一个名字,一般是和类名一致--><servlet-name>dataServlet</servlet-name><!--Servlet的位置,有包名需要加上包名--><servlet-class>56ccom.ling.dataServlet</servlet-class><init-param><param-name>fileEncoding</param-name><param-value>UTF-8</param-value></init-param></servlet><servlet><!--为这个Servlet去一个名字,一般是和类名一致--><servlet-name>cachedServlet</servlet-name><!--Servlet的位置,有包名需要加上包名--><servlet-class>com.ling.cachedServlet</servlet-class></servlet><servlet><!--为这个Servlet去一个名字,一般是和类名一致--><servlet-name>graphServlet</servlet-name><!--Servlet的位置,有包名需要加上包名--><servlet-class>com.ling.graphServlet</servlet-class></servlet><servlet-mapping><!--配置映射路径--><servlet-name>graphServlet</servlet-name><url-pattern>/graphServlet</url-pattern></servlet-mapping><servlet-mapping><!--配置映射路径--><servlet-name>demoHttpServlet</servlet-name><url-pattern>/demoHttpServlet</url-pattern></servlet-mapping><servlet-mapping><!--配置映射路径--><servlet-name>demoServlet</servlet-name><url-pattern>/d56cemoServlet</url-pattern></servlet-mapping><servlet-mapping><!--配置映射路径--><servlet-name>downloadServlet</servlet-name><url-pattern>/downloadServlet</url-pattern></servlet-mapping><servlet-mapping><!--配置映射路径--><servlet-name>cachedServlet</servlet-name><url-pattern>/cachedServlet</url-pattern></servlet-mapping><servlet-mapping><!--配置映射路径--><servlet-name>dataServlet</servlet-name><url-pattern>/dataServlet</url-pattern></servlet-mapping></web-app>

注意: 需要设置编码时,要明确编码类型。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » HttpServletRespnse 对象 相关基本应用