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>

 

posted @ 2017-07-21 18:02  咫尺天涯是路人丶  阅读(1551)  评论(0编辑  收藏  举报