HttpServletRespnse 对象 相关基本应用
2020-09-01 22:53
2001 查看
HttpServletRespnse 对象相关基本应用
向浏览器输出数据
getOutputStream()
@Override protected 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秒跳转可用此方法实现*/
注意事项
- getWriter()和getOutputStream()两个⽅法不能同时调⽤。如果同时调⽤就会出现异常。
- Servlet程序向ServletOutputStream或PrintWriter对象中写⼊的数据将被Servlet引擎从response⾥⾯获取,Servlet引擎将这些数据当作响应消息的正⽂,然后再与响应状态⾏和各响应头组合后输出到客户端。
- Servlet的serice()⽅法结束后【也就是doPost()或者doGet()结束后】,Servlet引擎将检查getWriter或getOutputStream⽅法返回的输出流对象是否已经调⽤过close⽅法,如果没有,Servlet引擎将调⽤close⽅法关闭该输出流对象。
实现文件下载
@Override protected 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(); }
注意事项:
-
windows系统获取文件的路径分隔符为 “ \\” 。
-
中文文件名需要加上设置编码,否则会出想下载到的文件名乱码。
-
注意最后要关闭流。
-
获取文件大小(字节)通过 FileInputStream 的 available() 方法获得。
以下是通过Debug 下验证获取的文件大小与文件本身大小是否一致。
设置缓存
//首先要明确哪些页面需要缓存。 //还是通过设置消息头,设置缓存。 @Override protected 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"); }
通过调试模式可以查看到缓存的期限。
实现数据压缩
@Override protected 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() 不能同时使用。
生出随机图片
@Override protected 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() 方法填充, 填充是否会覆盖要显示的内容,这需要使用者自己衡量决定使用哪一种。
重定向跳转
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //重定向 resp.sendRedirect("/hello.jsp"); }
注意: jsp 页面是否放在正确的路径上。
web.xml 配置文件
<!DOCTYPE web-app PU 56c BLIC "-//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> 56c com.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>/d 56c emoServlet</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>
注意: 需要设置编码时,要明确编码类型。
相关文章推荐
- poi操作Excel相关对象属性介绍及中级应用
- 论Java WEB应用中最基本的单表增删改查的实现和及相关错误模式
- 深入体验JavaWeb开发内幕——pageContext对象与JSP中标签的简介和相关应用
- \t\tRange对象基本操作应用示例
- js对象、继承,原型链相关知识的复习及应用心得
- Ajax应用之XMLHttpRequest对象重用(IE)
- 塑胶行业应用点――水口料的基本知识及相关管理
- activity5工作流相关内置对象获取与应用
- HTML中table表格的基本语法应用和布局思路、表格的跨行跨列、表格相关所有标签。 HTML 列表相关标签、有序列表、无序列表、定义列表
- 面向对象的基本概述、内存分析、应用示例
- 黑马程序员_Java基础_泛型应用 和 基本数据类型对象包装类
- [转]基本应用层的TCP/IP协议介绍 (HTTP/FTP/POP/SMTP)
- ashx中应用HttpContext.Current.Session ,呈现未将对象引用设置到实例(转)
- 蓝牙基本介绍及相关应用
- Ajax简单应用示例: XMLHttpRequest对象实例化方式及调用
- XMLHttpRequest对象的基本属性:
- javascript xmlhttp 对象应用
- Hibernate持久化对象的状态及session的基本应用
- XMLHttpRequest对象发送请求的基本步骤
- Excel VBA Range对象基本操作应用示例(转贴,实用参考)