HttpServletResponse对象和响应乱码解决方式

HttpResponse对象

request对象:
	获取客户端数据
response对象:
	向客户端输出数据
	
	常用方法								描述
addHeader(String name, String value) 添加指定的键值到响应头信息中
containsHeader(String name) 		判断响应的头部是否被设置
encodeURL(String url) 				编码指定的 URL
sendError(int sc) 					使用指定状态码发送一个错误到客户端
setHeader(String name, String value) 设置指定响应头的值
setStatus(int sc) 					 给当前响应设置状态
setContentType(String ContentType)  设置响应的 MIME 类型
getWriter() 						获取输出字符流
getOutputStream()					 获取输出的字节流

刷新和页面自动跳转
	resp.setHeader("refresh","2")
1. 常用方法
public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("s01.....");
		// 添加指定的键值到响应头信息中
		resp.addHeader("aaa", "bbb");
		// 判断响应的头部是否被设置
		boolean containsHeader = resp.containsHeader("Date");
		System.out.println(containsHeader);
		System.out.println(resp.containsHeader("aaa"));
		// 使用指定状态码发送一个错误到客户端
		//resp.sendError(404,"对不起,请联系XXX购买VIP");
		// 设置指定响应头的值
		resp.setHeader("aaa", "ccc");
		// 给当前响应设置状态
		resp.setStatus(200);
		// 设置响应的 MIME 类型
		// 查询响应文件对应的 MIME 类型,通过Tomcat服务器下conf下的web.xml可以查到
		// ❤只要是浏览器不识别的MIME类型,会直接进行下载操作
		resp.setContentType("text/html;charset=utf-8");
		// ❤获取输出字符流  不能同时使用输出字符流和输出字节流
		//resp.getWriter().write("hello

Hello World

");
// ❤输出字节流 resp.getOutputStream().write("

Hello World

"
.getBytes()); } } 2. 自动跳转 public class Servlet02 extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 定时刷新 response.setHeader("refresh","3;http://www.jd.com"); response.setHeader("refresh", "3;url=index.html"); }

解决响应乱码

后台服务器默认是ISO-8859-1 前后台字符集不一样出现乱码
1. 字符流输出出现乱码(response.getWriter().write("

你好啊

");) 设置服务器默认编码字符集 没有设置时显示??? 设置成UTF-8显示浣犲ソ鍟� 解决办法: a.设置成GBK (只能针对前台是GBK字符集) b.同时指定前台和后台的字符集 (response.setContentType("text/html;charset=utf-8")) 2. 字节流输出出现乱码(response.getOutputStream().write("

你好

".getBytes());) 前台编码GBK 显示浣犲ソ鍟� .getBytes() 默认当前eclipse环境使用的编码 解决办法: a. 因为前台是GBK,所以设置后台字符集GBK response.getOutputStream().write("

你好啊

".getBytes("GBK")); b. 或者指定前台为UTF-8 response.setHeader("content-type", "text/html;charset=UTF-8"); 同时解决输出字节流和输出字符流 乱码问题 response.setContentType("text/html;charset=utf-8");
public class Servlet03 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 后台服务器默认ISO-8859-1进行编码  由于前台和后台字符集不一致,所有乱码
		
		// 输出字符流解决乱码方案
		
		// 设置服务器默认编码字符集   没有设置的时候 ???  设置成UTF-8  浣犲ソ鍟�   设置成GBK能够解决,只能针对前台是GBK字符集
		//response.setCharacterEncoding("UTF-8");
		// 设置前台的编码
		//response.setHeader("content-type", "text/html;charset=UTF-8");
		// 上面两行可以用一行代码实现,同时指定前台和后台的字符集
		//response.setContentType("text/html;charset=utf-8");
		//response.getWriter().write("

你好啊

");
// 输出字节流解决乱码方案 // 前台编码GBK 显示浣犲ソ鍟� .getBytes() 默认当前环境使用的编码 //response.getOutputStream().write("

你好啊

".getBytes());
// 前台编码GBK 指定了后台编码GBK 还没有固定前台编码 显示你好啊 //response.getOutputStream().write("

你好啊

".getBytes("GBK"));
// 只需指定前台UTF-8 // 指定前台 //response.setHeader("content-type", "text/html;charset=UTF-8"); // ❤同时解决输出字节流和输出字符流 乱码问题 response.setContentType("text/html;charset=utf-8"); response.getOutputStream().write("

你好啊

"
.getBytes("UTF-8")); } }

响应图片

两种方式显示图片
	a. img标签
	b. 动态响应图片给客户端,通过输入流读取到内存,然后通过输出流写出到客户端即可。值得注意的是,在客户端解析资源时默认是以文本(text/html)的形式,当响应图片时需要指定响应头信息,告知客户端响应内容为图片形式,使用一种叫做 MIME 类型的东西来指定。MIME 类型见Tomcat 的 web.xml 文件

/**
 * 响应图片
 */
public class ImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 方式一:通过img标签  设置src图片路径
		response.setContentType("text/html;charset=utf-8");
		//response.getWriter().write("");
		
		// 方式二:通过输入流读取图片,然后通过输出流输出图片
		// 获取用户请求图片名称参数
		String imageName = request.getParameter("imageName");
		// 判断参数
		if(imageName == null || "".equals(imageName)){
			response.getWriter().write("请告诉我你要看啥图片");
			return;
		}
		// 获取图片路径
		String realPath = request.getServletContext().getRealPath("/WEB-INF/image/");
		System.out.println(realPath);
		System.out.println(realPath + imageName);
		
		// 得到图片
		//路径无法确定
		//File file = new File("E:/Journey/Mage/class/06middle/code/servletResponse/WebContent/image/timg.jpg");
		
		File file = new File(realPath + imageName);
		// 判断是否存在并且是否是文件
		if(file != null && file.isFile()){
			// 判断用户访问的图片类型   timg.jpg
			String imageType = imageName.split("\\.")[1];
			if("jpg".equals(imageType) || "jpeg".equals(imageType)){
				response.setContentType("image/jpeg;charset=utf-8");
			}else if("png".equals(imageType)){
				response.setContentType("image/png;charset=utf-8");
			}else if("gif".equals(imageType)){
				response.setContentType("image/gif;charset=utf-8");
			}
			// 指定响应类型
			//response.setContentType("image/jpeg;charset=utf-8");
			// 是文件
			// 获取输入流
			FileInputStream in = new FileInputStream(file);
			// 获取字节输出流
			ServletOutputStream out = response.getOutputStream();
			// 响应图片
			// 创建字节数组
			byte[] car = new byte[1024];
			int len = 0;
			while((len = in.read(car)) != -1){
				out.write(car, 0, len);
			}
			// 关闭
			in.close();
			out.close();
		}else{
			// 不是文件或者不存在
			response.getWriter().write("请输入正确的图片名称");
			return;
		}

	}

}

重定向跳转

HttpServletResponse对象和响应乱码解决方式_第1张图片

  路径问题:
  	相对路径:
 		书写路径时,无论是哪类请求相对路径都是相对当前资源的路径
 		书写格式:直接从当前路径开始写,目录前不加任何符号;a.html   html/b.html
 		相对路径在请求转发时可能会失效,在请求转发的情况下,因为地址栏不会发生改变,因此开发中不推荐使用相对路径
  	绝对路径:
  		格式:以 http:// 开头,或者以 / 开头
 	            ❤浏览器中:“/”代表的是 http://主机|IP:端口
		 ❤服务器中:“/”代表的是 http://主机|IP:端口/站点名
 
public class Servlet01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("s01...");
		// ********相对路径*************
		// 请求转发跳转到s02
		//request.getRequestDispatcher("s02").forward(request, response);
		// 请求转发跳转到index.html
		//request.getRequestDispatcher("index.html").forward(request, response);
		// 请求转发跳转到a/index.html
		request.getRequestDispatcher("a/index.html").forward(request, response);
		
		// 重定向跳转到s02
		//response.sendRedirect("s02");
		// 重定向跳转到index.html
		//response.sendRedirect("index.html");
		// 重定向跳转到a/index.html
		//response.sendRedirect("a/index.html");
		
		
		// *********绝对路径**********
		// 请求转发跳转到s02
		//request.getRequestDispatcher("/s02").forward(request, response);
		// 请求转发跳转到index.html
		//request.getRequestDispatcher("/index.html").forward(request, response);
		// 请求转发跳转到a/index.html
		//request.getRequestDispatcher("/a/index.html").forward(request, response);
		// 请求转发跳转到 http://xxxx   HTTP Status 404 - /path/http://taobao.com
		//request.getRequestDispatcher("http://taobao.com").forward(request, response);
		
		// 重定向跳转到s02
		//response.sendRedirect("/s02");  HTTP Status 404 - /s02
		//response.sendRedirect("/path/s02");
		// 重定向跳转到index.html
		//response.sendRedirect("/path/index.html");
		// 重定向跳转到a/index.html
		//response.sendRedirect("/path/a/index.html");
		// 重定向跳转到 http://xxxx
		//response.sendRedirect("http://jd.com");
	}

}

Cookie

Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端
进行处理的数据,放在本地的计算机上,无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信
息不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是
服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码则可以通过 Cookie 来
实现。
Cookie的创建和发送:f12查看
	// 创建Cookie对象
    Cookie cookie = new Cookie("A", "aa");
    // 响应给客户端
    resp.addCookie(cookie);
2. Cookie的获取
	// 获取客户端的Cookie数组
    Cookie[] cookies = req.getCookies();
    // 判断是否为空
    if(cookies != null && cookies.length > 0){
    // 遍历
    for (Cookie cookie : cookies) {
    // 键名称
    String name = cookie.getName();
    // 值
    String value = cookie.getValue();
    System.out.println("键:" + name + ",值:" + value);
    }
    }
 3. Cookie到期时间设置
 		到期时间,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效,以秒为单位
 		public class Cookie03 extends HttpServlet {
        private static final long serialVersionUID = 1L;

        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 键相同,则覆盖
            // 创建cookie
            Cookie cookie = new Cookie("uname","xiaoqiang");
            // 设置maxAge过期时间 默认 -1  保存在浏览器缓存中 关闭浏览器失效  
            //cookie.setMaxAge(-1);
            // 正整数设置过期时间7天,单位为s
            //cookie.setMaxAge(7*24*60*60);
            // 0 立即失效  cookie的销毁
            cookie.setMaxAge(0);
            // 发送
            response.addCookie(cookie);
        }

    }

你可能感兴趣的:(HttpServletResponse对象和响应乱码解决方式)