Web组件之间跳转
Web组件之间的跳转,有三种方式:
方式1:请求转发(forward)
方式2:URL重定向(redirect)
方式3:请求包含(include):req.getRequestDispatcher("/include/s2").include(req, resp);
语法: request对象,
getRequestDispatcher(String path).forward(request,response);
参数: path:资源路径,跳转目标的地址.
注意:一定要记得调用forward方法,如果没有调用,则不能跳转.
请求转发(forward)
请求转发的特点:
1、请求转发的时候,浏览器地址栏不会改变依然是跳转之前的地址(不会显示目标地址).
2、请求转发只发送了一个请求,Servlet1和Servlet2共享请求(共享请求中的数据).
Servlet1和Servlet2之间可以在同一个请求中共享数据.
3、最终给浏览器的响应有Servlet2来决定(如此:Servlet1没必要做响应).
4、请求转发只能访问当前应用的资源,不能跨域访问.
5、请求转发可以访问WEB-INF里面的资源.
URL重定向(redirect)
语法: response对象.sendRedirect(String path); 参数: path:资源路径,跳转目标的地址.
URL重定向的特点:
1、URL重定向的时候,浏览器地址栏发生改变,变成了目标的地址.
2、URL重定向发送了两个请求,Servlet1和Servlet2的请求不同.
因为Servlet1和Servlet2不共享同一个请求,所以也不共享请求中的数据.
3、最终给浏览器的响应有Servlet2来决定(如此:Servlet1没必要做响应).
4、URL重定向支持跨域访问.
5、URL重定向不能访问WEB-INF里面的资源
Servlet的三大作用域对象
Web组件在跳转的时候可以共享数据(信息共享),Web组件信息共享必须依赖作用域对象. 我们是把共享的信息先存放在共享对象中再做传递,在目标里面从共享对象中获取数据. Servlet1 ------------>作用域对象(数据)-----------> Servlet2
作用域对象名称 | 对象的类型 | 对象的描述 |
request | HttpServletRequest | 请求对象,每次新的请求都会创建新的request |
session | HttpSession | 绘画对象,每次打开新的浏览器,在访问(可以包含多个请求) |
ServletContext(application) | ServletContext | 应用对象,描述了一个web应用,启动Tomcat创建ServletContext对象,关闭Tomcat销毁该对象 |
作用域对象如何来共享数据?
把数据存放到作用域,从作用域取出数据,修改/删除数据
所有作用域对象的操作方法都是相同的
设置共享数据: 作用域对象.setAttribute(String name,Object value)
获取共享数据: Object val = 作用域对象.getAttribute(String name);
删除共享数据: 作用域对象.removeAttribute(String name);
注意:从哪一个作用域中设置共享数据,就只能从该作用域中取出共享数据.
如果需要共享请求中的数据,只能使用请求转发(forward).
ServletContext接口和常用方法
ServletContext接口,表示Servlet的上下文(环境).
ServletContext其实表示的就是当前应用对象,在一个应用中,有且只有一个ServletContext对象
该对象在Tomcat启动的时候就创建,在关闭Tomcat的时候该对象被销毁. 可以被所有的Web组件共享数据.
ServletContext
如何获取ServletContext对象:
方式1:ServletContext ctx = request对象.getServletContext();(Tomcat7才支持)
方式2:ServletContext ctx = request对象.getSession().getServletContext();
方式3:在Servlet类中: ServletContext ctx = super.getServletContext();(重写init方法 需调用super.init(config);) getServletContext方法是ServletConfig接口中的,而ServletConfig接口是HttpServlet类的父接口. 获取的ServletContext都是相同的.
常用方法:
1、String getContextPath():获取当前应用的上下文路径(<Context path="XXXX"/>) 和request.getContextPath是相同的.
2、String getRealPath(String path):返回当前资源名称的真实路径(绝对路径).
3、之前讲解初始化参数,是在<servlet>元素中做的配置,如此一来,该初始化参数就只能当前Servlet使用. 如果有N个Servlet有相同的初始化参数配置,就得重复配置N次,很不爽,------>全局初始化参数. 全局初始化参数:可以供所有的Web组件共享,配置如右图. 如何获取呢?就只能使用ServletContext对象.getInitParameter(String name)