HTTPServletResponse类和HTTPServletRequest类一样,每次有请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HTTPServletRequest表示请求的信息,HTTPServletResponse表示响应的信息。我们可以通过HTTPServletResponse对象来设置返回给客户端的信息。
HTTPServletResponse通过字节流或者字符流的方式进行响应,字节流(getOutputStream())常用于下载,字符流(getWriter())常用于回传字符串,两个流只能使用一个。
一. 往客户端回传字符串数据
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("response");
writer.write("张三"); //会有中文乱码问题
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>ResponseServlet</servlet-name>
<servlet-class>TestServlet.ResponseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseServlet</servlet-name>
<url-pattern>/responseServlet</url-pattern>
</servlet-mapping>
</web-app>
解决响应的中文乱码问题:
方式1:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也是用UTF-8字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("response");
writer.write("张三");
}
}
方式二(推荐):
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
resp.setContentType("text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("response");
writer.write("张三");
}
}
二. 请求重定向
当客户端发起请求(http://ip:port/工程路径/response1)时,Response1程序可能由于某些原因已经废弃,由新的接口Response2代替,他需要告诉客户端他已经不存在(响应码302)且返回新的地址(Location响应头:http://ip:port/工程路径/response2),然后客户端会自动重新发起新的请求(http://ip:port/工程路径/response2),由Response2程序执行响应。
浏览器的地址栏会发生变化,由http://ip:port/工程路径/response1变为http://ip:port/工程路径/response2;发生了两次请求;不共享Response域数据。
方式一:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应状态码302,表示重定向
resp.setStatus(302);
//设置响应头,告诉客户端新的地址
resp.setHeader("Location","http://localhost:8080/WebProject_war_exploded/response2");
}
}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("response2");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Response1</servlet-name>
<servlet-class>TestServlet.Response1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response1</servlet-name>
<url-pattern>/response1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Response2</servlet-name>
<servlet-class>TestServlet.Response2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response2</servlet-name>
<url-pattern>/response2</url-pattern>
</servlet-mapping>
</web-app>
方式二(推荐):
在Response1里直接使用resp.sendRedirect即可
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("http://localhost:8080/WebProject_war_exploded/response2");
}
}