目录标题
1、Response(响应)概述
服务器(Servlet) -> 客户端 set方法
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应⾏,响应头和响应体
2、设置响应行
响应状态码:服务器告诉客户端浏览器本次请求和响应的⼀个状态。
1. 1xx:服务器就收客户端消息,但没有接受完成,等待⼀段时间后,发送1xx多状态码
2. 2xx:成功。代表:200
3. 3xx:重定向。代表:302(重定向),304(访问缓存)
4. 4xx:客户端错误。
代表:
404(请求路径没有对应的资源)
405:请求⽅式没有对应的doXxx⽅法
6. 服务器端错误。代表:500(服务器内部出现异常)
== 设置响应⾏的状态码
setStatus(int sc) ==
3、设置响应头
String getHeader(name) - request
setHeader(name, value)
addHeader(name, value)
package e_response;
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("/Demo08Servlet")
public class Demo08Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(302);
// 设置响应头 - 相同的name, 将value覆盖
resp.setHeader("username","zhangsan");
// 添加响应头 - 相同的name可以同时存在
resp.addHeader("username","张三");
resp.setIntHeader("age",18);
System.out.println("Demo8Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4、设置响应体
4.1 响应体设置⽂本
PrintWriter getWriter()
获得字符流,通过字符流的write(String s)⽅法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
4.2 响应头设置字节
ServletOutputStream getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写⼊字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。
5、 重定向
== 重定向:资源跳转的⽅式 ==
代码实现:
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");
//简单的重定向⽅法
response.sendRedirect("/day15/responseDemo2");
package e_response;
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("/Demo09Servlet")
public class Demo09Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo9Servlet");
// 1.设置状态码为302
//resp.setStatus(302);
// 2.设置路径, location-固定, value-客户端路径
//resp.setHeader("location", "/day03_war_exploded/Demo08Servlet");
// 重定向
resp.sendRedirect(req.getContextPath()+"/Demo08Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
访问的demo8,跳转到07
6、请求转发
请求转发:⼀种在服务器内部的资源跳转⽅式
6.1 步骤:
2. 通过request对象获取请求转发器对象:
3. RequestDispatcher
getRequestDispatcher(String path)
4. 使⽤RequestDispatcher对象来进⾏转发:forward(ServletRequest request,ServletResponse response)
6.2 特点:
6. 浏览器地址栏路径不发⽣变化
7. 只能转发到当前服务器内部资源中
8. 转发是⼀次请求
package a_request;
import javax.servlet.ServletContext;
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("/Demo06Servlet")
public class Demo06Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = req.getServletContext();
context.getContextPath();
req.getContextPath(); // 来获得应用名
// request 作为域对象使用
req.setAttribute("user", "张三");
System.out.println("Demo06存进去了数据");
// 请求转发 - Demo07Servlet
req.getRequestDispatcher("/Demo07Servlet")
.forward(req, resp);
// 下面不要写代码了
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package a_request;
import javax.servlet.ServletContext;
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("/Demo07Servlet")
public class Demo07Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user = (String) req.getAttribute("user");
System.out.println("Demo7 " + user);
// 可以给客户端响应 或者再次转发出去
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7、 共享数据
域对象:⼀个有作⽤范围的对象,可以在范围内共享数据
request域:代表⼀次请求的范围,⼀般⽤于请求转发的多个资源中共享数据
⽅法:
void setAttribute(String name,Object obj):存储数据
Object getAttitude(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
== 注意:ServletContext域与Request域的⽣命周期⽐较?==
ServletContext
创建:服务器启动
销毁:服务器关闭
域的作⽤范围:整个web应⽤
request
创建:访问时创建request
销毁:响应结束request销毁
域的作⽤范围:⼀次请求中
8、路径写法
相对路径:通过相对路径不可以确定唯⼀资源
绝对路径:通过绝对路径可以确定唯⼀资源
如:http://localhost/day15/responseDemo2 /day15/responseDemo2
以 / 开头的路径
给客户端浏览器使⽤:需要加虚拟⽬录(项⽬的访问路径)
== 建议虚拟⽬录动态获取:request.getContextPath()==
9、总结:javaee页面跳转的方式
服务器端:
1.转发: 1次请求, 地址栏不变, 服务器内部行为(提供服务器端路径)
2.重定向:2次请求, 地址栏改变, 服务器和客户端之间的行为(提供客户端路径)
客户端:
3.超链接
4.表单提交
5.直接地址栏访问