原视频地址:https://www.bilibili.com/video/BV1vb41187jH?p=40
ServletContext是Servlet上下文对象,该接口中也有这样几个方法:
void setAttribute(String name, Object o)
:向ServletContext范围中添加数据Object getAttribute(String name)
:向ServletContext范围中获取数据void removeAttribute(String name)
:删除ServletContext范围中的数据
ServletContext是一个怎样的范围?
- 所有用户共享的一个范围对象,我们一般把ServletContext变量命名为:application。这个对象代表一个应用。一个webapp只有一个这样的对象。范围极大。
String getParameter(String name)
:通过key获取value这个一维数组中的首元素。通常情况下,这个一维数组中只有一个元素,所以这个方法使用最多。**String[] getParameterValues(String name)
:通过Map集合key获取value这个一维数组**(也比较常用)**,这个方法适合取复选框checkbox中的数据Map getParameterMap()
: 获取整个Map集合Enumeration getParameterNames()
:获取整个Map集合的所有key
String getRemoteAddr()
:获取客户端IP地址String getContextPath()
: 获取上下文路径【webapp的根路径】String getMethod()
:获取浏览器的请求方式String getRequestURI()
:获取请求的URIStringBuffer getRequestURL():获取请求的URL
String getServletPath()
:获取Servlet Path(web.xml中的url-pattern)
void setAttribute(String name, Object o)
:向request范围中添加数据Object getAttribute(String name)
:向request范围中获取数据void removeAttribute(String name)
:删除request范围中的数据
HttpServletRequest是一个怎样的范围呐?
HttpServletRequest类型的变量通常命名为:request,代表当前的本次请求。一次请求对应一个request对象,100个请求对应100个请求对象。请求范围是极小的,request只能完成在同一次请求中传递数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29// AServlet.java
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建User对象
User user = new User();
user.setUsercode("111");
user.setUsername("zhangsan");
// 将User对象存储到request范围中
request.setAttribute("userObj", user);
//从request范围中取出数据
//Object obj = request.getAttribute("userObj");
// 要想在BServlet中获取到AServlet中添加的userObj,要使用-->转发
// 执行完AServlet之后,跳转到BServlet执行,将AServlet执行和BServlet执行放到一个请求中
// 必须使用转发技术
// forward[转发],转发是一次请求
// 1.获取请求转发器对象【以下转发器指向了BServlet】
// RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
// 2.调用请求转发器的forward方法即可完成转发
// dispatcher.forward(request, response);
// 转发(其实就是将上面的进行合并)
request.getRequestDispatcher("/b").forward(request, response);
}
}1
2
3
4
5
6
7
8
9
10
11// BServlet.java
public class BServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从request范围中取出数据
Object obj = request.getAttribute("userObj");
// 注意:此时得不到AServlet在request中存入的"userObj",因为这是两次不同的请求。要想在BServlet中获取到AServlet中添加的userObj,要使用-->转发
}
}
RequestDispatcher getRequestDispatcher(String path)
: 获取请求转发器,让转发器对象指向某个资源转发是一次请求
转发的代码:
request.getRequestDispatcher("/b").forward(request, response);
void setCharacterEncoding(String env)
Cookie[] getCookies()
HttpSession getSession()
:获取Session对象,若没有获取到session对象,则新建session对象HttpSession getSession(boolean create);
获取Session对象,若没有获取到session对象,根据create的值判断是否新建session对象。create=true,就创建session;create=false,就返回null。
- 关于范围对象的选择
- ServletContext应用范围,可以跨用户传递数据
- ServletRequest请求范围,只能在同一个请求中传递数据【可以跨Servlet传递数据,但是这多个Servlet必须在同一个请求中】
- 优先选择request范围
- 注意以下两个方法的区别
- String value = request.getParameter(name); //表表单上获取数据
- Object obj = request.getAttribute(name); //从request范围中获取数据【之前一定调用过setAttribute】