servlet学习:请求转发和重定向,Cookie和Session

 

请求转发:

实现多个servlet联动操作处理请求,避免代码冗余,让servlet的职责更加明确

req.getRequestDispatcher("要转发的地址").forward(req, resp);

在一次请求中,servlet使用请求转发调用其他servlet时,浏览器并不知道我们调用了其他servlet,所以浏览器地址栏的地址并不会发生变化。

因为请求转发是发生在一次请求中,所以这些servlet是共用的req,resp。因此我们可以借用这个特性,通过req进行一次请求内不同servlet的数据共享。

在一个servlet中添加数据

req.setAttribute(name, value);

在被调用的servlet中获取数据,因为getAttribute()返回的是object类型,要进行数据转换。

String value = (String)req.getAttribute(name);

重定向:

如果使用请求转发,因为地址栏的地址并没有发生变化,所以当我们刷新页面时,还是会重复提交上一个界面的数据。

解决的方法就是使用重定向。重定向的使用方法如下:

resp.sendRedirect("目标servletURL和URI");

重定向与请求转发不同,重定向是两次不同的请求,所以浏览器地址栏会发生变化。并且因为是两此请求,所以也是两个不同的request对象,没办法使用之前的方法进行数据的共享。

数据共享解决不同请求之间的数据共享问题

会话跟踪技术

Cookie:存储在浏览器中

解决了发送的不同请求的数据共享问题,如果服务器需要记录和存储用户的数据和状态,可以使用Cookie技术进行存储。比如:三天免登录之类的。

特点:

浏览器端的数据存储技术,存储数据声明在服务器端

创建Cookie对象

Cookie c = new Cookie(name, value);

 定义有效期

如果不定义有效期或设定为复数,就是临时存储:存储在浏览器的运行内存之中,浏览器关闭就会失效。

定义有效期为定时存储,数值为秒数:设置Cookie的有效期,就会被存储到客户端的硬盘中,直到设置的时间到为止。

如果值为零:就表示要删除某Cookie

c.setMaxAge(60);

定义有效路径

只有对应路径上的servlet可以访问设置了有效路径的Cookie

c.setPath("/my");

将Cookie信息发送给客户端

修改Cookie的值的方法就是将同“name”的Cookie再次使用addCookie提交一次。

resp.addCookie(c);

获取Cookie信息

Cookie[] cks = req.getCookies();
if(cks != null){
    for(Cookie co : cks){
        String name2 = co.getName();
        String value2 = co.getValue();
        System.out.println(name2 + ":" + value2);
    }
}

session:存储在服务器中

解决一个用户一次会话中不同请求处理的数据共享

Session相较于Cookie会更加的方便,Session可以用于存储对象,而Cookie只能用于存储字符串。

用户使用浏览器第一次向服务器发送请求,服务器在接受到请 求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建 一个 session 对象,用来存储用户请求处理相关的公共数据,并将 此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请 求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其 对应的 session 对象。

Session 技术是依赖 Cookie 技术的服务器端的数据存储技术。 由服务器进行创建 ,每个用户独立拥有一个 session ,默认存储时间为 30 分钟。

得到Session对象

如果已经有了就直接获取,没有就会进行创建

HttpSession hs = req.getSession();

更改默认存储时间

Session创建之后,默认如果30分钟之内没有访问它,就会被销毁。但只要被访问,就会重新计时。这个销毁时间可以进行更改,一共有三种方法。

第一种:在tomcat/conf/web.xml文件中进行更改,这里的更改会被所有的WEB应用。

第二种:在自己项目的web.xml文件中进行更改,只会改本项目,方法一样。

<session-config>
    <session-timeout>20</session-timeout>
</session-config>

第三种:直接在代码中更改,数据为秒数。

hs.setMaxInactiveInterval(600);

设置Session强制失效

hs.invalidate();

存储数据

hs.setAttribute(name, value);

获取数据(object)

String a = (String)hs.getAttribute(name);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值