session会话
1. jsp中的session会话
1. what
思考:我们可以看到登录后需要在其他页面获取当前登陆者的信息,而且如果不登录无法访问其他页面
session对象表示浏览器与服务器交互的一个容器,该容器用于存放当前会话【登陆者】的信息。
会话是浏览器与服务器之间建立的联系,服务器重启或者浏览器关闭都会导致会话结束。
session容器中内容保存周期默认为30分钟
session中里面常用的方法:
setAttribute(key,value);往sesssion会话中保存信息
getAttribute(key);从session会话中获取指定的信息
removeAttribute(key);从session会话中移除指定的信息
setMaxInactiveInterval();设置有效时间
2.方法与具体业务实现
- 将登录信息添加到session会话中
session.setAttributeo("key",value);
参数类型:key——String类型
value——Object类型
业务处理:在登录处理页面(loginDo.jsp)中
将获取的user信息添加到session会话中
session.setAttribute("user",user);
- 获取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>编 号</th> <th>类 型</th> <th>名 称</th> <th>作 者</th> <th>出版社</th> <th>价 格</th> <th>操 作</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> <%}%>
- 更改session会话的过期时间
session.setMaxInactiveOnterval();
- 移除当前会话中的用户信息
session.removeAttribute("key");
业务处理:在登录成功显示信息的页面添加退出按钮,跳转到登录退出处理页面(logout.jsp)中
在该页面中,两步操作
一:移除会话信息
session.removeAttribute("user");二:跳转到登陆页面
response.sendRedirect("login.jsp");
2. jsp的内置对象(9个)
内置对象就是无需自己在jsp中创建该类的对象。
-
out:输出对象
print()输出方法 write()输出方法,同上 -
request:请求对象,封装了客户的请求信息
getParameter("参数名");接收请求的参数 getParameterValues("");接收数组参数值 setCharacterEncoding("编码");设置编码 getSession();获取session会话对象 getRemoteAddr();获取远程访问者的ip地址 getContextPath();获取上下文路径 getRequestDispatcher();获取转发对象调用forward()方法——request中保存的数据可以共享 -
response:响应对象,把对客户的响应信息封装
sendRedirect("路径");重定向到指定路径 getWrite();获取输出对象 -
session:会话对象
setAttribute(key,value);往sesssion会话中保存信息 getAttribute(key);从session会话中获取指定的信息 removeAttribute(key);从session会话中移除指定的信息 setMaxInactiveInterval();设置有效时间 -
page:网页对象——每个网页都有一个page对象类似于this对象,表示当前网页的对象
-
pageContext:网页上下文对象。该对象可以获取其他8个对象
-
config:配置对象,获取网页一些相关的配置
-
exception:异常对象,Throwable类的对象。它只能在错误页面使用
-
application:应用对象。里面保存的数据整个服务器都有效。只要服务器不重启,作用最大
上述9中内置对象一定有属于的类型
3. jsp的两种页面跳转
-
重定向跳转:redirect,地址栏会发生改变,而且会生成新的request对象
response.sendRedirect("地址") -
请求转发跳转: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}
更多推荐


所有评论(0)