java中Servlet之域对象

在Servlet里面,有三个非常常用而且重要的对象,它们是:
1. Request (Request域)
2. Session (Session域)
3. ServletContext (ServletContext域)


这三个对象与别的对象有什么特殊之处呢?
答:这三个对象可以存放数据.


Request的setAttribute()与getAttribute的用法:


RequestA:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestA....");
String password = "123456xxx";
request.setAttribute("data", password);

// 请求分派可以跳转到 HTML,Servlet,JSP...
request.getRequestDispatcher("/b").forward(request, response);
// response.sendRedirect("/day05/b");

}


RequestB:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestB....");
String data = (String)request.getAttribute("data");
System.out.println("data = " + data);
}


温馨提示:
Request能够存放数据,但是只在一个请求范围内生效!


----------------------------------------------------------------------------


ServletContext是什么东西?
答:ServletContext是一个对象,这个对象代表整个Web应用,说白了就是代表整个网站。


ServletContext存放数据的作用与方法:
ServletContext存放数据的优点是:整个网站的动态页面都能够取到数据。


RequestA:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestA....");
String password = "123456xxx";
// 取出ServletContext的方式:
// ServletContext代表我们整个网站
ServletContext context = this.getServletContext();
context.setAttribute("data", password);
response.sendRedirect("/day05/b");
}


RequestB:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestB....");
String data = (String)this.getServletContext().getAttribute("data");
System.out.println("data = " + data);
}


ServletContext还有另外一个优点:
可以读取web.xml文件里的初始化信息。


<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>


ServletContext context = this.getServletContext();
String str = context.getInitParameter("encoding");


----------------------------------------------------------------------------


Session也可以存放数据:
同样的,通过setAttribute()与getAttribute()这两个方法:


A:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestA....");

// 获取Session对象,通过request.getSession()方法
HttpSession session = request.getSession();
session.setAttribute("data", "12345xxx");
}


B:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestB....");
String data = (String)request.getSession().getAttribute("data");
response.getOutputStream().write(data.getBytes());
}


Session的作用域范围与ServletContext的区别:
ServletContext是整个网站
Seesion的作用域:
1. 如果是IE7.0及以前的版本,那么Session的作用域范围是一个浏览器。
2. 如果是IE7.0之后的版本,那么Session的作用域范围是一个用户。
现在的浏览器版本都进行了升级,对Session的作用域范围都进行的扩大。


ServletContext: 多个用户
Seesion:单个用户


----------------------------------------------------------------------------


总结:
Request的作用域范围只限于一个请求


Session的作用域范围是一个用户
[最新的浏览器版本,老版本的浏览器如IE6,7的作用域范围只限于一个作浏览器]


ServletContext的作用域范围是所有用户以及所有浏览器版本。




使用场景:
原则:存放数据的时候尽量选择作用域范围小的对象。
1. 如果你的数据在一个请求处理完之后就不需要再用了,那么你就要选择Request在存。
2. 如果你的数据在一个请求处理完之后等一会还要会,那你就用Session。
3. 如果你的数据在整个网站都要用,那就用ServletContext。


----------------------------------------------------------------------------


讲Session原理:
“会话技术”
什么叫会话?
电话?
计算机浏览器上的会话?


HTTP协议的特点:无状态。
使用会话技术可以解决http无状态所带来的问题。


会话技术的实现方式有以下三种:
1. Cookie技术 [在客户端的计算机上存放数据]
2. Session技术 [在服务器的计算机上存放数据]
3. URL重写技术 [服务器绝招]




Cookie技术:
存:
public class SaveCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie = new Cookie("name", "zhangsan");

// 设置Cookie有效时间(单位是秒 60秒*6)
cookie.setMaxAge(60 * 6);

// 把cookie对象放在response对象里面,输出给客户端
response.addCookie(cookie);
}
}
取:
public class GetCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
PrintWriter out = response.getWriter();
if (cookies != null) {
for (Cookie c : cookies) {
out.write(c.getName() + "=" + c.getValue() + "<br/>");
}
}
}
}




Session是实现会话技术的其中一种手段,那么Session什么时候开始呢?
答: 当调用getSession()的时候, Session的生命周期就开始了.




如果客户端浏览器禁用Cookie,那么“Cookie技术”和“Session技术”将无法实现会话的功能。
此时可以使用“URL重写技术”来实现会话的功能。
URL重写技术原理:就是在每个访问的路径后面加上一个ID值。


URL重写技术通过Response的EncodeURL()方法实现。


public class URLServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();

// 使用URL重写技术,首先要开启Session,也就是要调用getSession()方法
request.getSession();

// response.encodeURL()作用是在一个访问路径的后面加上JSESSIONID
String u1 = response.encodeURL("/day05/sa");
String u2 = response.encodeURL("/day05/sb");

String link1 = "<a href='" + u1 + "'>购买衣服</a>";
String link2 = "<a href='" + u2 + "'>结帐</a>";

// String link1 = "<a href='/day05/sa'>购买衣服</a>";
// String link2 = "<a href='/day05/sb'>结帐</a>";

out.write(link1 + "<br/><br/>" + link2);
}
}
/*
<a href='/day05/sa'>购买衣服</a><br/><br/>
<a href='/day05/sb'>结帐</a>


<a href='/day05/sa;jsessionid=9C3303DCB2632226ABA7507ED97DABFB'>购买衣服</a><br/><br/>
<a href='/day05/sb;jsessionid=9C3303DCB2632226ABA7507ED97DABFB'>结帐</a>
*/
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值