您的位置:首页 > 理论基础 > 计算机网络

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秒跳转可用此方法实现*/

注意事项

  1. getWriter()和getOutputStream()两个⽅法不能同时调⽤。如果同时调⽤就会出现异常。
  2. Servlet程序向ServletOutputStream或PrintWriter对象中写⼊的数据将被Servlet引擎从response⾥⾯获取,Servlet引擎将这些数据当作响应消息的正⽂,然后再与响应状态⾏和各响应头组合后输出到客户端。
  3. 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();
}

注意事项:

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

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

  3. 注意最后要关闭流。

  4. 获取文件大小(字节)通过 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>

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: