7.8 response对象

7.8.1 向客户端发送数据

PrintWriter response.getWriter() -- 字符流
ServletOuptputStream	response.getOutputStream() -- 字节流

乱码 - 例子

	/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		//不加这个,有中文,一定乱码
		//response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.write("你好!");
	}

通过response获取字符流向浏览器发送中文数据时,会出现乱码问题。

出现乱码的原因为:
服务器默认用iso8859-1编码向浏览器发送数据,而这个码表中没有中文字符,
所以在发送中文数据时,
必然会出现乱码。

<mstyle mathcolor="&#35;f01"> t o m c a t </mstyle> \color{#f01}{总结一句话:问题出在tomcat服务器端} tomcat => 所以要在服务器端进行处理。

乱码 - 解决方法

/* 通知服务器使用utf-8码表向浏览器响应数据 * 通知浏览器也使用utf-8码表接收服务器响应的数据 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		//不加这个,有中文,一定乱码
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.write("你好!");
	}

7.8.2 实现重定向

重定向 - 特点

  • 重定向前后是<mark>两次请求,两次响应</mark>
  • 重定向前后,浏览器的地址栏<mark>地址会发生变化</mark>。

    因为两次请求都是通过浏览器发起,
    浏览器知道这个跳转的过程,
    因此地址栏地址会变化
  • 重定向前后的<mark>request对象不是同一个</mark>

    <mark>因为重定向前后是两次请求,
    服务器根据两次请求会创建两个不同的request对象及response对象</mark>
  • 重定向前后的两个资源<mark>可以</mark>是来自<mark>不同的web应用</mark>,甚至可以是来自<mark>不同的服务器</mark>。
    (进行跳转的两个资源之间没有限制)

实现代码:

response.sendRedirect("重定向到资源的地址");

测试 - sendRedirect:

	/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		//不加这个,有中文,一定乱码
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		System.out.println("TestRedirect执行了!");
		//重定向到day10/index.jsp
		//response.sendRedirect("http://localhost/day10/index.jsp");
		//如果重定向后,主机名没有变
		//response.sendRedirect("/day10/index.jsp");
		//如果重定向后,项目名没变
		response.sendRedirect("index.jsp");
		
	}

测试 - request数据丢失

添加代码

request.setAttribute("name", "郭富城");

package cn.edut;

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

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

/** * Servlet implementation class Test_Redirect */
public class Test_Redirect extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/** * @see HttpServlet#HttpServlet() */
	public Test_Redirect() {
		super();
		// TODO Auto-generated constructor stub
	}

	/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		//不加这个,有中文,一定乱码
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		System.out.println("TestRedirect执行了!");
		
		request.setAttribute("name", "郭富城");
		
		//重定向到day10/index.jsp
		//response.sendRedirect("http://localhost/day10/index.jsp");
		//如果重定向后,主机名没有变
		//response.sendRedirect("/day10/index.jsp");
		//如果重定向后,项目名没变
		response.sendRedirect("index.jsp");
		
	}

	/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页 ^(* ̄(oo) ̄)^</title>
</head>
<body>
	<h1>day10...index.jsp...</h1>
	
	<!-- 执行程序,不会直接输出 -->
	<%
		String name = request.getRemoteAddr(); 
		Object port = request.getRemotePort() ; 
		Object user = request.getAttribute("name"); 
		out.print("Remote Info : " + name +":" + port + " --> "+user);
	%>
	
	<!-- 直接输出,但只能一个表达式 -->
	<%="<p>"+new Date() +"</p>"%>
	
	<hr>
	<p>JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种***页技术标准。</p>
</body>
</html>

细节 - 重定向 - 不同服务器

需要加上http://

否则如下:

response.sendRedirect("www.baidu.com");

加上 http://

不加,会视为 程序名,在本项目中查找
加上 http:// 才会被视为 重定向到另外的主机