1. 功能:设置响应消息
a. 设置响应行
格式:HTTP/1.1 200 ok
设置状态码:void setStatus(int sc)
b. 设置响应头
void setHeader(String name, String value)
c. 设置响应体:
使用步骤:
1、获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
2、使用输出流,将数据输出到客户端浏览器
2. 重定向
a、重定向:资源跳转的方式
b、实现方法:
方法一:
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day09/responseDemo2");
方法二:
//简单的重定向方法
response.sendRedirect("/day09/responseDemo2");
代码实现:
一:header重定向
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
重定向
/
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1.....");
//访问/responseDemo1,会自动跳转到/responseDemo2资源
//1. 设置状态码为302
response.setStatus(302);
//2. 设置响应头location
response.setHeader("location","/day09/responseDemo2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
重定向
/
@WebServlet("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2.....");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
浏览器访问检查输出:
二:简单的重定向
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
重定向
/
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1.....");
//简单的重定向方法
response.sendRedirect("/day09/responseDemo2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
浏览器访问检查输出同实现一
c、重定向的特点:redirect
1、地址栏发生变化
2、重定向可以访问其他站点(服务器)的资源
3、重定向是两次请求。不能使用request对象来共享数据
d、转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
e、forward和redirect 区别:见c和d
f、路径写法:路径分类
1、相对路径:通过相对路径不可以确定唯一资源。不推荐。
如:./index.html
不以/开头,以.开头路径
规则:找到当前资源和目标资源之间的相对位置关系
./:当前目录
../:后退一级目录
2、绝对路径:通过绝对路径可以确定唯一资源。推荐
如: /day09/responseDemo2
以/开头的路径
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
给客户端浏览器使用:需要加虚拟目录(项目的访问路径application context)
建议虚拟目录动态获取:request.getContextPath()
,,重定向都是给客户端浏览器使用,所以需要加虚拟目录
给服务器使用:不需要加虚拟目录
(request.getRequestDispatcher("/requestDemo9").forward(request,response);)转发路径是给服务器用的,不需要加虚拟目录
3、代码实现
三、相对路径1
web包中新建location.html
Title
找到当前资源和目标资源之间的相对位置关系
当前资源:location.html
目标资源:responseDemo2
responseDemo2
浏览器访问点击responseDemo2链接,检查输出:
四、相对路径2
web包中新建Directory:htmls,把location.html粘过来改名location2.html
Title
找到当前资源和目标资源之间的相对位置关系
当前资源:location2.html
目标资源:responseDemo2
responseDemo2
浏览器访问点击responseDemo2链接,检查输出同四中结果
五、绝对路径:给客户端用的
更改location.html
Title
相对路径
找到当前资源和目标资源之间的相对位置关系
当前资源:location.html
目标资源:responseDemo2
responseDemo2
responseDemo2
绝对路径
responseDemo2
浏览器访问点击绝对路径下的“responseDemo2”,检查输出:
六、绝对路径:对服务器端用的
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responseDemo3")
public class ResponseDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo3.....");
//转发
request.getRequestDispatcher("/responseDemo2").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
浏览器访问浏览器访问会自动访问reponseDemo2,检查输出:
七、绝对路径:动态获取虚拟路径
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
重定向
/
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo11.....");
request.setAttribute("msg","response");
//动态获取虚拟目录
String contextPath = request.getContextPath();
//简单的重定向方法
response.sendRedirect(contextPath+"/responseDemo2");
}
//代码效果参考:http://hnjlyzjd.com/hw/wz_24697.html
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);
}
}
重启tomcat服务器,浏览器访问检查输出:
使用这种方式,更换项目路径时,不需要更改重定向中的路径。
3. 服务器输出字符数据到浏览器
a. 步骤:
1、获取字符输出流:PrintWriter pw = response.getWriter();
2、输出数据:pw.write("hello response");
b. 注意:中文会出现乱码问题。
乱码原因:编解码使用的字符集不一致。浏览器字符集默认为GBK(gb2312),而PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1,是tomcat返回的编码。
解决办法:获取流对象之前设置该流的默认编码并告诉浏览器响应体使用的编码
response.setCharacterEncoding("GBK");
设置流的默认编码为GBK,如果设为utf-8浏览器解析中文就会出问题
//代码效果参考:http://hnjlyzjd.com/xl/wz_24687.html
response.setHeader("content-type","text/html;charset=utf-8");告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码
response.setContentType("text/html;charset=utf-8");
简单的形式,在获取流之前设置编码并告诉浏览器使用该编码进行解码。推荐!
c. 代码实现:
一:输出数据到浏览器
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取字符输出流
PrintWriter pw = response.getWriter();
//2、输出数据
pw.write("hello response");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
浏览器访问检查浏览器展示,可以看到会把标签解析了。
二:解决GBK中文乱码
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:GBK
response.setCharacterEncoding("GBK");
//1、获取字符输出流
PrintWriter pw = response.getWriter();
//2、输出数据
pw.write("你好 response");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
浏览器访问检查浏览器输出:你好 response
二、彻底解决乱码问题
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:utf-8
response.setCharacterEncoding("utf-8");
//告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码
response.setHeader("content-type","text/html;charset=utf-8");
//1、获取字符输出流
PrintWriter pw = response.getWriter();
//2、输出数据
pw.write("你好 response");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
浏览器访问浏览器会按照从服务器端接收到的utf-8进行解码,输出:你好 response;
可以不写setCharacterEncoding直接用response.setHeader()的方式进行解决中文乱码问题
三、简单的形式
response.setHeader("content-type","text/html;charset=utf-8");的简化写法:
response.setContentType("text/html;charset=utf-8");
package cn.itcast.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/responseDemo4")
public class ResponseDemo