Servlet---转发和重定向,三个重要的域对象

转发和重定向

转发

req.getRequestDispatcher("/student_update.jsp").forward(req, resp);

转发一般是在查询得到结果后进入一个新的页面展示,只有一次请求和响应。能够看得出,转发是在服务器(Tomcat)中进行的,所以不需要写项目名。
在这里插入图片描述

重定向

resp.sendRedirect(req.getContextPath() + "/student?method=selectByPage");

重定向一般用于增、删、改之后的对较多数据的展示。重定向由浏览器发起,所以只能定位到Tomcat服务器,不能定位到Tomcat下的许多项目,所以需要写出项目名。

在这里插入图片描述
在浏览器点击删除操作,浏览器发送请求到服务器,服务器响应是时将重定向的地址返回浏览器,浏览器拿到地址在自己做一次查找,所以重定向有两次请求响应,最后结束地址会是第二次请求的地址

可以交换吗

是否可以用转发代替重定向?
用转发代替重定向,显示是可以实现的,但是地址会提留不会改变(明明在selectAll界面但是地址显示的是deleteById)。因为转发只有一次请求,地址一直会是请求的地址。
在这里插入图片描述

注意

超链接也是由浏览器发送给服务器,在页面上写的路径都该加上路径名。

三个重要的域对象

Request

只在转发过程中有效,转发过程结束就会销毁。
服务器内部只会有一对Request和Response。

ServletContext

是被所有用户共享的,和request一样也可以通过setAttribute、getAttribute来读写数据,因为是全局被所有用户共享,放进去的数据区分不开是哪个用户的,所以ServletContext的范围太大了。在这里插入图片描述

Session

在这里插入图片描述

Session和Cookie的联系

数据放在服务器的技术叫Session技术,数据放在浏览器端的技术叫Cookie技术,Session技术要用到Cookie。

Session技术用到Cookie技术,SessionID是保存到浏览器的Cookie。

例子:像亚马逊这种电商网站,用户没有登录时候,购物车信息是存放在Cookie中,如果用户登录了,会把Cookie中购物车信息 同步到服务器的数据库中,是不会放到Session中,因为像ServletContext和Session都是服务器中的一块内存区域是非常宝贵,重启服务器所有的内存区域都会销毁,数据也就没有。

会话技术

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。
会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookie
Session:将数据存储到服务器端,安全性相对好,增加服务器的压力

Session

1.

获得Session对象

两中getSession方法:
1)

request.getSession(false);

2)
request.getSession(false):得到session对象。原来有Session就直接返回,没有返回null

request.getSession(true);

request.getSession(true):创建或得到session对象。原来有Session就直接返回,没有Session自动创建新的session对象。
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)
request.getSession();不加参数默认就是true。

2.

怎样向session中存取数据

Session也是存储数据的区域对象,所以session对象也具有如下三个方法:

session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
3.

Session对象的生命周期

创建:第一次执行request.getSession()时创建
销毁:
1)服务器关闭时
2)session过期/失效(默认30分钟)
如果不停的清空客户端的sessionid,然后在请求,就会在服务器产生很多的垃圾session区域,浪费资源。
void setMaxInactiveInterval(int interval) : 设置session的有效时间
session对象销毁时间:
1) 默认情况30分服务器自动回收
2) 修改session回收时间
3) 全局修改session有效时间

问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时

3)手动销毁session (注销或者退出)
session.invalidate();
默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象

4)浏览器关闭,session就销毁了? 不对

Session特点

会话数据保存在服务器端。(内存中)

Session技术是将数据存储到服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,
但客户端需要每次携带一个标识的ID:JSESSIONID去服务器寻找自己的内存空间。
所以说Session技术是基于Cookie技术的,Session需要借助于Cookie存储客户的唯一标识JSESSIONID。

Cookie

1.

创建Cookie:

 Cookie cookie = new Cookie(cookieName, cookieValue);
 //例:
 Cookie cookie = new Cookie("goods", "IPhone");
 resp.addCookie(cookie); 

**Cookie会以响应头的形式发送给浏览器客户端Cookie中不能存中文。**再请求Servlet的时候会自动携带设置的Cookie:

2.

服务器怎么接受客户端携带的Cookie cookie信息,是以请求头的方式发送到服务器端的:

1)通过request获得所有的Cookie:

 Cookie[] cookies = request.getCookies();
@WebServlet("/getCookie")
public class getCookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("getCookieServlet.service");

        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            System.out.println("name: " + cookie.getName() + "value: " + cookie.getValue() );
        }
    }
}

2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie

protected void 
    service(HttpServletRequest req,  HttpServletResponse resp) {
           Cookie[] cookies =  req.getCookies();
           for (Cookie cookie : cookies)  {
                 System.out.println("name:  " + cookie.getName() + ", value:  " + cookie.getValue());
   } 
}
3.

设置Cookie在客户端的持久化时间:

cookie.setMaxAge(10 * 60);//保存10分钟

设置Cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该Cookie信息。

正数:保存的时间
负数:浏览器关闭的时候Cookie就丢失
零:表示删除同名的Cookie数据。

4.

删除客户端的Cookie:
如果想删除客户端已经存储的Cookie信息,就是将持久化时间设置为0

案例

记录上一次访问网站的时间
如果是第一次就显示:您是第一次访问
如果之前访问过:显示上一次访问时间

@WebServlet("/setCookie")
public class setCookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        System.out.println("setCookieServlet.service");

        Cookie cookie1 = new Cookie("goods","tea");
        Cookie cookie2 = new Cookie("name", "drink");
        cookie1.setMaxAge(10 * 60);
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-ddhh:mm");
        String time = format.format(date);
        Cookie cookie = new Cookie("lastAcessTime",time);
        resp.addCookie(cookie);

        String lastAcessTime = "";
        Cookie[] cookies = req.getCookies();
        if (cookies != null && cookies.length != 0){
            for (Cookie cook : cookies) {
                String name = cook.getName();
                if (name.equals("lastAcessTime")){
                    lastAcessTime = cook.getValue();
                    break;
                }
            }
        }

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("您上一次访问的时间:" + lastAcessTime);
    }
}

Cookie的局限:

1)Cookie只能存字符串类型。不能保存对象
2)不能存中文。
3)1个Cookie的容量不超过4KB。
如果要保存非字符串,超过4kb内容,只能使用session技术!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值