数据压缩(Gzip),重定向,转发,图片下载

sendRedirect重定向和转发:

重定向方法一:1)resp.setStatus(HttpServletResponse.SC_FOUND);//或302---设置状态  2)resp.setHeader("Location","other.jsp");

重定向方法二:resp.sendRedirect(“other.jsp”);

转发:req.getRequestDispatcher("jsps/result.jsp").forward(req, resp);

代码演示

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RedirectServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("经过后台我们这里可以控制.....");
		
		//通过http协议的响应头来实现重定向
		//重定向方法一
//		resp.setStatus(HttpServletResponse.SC_FOUND);  //也可以直接用302
//		resp.setHeader("Location", "/passwardDemo2/jsps/result.jsp");
		
		//重定向方法二----这种方法比较常用
		resp.sendRedirect("/passwardDemo2/jsps/result.jsp");  //这种方式函数内部给我们设置了状态码,更简单!!!
		
		
		//转发
//		RequestDispatcher rd = req.getRequestDispatcher("jsps/result.jsp");
//		rd.forward(req, resp);
	}
	
	
}

Content-Encoding使用压缩的数据:

//1、声明输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
//2、声明压缩流
GZipOutputStream zipout = new GZipOutputStream(out);
//3、向输出流压缩数据,此时数据写入到out中
zipout.write(“someString”.getBytes(“utf-8”));
Zipout.close();  //不要忘了关闭
//4、向客户端发送数据
设置响应头:
resp.setHeader("Content-Encoding","gzip");
resp.setHeader("Content-Length",""+b.length);
resp.setHeader("Content-Type","text/html;charset=UTF-8");
response.getOutputStream().write(out.toByteArray());
使用场景:
限制流量的客户端。
代码演示
package cn.hncu.servlet;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//压缩数据时,必须数据的格式具有一定的大小时压缩才能发挥作用,太小了不起作用
public class GzipServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
//		System.out.println("abc...");
//		int a = 10/0;    //Exception----会导致500的内部错误(出错)

		String str = "abcdefghijklmnopqrstuvwxyzaaaaaaaaaaaaaaaaaaaaadddddddddddddd" +
				"ddddddddddddddddddddd湖南城市学院ddddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaa" +
				"ddddddddddddddddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaa";
		byte[] src = str.getBytes("utf-8");
		System.out.println("原始数据:"+src.length);
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		GZIPOutputStream gzipOut = new GZIPOutputStream(bout);   //把原始数据压缩到一个输出(在这里为缓冲流)流当中,进过分析采用缓冲流好
		gzipOut.write(src);    //把src压缩到bout中去
		gzipOut.close();       //由于缓存流需要进行刷新,关流自带刷新
		byte[] dest = bout.toByteArray();    //把原数据src 压缩成 目的数据dest
		System.out.println("压缩之后的目的数据:"+dest.length);
		
		//输出压缩数据时必须设置响应头
		resp.setContentType("text/html;charset=utf-8");  //这里设置编码时注意一下,编码是电脑平台(本地的系统)的编码
		resp.setHeader("Content-Encoding", "gzip");
		
		resp.getOutputStream().write(dest);   //把数据从后台写到前端去
	}
	
}

Content-Disposition响应头下载:

用于指定是否下载资源。
resp.setContentType("application/force-download");
resp.setHeader("Content-Disposition","attachment;filename=\""+name+"\"");
//如果是中文要进行编码
String name = "我的图片.jpg“;
name = URLEncoder.encode(name,"UTF-8");
//以下使用IO读取文件
InputStream in = new FileInputStream(path);
byte[] b = new byte[1024];
int len = 0;
OutputStream out = resp.getOutputStream();
     while((len=in.read(b))!=-1){
     out.write(b,0,len);
}
代码演示
package cn.hncu.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//告诉浏览器以何种方式打开文件---响应头
		//上面是给流操作用的
		resp.setContentType("application/force-download");
		String fileName = "1.jpg";
		//如果图片的名字是中文要进行编码
		InputStream fin = DownServlet.class.getClassLoader().getResourceAsStream(fileName);
		
		//下面是给用户能够看到图片的中文名字设置的(下载时提示时给用户看的)
		//测试了一下:火狐还是乱码,360浏览器和IE可以正常读取
		fileName = "林允儿.jpg";
		fileName = URLEncoder.encode(fileName, "UTF-8");   //中文的话必须编码,如果不编码下载时文件名为乱码
		resp.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\"");
		
		//FileInputStream fin = new FileInputStream(fileName);
		OutputStream out = resp.getOutputStream();
		byte[] buf = new byte[1024];
		int len = 0;
		while((len=fin.read(buf))!=-1){
			out.write(buf, 0, len);
		}
	}
	
}

index.jsp文件代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>



	
		验证码界面
		
	
	
	
		

欢迎来到湖南城市学院

城院风景

湖南城市学院官网
进入我的子页

验证码

用户名:
密码:
确认密码:
验证码: 看不清,换一张
  
用户名:
密码:
确认密码:
验证码: 看不清,换一张
  

HTTP协议演示Referer属性防止网站盗连

欣赏图片
页面内容压缩--gzip演示
超链接
重定向/转发
下载图片







你可能感兴趣的:(后台Tomcat服务器)