可以知道ServletRequest这个接口和ServletContext里面有三个相同的方法

void setAttribute(String var1, Object var2);

Object getAttribute(String var1);

void removeAttribute(String var1);

ServletContext这个应用域,什么时候往他里面绑定数据呢,要满足这三个条件 1:所有用户共享的数据。         

2:这个共享的数据量很小。

3:这个共享的数据很少的修改操作。 在以上三个条件都满足的情况下,使用这个应用域对象,可以大大提高我们程序执行效率。

具体解释: 我们把这个数据放入ServletContext中对象,如果以后用户再去访问这个数据的话,我们在从这个应用域当中去取数据,就不需要连接数据库,而数据库相当于是在硬盘文件上,而内存和硬盘交互是需要io流的,而io流的效率是很低的。所以我们会采用缓存机制。对于高并发的系统时,许多用户访问数据,就可以直接去访问内存就不需要去连接数据库。缓存机制是提高效率的重要手段。 为什么数据量要很小呢?

因为ServletContext对象是服务器开启的时候创建,关闭的时候销毁,如果占用过多内存,这个对象会一直存活的。 为什么要不经常修改呢?

如果经常修改,那么一定会引起线程安全问题,而保证线程安全问题会跟锁机制有关,而锁机制不管是什么锁机制最终会导致系统性能降低请求域:

范围很小,只在一次请求内有效,发两次请求对应说的是两个请求对象。 也有这三个方法。

void setAttribute(String name, Object obj); 向域当中绑定数据

Object getAttribute(String name); 从域当中根据name获取数据

void removeAttribute(String name); 将域当中绑定的数据移除

对于请求域和应用域的选用原则: 一般情况下我们会使用范围小的对象域,因为小的域对象占用的资源较少。 请求对象创建的时候请求域就开始了,servletcontext对象创建的时候应用域就开始了,总结:

在JavaWeb中一共四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request其中一个,request可以在一个请求中共享数据。 一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据。现在我们还不知道如何在一个请求中经历之个Servlet,后面在学习请求转发和请求包含后就知道了。请求转发:

在request请求域当中,我们测试两个类,可以知道一个请求域对应一个对象,所以如果想要在Aservlet调用Bservlet的request,我们需要使用servlet中的转发机制。 第一:获取请求转发器对象相当于把这个路径包装到请求转发器其中,实际上是把下一个跳转的资源路径告知给tomcat    第二:调用请求转发器   当中的forward方法完成转发,这里为什么要传request这个对象,因为这样才能保证,在下一个servlet调用doget方法的时候是同一个request对象,转发的时候这两个参数很重要,这两个都是要传给下一个资源的。dispatcher.forward(request,response);

转发是一次请求,可以把这两步方法写在一起。 request.getRequestDispatcher("/b").forward(request,response);

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// 获取系统当前时间

Date nowTime=new Date();

//将系统当前时间绑定到请求域当;

req.setAttribute("sysTime",nowTime);

// 第一步:获取请求转发器

RequestDispatcher dispatcher=req.getRequestDispatcher("/b");

// 第二步:调用请求转发器

dispatcher.forward(req,resp);

}

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//从请求域当中去除绑定的数据

Object sysTime = req.getAttribute("sysTime");

// 输出到浏览器

resp.setContentType("text/html");

PrintWriter out=resp.getWriter();

out.print("系统当前时间:"+sysTime);

}

具体解释:首先tomcat服务器得到b这个路径,然后根据web.xml文件里面的配置信息得知道你要调用的是Bservlet类,然后就会去调用里面的doget方法,doget方法是tomcat调用的,然后doget方法的两个参数就是forword里面的两个参数,这样才可以保证这两个当中的request对象是同一个。 两个servlet如何共享数据呢? 将数据放到ServletContext应用域当中,当然是可以的,但是应用域范围太大,占用资源太多。不建议使用。

可以将数据放到request域当中,然后AServlet转发到BServlet,保证AServlet和BServlet在同一次请求当中,这样就可以做到两个Servlet,或者多个Servlet共享同一份数据。 转发的下一个资源必须是servlet吗? 不一定,只要是Tomcat服务器当中的合法资源,都是可以转发的。例如:html     

 注意:转发的时候,路径的写法要注意,转发的路径以“/”开始,不加项目名。 关于Tomcat中两个容易混淆的方法。

request.getParameter("username");  Object obj = request.getAttribute("name"); 第一个方法获取的是用户在浏览器上提交的数据,而第二个获取的是请求域当中绑定的数据。这一个说明肯定之前执行过set往里面绑定过数据,然后才会调用这个方法。

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。