文章目录
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
编码向浏览器发送数据,而这个码表中没有中文字符,
所以在发送中文数据时,
必然会出现乱码。
总结一句话:问题出在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:// 才会被视为 重定向到另外的主机