java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)
1.Session概述:
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。
在web中session就代表了一次会话(request.getSession().getAttribute())
一次建立连接和一次关闭连接称之为会话
session会在客户端第一次向服务器请求的时候,在服务器上被创建,服务器响应客户端的时候就会传送给客户端,此时sessionID保留在客户端
当客户端第二次向服务器发送请求的时候会带上sessionid---->首先要寻找相同sessionid,如果找到就标识来过,如果没有找到,服务器就会重新创建一个sessionid返回给客户端
session什么时候被销毁:
(session的不活动周期)
A.不活动周期:当在10秒钟之内任意一秒刷新了页面(操作当前session),失效时间会自动重置为10秒,setMaxInactiveInterval设置失效使用
B.关闭服务器
C.关闭浏览器
D.配置session自动失效((tomcat服务器)默认失效时间为30m)
*****如果使用的是tomcat服务器,不允许修改tomcat的web.xml中的session失效时间
E.invalidate()方法,强制失效(坚决不让用)
session常用的方法:
******setAttribute(key,value);为session对象设置一个值
******getAttribute(key);通过设置的key获取对应的值
******removeAttribute(key);通过设置的key移除对应的键值对
(不常用)getAttributeNames();获取设置的key的值,返回的是一个枚举
setMaxInactiveInterval(int seconds);设置session的失效时间,单位是秒
getMaxInactiveInterval();获取session的失效时间,单位是秒
******isNew();当前session对象是否为新创建的对象,返回boolean类型
2.三层架构实例(实现接口封装JDBC):
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
三层架构的父子包示例:
Entity下实体类Teacher,实现序列化,并重写HashCode和Equals方法
package cn.zzsxt.lee.web.entity; import java.io.Serializable; /** * @description 教师实体类 * @author Seven Lee * @date 2017年7月21日上午11:48:12 * */ public class Teacher implements Serializable { private static final long serialVersionUID = 1L; private String id; private String name; private String password; public Teacher() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((password == null) ? 0 : password.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Teacher other = (Teacher) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (password == null) { if (other.password != null) return false; } else if (!password.equals(other.password)) return false; return true; } @Override public String toString() { return "Teacher [id=" + id + ", name=" + name + ", password=" + password + "]"; } }
Dao下的ITeacherDao接口,规范格式:
package cn.zzsxt.lee.web.dao; import cn.zzsxt.lee.web.entity.Teacher; /** * @description 教师Dao * @author * @date 2017年7月21日下午2:24:10 * */ public interface ITeacherDao { /** * @description 通过账号密码查询教师信息 * @return */ Teacher selectTeacherByNameAndPassword(Teacher teacher) throws Exception; /** * @description 修改教师信息 * @return */ int updateTeacher(); /** * @description 删除教师 * @return */ int deleteTeacher(); /** * @description 新增教师信息 * @return */ int addTeacher(); }
Dao.Impl下的TeacherDaoImpl,实现接口并封装JDBC:
package cn.zzsxt.lee.web.dao.impl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import cn.zzsxt.lee.web.dao.ITeacherDao; import cn.zzsxt.lee.web.entity.Teacher; public class TeacherDaoImpl implements ITeacherDao { @Override public Teacher selectTeacherByNameAndPassword(Teacher teacher) throws Exception { // 1.加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2.获取连接 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123456"); // 3.获取预编译statement String sql = "select * from teacher where name=? and password=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, teacher.getName()); ps.setString(2, teacher.getPassword()); // 4.调用executeQuery();返回结果集 ResultSet rs = ps.executeQuery(); // 遍历结果集 Teacher t = new Teacher(); while (rs.next()) { t.setId(rs.getString("id")); t.setName(rs.getString("name")); t.setPassword(rs.getString("password")); } return t; } @Override public int updateTeacher() { return 0; } @Override public int deleteTeacher() { return 0; } @Override public int addTeacher() { return 0; } }
登录界面,预跳转至处理登录界面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <form action="deal_login.jsp" method="post"> 用户名: <input type="text" name="username" /> <br /> 密码: <input type="password" name="pwd" /> <br /> <input type="submit" value="提交" /> </form> </body> </html>
登录处理界面,预跳转至主页:
<%@ page language="java" import="java.util.*, java.sql.*, cn.zzsxt.lee.web.entity.*, cn.zzsxt.lee.web.dao.*, cn.zzsxt.lee.web.dao.impl.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'deal_login.jsp' starting page</title> </head> <body> <% // 第一步:获取input框中的值 String username = request.getParameter("username"); String pwd = request.getParameter("pwd"); Teacher teacher = new Teacher(); teacher.setName(username); teacher.setPassword(pwd); ITeacherDao teacherDao = new TeacherDaoImpl(); Teacher t = teacherDao.selectTeacherByNameAndPassword(teacher);
if (t.getId() != null && !"".equals(t.getId())) { //登录成功 request.getSession().setAttribute("teacher", t); request.getRequestDispatcher("index.jsp").forward(request, response); }
%> </body> </html>
主页:(Web项目自带的主页建议删除后重新创建)
<%@ page language="java" import="java.util.*, cn.zzsxt.lee.web.entity.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <% Teacher teacher = (Teacher) request.getSession().getAttribute("teacher"); %> <h1> 欢迎登录:<%=teacher.getName()%></h1> </body> </html>
3.session实现简单购物车:
登录界面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <body> <form action="deal_login.jsp" method="post"> 用户名:<input type="text" name="username" /><br /> 密码:<input type="password" name="pwd" /> <input type="submit" value="提交" /> </form> </body> </html>
登录处理界面:
<%@ page language="java" import="java.util.*, cn.zzsxt.lee.web.entity.*, cn.zzsxt.lee.web.dao.*, cn.zzsxt.lee.web.dao.impl.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'deal_login.jsp' starting page</title> </head> <body> <% String uname = request.getParameter("username"); String password = request.getParameter("pwd"); User user = new User(); user.setUsername(uname); user.setPassword(password); IUserDao userDao = new UserDaoImpl(); User u = userDao.selectUserByNameAndPwd(user); if (u.getId() != null && !"".equals(u.getId())) { // 登录成功 request.getSession().setAttribute("user", u);// 创建session对象,并且调用setAttribute方法进行保存 IStudentsDao studentDao = new StudentsDaoImpl(); List<Student> stuList = studentDao.selectAllStudents(); // 当很多页面都需要使用这个数据的时候,就保存session(登录以后的用户信息) // 临时需要取出的数据,使用request(商品的展示,增改) if (stuList.size() > 0) { // 说明有值 request.setAttribute("list", stuList); request.getRequestDispatcher("index.jsp").forward(request, response); } else { // 查询出的数据为null,不能跳转 // 但是已经登录成功了 response.sendRedirect("404.jsp"); } } else { // 登录失败 } %> </body> </html>
主页选购:
<%@ page language="java" import="java.util.*, cn.zzsxt.lee.web.entity.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <% request.getSession();// 获取session对象 request.getSession(false);// 如果getSession()方法中的参数为false,直接从request中获取session(获取session对象),如果获取不到,就直接返回null,并不会创建一个session对象 //如果参数为true,总是创建一个新的session // session 不会被new的,是直接被获取的 //其实session自动会创建很多对象等着被使用,request.getSession(); // 防止session创建新的对象 User user = (User) request.getSession(false).getAttribute("user"); if (user != null) { System.out.println("我是有值的"); %><h1> 欢迎你:<%=user.getUsername()%></h1> <% } else { // 提示,用户未登录请登录 } %> <table> <thead> <tr> <th>学生编号</th> <th>学生用户名</th> <th>学生密码</th> <th>操作</th> </tr> </thead> <tbody> <% List<Student> list = (List<Student>) request.getAttribute("list"); for (int i = 0; i < list.size(); i++) { %> <tr> <td><%=list.get(i).getId()%></td> <td><%=list.get(i).getStuName()%></td> <td><%=list.get(i).getStuPwd()%></td> <td><a href="add_cart.jsp?id=<%=list.get(i).getId() %>">添加购物车</a></td> </tr> <% } %> </tbody> </table> </body> </html>
处理添加购物车界面:
<%@ page language="java" import="java.util.*, cn.zzsxt.lee.web.entity.*, cn.zzsxt.lee.web.dao.*, cn.zzsxt.lee.web.dao.impl.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'add_cart.jsp' starting page</title> </head> <body> <h1>购物车:</h1> <% Student stu = null; String id = request.getParameter("id");// 学生id if (id != null && !"".equals(id)) { // 如果id不为null,必定能经过sql,不报错 IStudentsDao studentDao = new StudentsDaoImpl(); stu = studentDao.selectStuById(id); } else { stu = new Student(); } // 如果页面第一次被访问,直接获取stuList,永远为null List<Student> listStu = (List<Student>) request.getSession().getAttribute("stuList"); if (stu.getId() != null && !"".equals(stu.getId())) { if (listStu != null) { listStu.add(stu); } else { // 初始化 listStu = new ArrayList<Student>(); listStu.add(stu); } request.getSession().setAttribute("stuList", listStu); response.sendRedirect("cart.jsp"); } else { response.sendRedirect("404.jsp"); } %> </body> </html>
购物车界面:
<%@ page language="java" import="java.util.*, cn.zzsxt.lee.web.entity.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'cart.jsp' starting page</title> </head> <body> <h1> <a href="">删除购物车</a> </h1> <% List<Student> listStu = (List<Student>) request.getSession(false).getAttribute("stuList"); if (listStu.size() > 0) { for (int i = 0; i < listStu.size(); i++) { System.out.println(listStu.get(i).getStuName()); } } else { System.out.println("添加购物车失败,请重新添加 "); } %> </body> </html>