1. jsp中的session会话

1. what

思考:我们可以看到登录后需要在其他页面获取当前登陆者的信息,而且如果不登录无法访问其他页面

session对象表示浏览器与服务器交互的一个容器,该容器用于存放当前会话【登陆者】的信息。

会话是浏览器与服务器之间建立的联系,服务器重启或者浏览器关闭都会导致会话结束。

session容器中内容保存周期默认为30分钟

session中里面常用的方法:

setAttribute(key,value);往sesssion会话中保存信息
getAttribute(key);从session会话中获取指定的信息
removeAttribute(key);从session会话中移除指定的信息
setMaxInactiveInterval();设置有效时间

2.方法与具体业务实现

  1. 将登录信息添加到session会话中
session.setAttributeo("key",value);
参数类型:key——String类型
    	value——Object类型

业务处理:在登录处理页面(loginDo.jsp)中

将获取的user信息添加到session会话中

session.setAttribute("user",user);
  1. 获取session会话中的登录信息
User user=(User)session.getAttribute("key");
需要强转,因为上述获取的对象为Object类型,需强转为所需要的类型

业务处理:获取登录信息,若因会话结束而导致user为空,则跳转到登陆页面

第一步:在登录成功页面(success.jsp)中获取会话中的登录信息

<%
//因为获取的对象为Object类型,所有需要强转为需要的User类型
User user=(User)session.getAttribute("user");
%>
当前用户名:<%=user.getName()%>

第二步:服务器重启会导致会话结束,从而使user因没有获取到对象而为空,导致空指针异常,需要处理,为空跳转到登录页面,不为空则进行成功页面的业务——即没有登录不允许访问其他网页

<%
//获取会话信息
User user = (User)session.getAttribute("user");
if(user==null){
  response.sendRedirect("login.jsp");
}else{
%>

<div>登录成功页面 用户名:<%=user.getName()%></div>
<button οnclick="add()">添加</button>
<button οnclick="location.href='logout.jsp'">退出</button>
<br>
<table border="1px" align="center" width="70%" cellspacing="0">
<tr>
  <th>编&emsp;号</th>
  <th>类&emsp;型</th>
  <th>名&emsp;称</th>
  <th>作&emsp;者</th>
  <th>出版社</th>
  <th>价&emsp;格</th>
  <th>操&emsp;作</th>
</tr>
<%
  for (Books b:list) {
%>
<tr>
  <td><%=b.getId()%></td>
  <td><%=b.getType()%></td>
  <td><%=b.getName()%></td>
  <td><%=b.getAuthor()%></td>
  <td><%=b.getPublisher()%></td>
  <td><%=b.getPrice()%></td>
  <td><a href="update.jsp?id=<%=b.getId()%>">编辑</a>
      <a href="delDo.jsp?id=<%=b.getId()%>">删除</a>
  </td>
</tr>
<%}%>
</table>

<%}%>
  1. 更改session会话的过期时间
session.setMaxInactiveOnterval();
  1. 移除当前会话中的用户信息
session.removeAttribute("key");

业务处理:在登录成功显示信息的页面添加退出按钮,跳转到登录退出处理页面(logout.jsp)中

在该页面中,两步操作

一:移除会话信息

session.removeAttribute("user");

二:跳转到登陆页面

response.sendRedirect("login.jsp");

2. jsp的内置对象(9个)

内置对象就是无需自己在jsp中创建该类的对象。

  1. out:输出对象

    print()输出方法
    write()输出方法,同上
    
  2. request:请求对象,封装了客户的请求信息

    getParameter("参数名");接收请求的参数
    getParameterValues("");接收数组参数值
    setCharacterEncoding("编码");设置编码
    getSession();获取session会话对象
    getRemoteAddr();获取远程访问者的ip地址
    getContextPath();获取上下文路径
    getRequestDispatcher();获取转发对象调用forward()方法——request中保存的数据可以共享
    
  3. response:响应对象,把对客户的响应信息封装

    sendRedirect("路径");重定向到指定路径
    getWrite();获取输出对象
    
  4. session:会话对象

    setAttribute(key,value);往sesssion会话中保存信息
    getAttribute(key);从session会话中获取指定的信息
    removeAttribute(key);从session会话中移除指定的信息
    setMaxInactiveInterval();设置有效时间
    
  5. page:网页对象——每个网页都有一个page对象类似于this对象,表示当前网页的对象

  6. pageContext:网页上下文对象。该对象可以获取其他8个对象

  7. config:配置对象,获取网页一些相关的配置

  8. exception:异常对象,Throwable类的对象。它只能在错误页面使用

  9. application:应用对象。里面保存的数据整个服务器都有效。只要服务器不重启,作用最大

上述9中内置对象一定有属于的类型

3. jsp的两种页面跳转

  1. 重定向跳转:redirect,地址栏会发生改变,而且会生成新的request对象

    response.sendRedirect("地址")
    
  2. 请求转发跳转:forward,地址栏不会改变,不会生成新的request对象。request中保存的数据可以共享

    request.getRequestDispatcher("地址").forward(request,response);
    
  • 重定向——redirect

发送了两次请求,地址栏上的地址为最后的请求地址

  • 转发跳转——forward

发送了一次请求,地址栏没有改变

forward与redirect的区别:

forward 是转发 和 redirect 是重定向。

  • 地址栏 url 显示:forward url不会发生改变,redirect url 会发生改变;

  • 数据共享:forward 可以共享 request 里的数据,redirect 不能共享;

  • 效率:forward 比 redirect 效率高。

4. jsp四大域对象

这四个对象可以存放内容的,但是它们的有效期不同

pageContext对象:有效期当前页面有效

request请求对象:有效期同一个请求有效=={当页面跳转为转发跳转,url不变,即为同一个request请求对象;当页面跳转为重定向跳转,url改变,即不为同一天request请求对象,获取到的值为null}==

session会话对象:有效期同一个会话有效

application应用对象:有效期同一个应用【服务器不重启】

方法:
setAttribute(key,value);往sesssion会话中保存信息
getAttribute(key);从session会话中获取指定的信息
removeAttribute(key);从session会话中移除指定的信息

request.jsp

<%
    //重定向跳转
//    response.sendRedirect("aaaa.jsp");
    //请求转发跳转getRequestDispatcher得到转发对象  forward:转发功能
    //HttpServletRequest是ServletRequest的子类
//    request.getRequestDispatcher("aaaa.jsp").forward(request,response);
    pageContext.setAttribute("k1","pageContext中的内容");
    request.setAttribute("k2","request中的内容");
    session.setAttribute("k3","session中的内容");
    application.setAttribute("k4","application中的内容");
%>

当前页面是否能取得上面四个对象保存的内容——是

pageContext:<%=pageContext.getAttribute("k1")%><br>
request:<%=request.getAttribute("k2")%><br>
session:<%=session.getAttribute("k3")%><br>
application:<%=application.getAttribute("k4")%><br>

转发到其他页面aaaa.jsp——k 1=null,pageContext有效期结束,获取不到值

pageContext:<%=pageContext.getAttribute("k1")%><br>
request:<%=request.getAttribute("k2")%><br>
session:<%=session.getAttribute("k3")%><br>
application:<%=application.getAttribute("k4")%><br>

重定向到其他页面aaaa.jsp——k 1,k 2为null,重定向使url改变,不为同一个请求对象,request有效期结束,获取不到值

pageContext:<%=pageContext.getAttribute("k1")%><br>
request:<%=request.getAttribute("k2")%><br>
session:<%=session.getAttribute("k3")%><br>
application:<%=application.getAttribute("k4")%><br>

有效期越长越占用内存资源。后期使用最多的是request和session

session:保存当前用户信息

request:只能在转发的页面使用

周期越长占用资源时间越长,服务器的压力会越大。一般我们机会都使用request保存数据,跳转都使用转发跳转。 只有登录者的信息才会放入到session会话中。

5. EL表达式

EL表达式就是用来获取四大域对象中保存的数据也可以执行表达式

  • 完整语法:${scope .key}获取指定域中保存的数据也可以执行表达式或key与表达式结合使用
  • 简写:${key}默认从pageContext扫描,如果找到对应的key则不会扫描了。否则继续扫描request,依次session、application
<h1>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</h1>
<h1>通过四大域对象调用get方法获取响应域中数据</h1>
pageContext:<%=pageContext.getAttribute("k1")%><br>
request:<%=request.getAttribute("k1")%><br>
session:<%=session.getAttribute("k1")%><br>
application:<%=application.getAttribute("k1")%><br>


<h1>通过el表达式获取四大域数据</h1>
pageContext:${pageScope.k1}<br>
request:${requestScope.k1}<br>
session:${sessionScope.k1}<br>
application:${applicationScope.k1}<br>

<h1>简写的el表达式</h1>
${k1}

更多推荐