一、Web组件之间的交互
Web组件之间的跳转方式
方式一:请求转发(forward)
Servlet1.java:
@WebServlet("/forward/s1")
public class Servlet1 extends HttpServlet{
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
System.out.println("Servlet1...Before");
out.println("Servlet1...Before");
//请求转发
req.getRequestDispatcher("/forward/s2").forward(req, resp);
System.out.println("Servlet1...After");
}
}
Servlet2.java:
@WebServlet("/forward/s2")
public class Servlet2 extends HttpServlet{
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
System.out.println("Servlet2...");
out.println("Servlet2......");
}
}
结果:
请求转发的特点:
- 浏览器地址栏不发生改变,不是目标地址 /forward/s2
- 请求转发只发送一个请求
- 共享同一个请求中的数据
- 最终响应给浏览器的由目标资源决定(即Servlet2)
- 请求转发不能跨域访问,只能在本项目中跳转
- 请求转发可以访问WEB-INF目录中的资源
注意:没有加 “/” 则使用当前资源的相对路径(在最后一个 “/” 之前的部分),例如 /forward 为相对路径
方式二:URL重定向(redirect)
URL重定向的特点:
- 浏览器地址栏发生改变,变成目标地址 /forward/s2 ;
- URL重定向发了两次请求;
- 互相不共享数据,因为有两次独立的请求;
- 最终响应给浏览器的由目标资源决定(即Servlet2,相当于把目标地址拷贝到浏览器地址栏);
- URL重定向能跨域访问,可以访问其他项目中的资源;
- URL重定向不可以访问WEB-INF目录中的资源。
方式三:请求包含(include)
二、Servlet三大作用域对象
目的:共享数据
Request:每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用请求转发;
Session:每一次会话都是一个新的session对象,如果需要在一次会话中的多个请求之间共享数据,只能使用Session;
Application:应用对象,Tomcat启动到关闭,表示一个应用,在一个应用中有且只有一个application对象,作用于整个Web应用,可以实现多次会话数据共享。
对象名称 | 对象类型 |
request | HttpServletRequest |
session | HttpSession |
servletcontext(application) | ServletContext |
作用域对象如何共享数据:
1.设置作用域中的共享数据
作用域对象.setAttribute(String name, Object value);
2.获取作用域中的共享数据
Object value = 作用域对象.getAttribute(String name);
3.删除作用域中的指定数据
作用域对象.removeAttribute(String name);
实例:
Application是存在与整个服务器运行期间的
三、ServletContext接口和常用方法
ServletContext:表示Web应用,从Tomcat启动到关闭,只有一个对象,而且是在启动时就已经创建,因此在JSP中称其为application
1.如何获取:
方式一:在Servlet类中,super.getServletContext();
方式二:通过请求对象来获取,request.getServletContext();
方式三:通过Session对象来获取request.getSession.getServletContext();
上述三种方式获取的都是同一个对象
2.常用的方法:
- getRealPath(String path):根据一个资源的相对Web根的路径,获取绝对路径
- getContextPath():返回当前响应的上下文路径
- 获取全局初始化参数(只能使用这两个方法):
- String getInitParameter(String name):获取指定名称的全局初始化参数
- Enumeration<String> getInitParameterNames(); 获取所有全局初始化参数名称
ServletConfig接口中的获取初始化参数方法,只能获取当前Servlet自身的初始化参数,不能获取全局初始化参数;
ServletContext接口中的获取初始化参数方法,只能获取全局Servlet自身的初始化参数,不能获取自身初始化参数。