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>

java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)的更多相关文章

  1. MVC设计模式与Java Web经典三层架构

    MVC设计模式 MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...

  2. tornado框架&三层架构&MVC&MTV&模板语言&cookie&session

    web框架的本质其实就是socket服务端再加上业务逻辑处理, 比如像是Tornado这样的框架. 有一些框架则只包含业务逻辑处理, 例如Django, bottle, flask这些框架, 它们的使 ...

  3. Java MVC和三层架构

    一.设计模式 Model 1 和Model 2 Model 1 前面学习了Servlet和Jsp,对这两个有个大概的认识,Servlet就是为了解决静态页面的问题,能够实现动态的页面,使维护,开发更加 ...

  4. Java学习笔记——三层架构

    Layer: UI层: user interface 用户接口层 Biz层:   service business login layer 业务逻辑层 DAO层:   Date Access Obje ...

  5. Java Web 三层架构详解

    java 三层架构ssh 一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的 IoC来管理应用的 所有bean,包括struts2的 action,充分发 ...

  6. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  7. [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. JavaWeb学习之三层架构实例(三)

    引言 通过上一篇博客JavaWeb学习之三层架构实例(二)我们基本上已经实现了对学生信息列表的增删改查操作(UI除外),但是不难看出,代码冗余度太高了,尤其是StudentDao这个类,其中的增删改查 ...

  9. java:(九大内置对象,计算服务器访问次数,filter过滤器,MVC框架,MVC和三层架构的关系)

    1.九大内置对象: <%@ page language="java" import="java.util.*" pageEncoding="UT ...

随机推荐

  1. 标准C语言(1)

    C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...

  2. Backtracking(一)

    LeetCode中涉及到回溯的题目有通用的解题套路: 46. permutations 这一类回溯题目中的基础中的基础,无重复数字枚举: /* Given a collection of distin ...

  3. 【洛谷P2147】洞穴勘测

    题目大意:维护 N 个点的无向图,支持动态加边和删边,回答两点的连通性. 题解:线段树分治 + 可撤销并查集 询问可以离线,这是线段树分治的基础. 建立在操作时间轴上的线段树称为线段树分治算法. 本题 ...

  4. 我说CMMI之二:CMMI里有什么?--转载

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dylanren/article/deta ...

  5. html中表单提交

    表单提交代码 1.源代码分析 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  6. 如何安装 Angular CLI 并且检查 CLI 的版本

    想在系统中安装 Angular CLI ,如何进行安装并且如何检查 CLI 的版本? 可以使用命令: npm install -g @angular/cli 进行安装. 使用命令 ng version ...

  7. oracle(转)

    Oracle数据库基本操作 1.概述 Oracle数据库客户端一般需要安装在服务器上,可以在服务器端操作,一般我们可以用sql developer工具远程连接到数据库,先行建立数据库,然后对表进行增删 ...

  8. HDU 6136 Death Podracing (堆)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6136 题解 完了,普及题都不会做了... 发现一个重要性质是只有相邻的人才会相撞,于是直接拿堆维护即可 ...

  9. js添加删除class

    添加: obj.classList.add("active"); 删除:obj.classList.remove("active");例子 <button ...

  10. Jmeter -- 监听 -- 查看每个请求的启动时间等信息

    步骤: 1. 添加监听器 Add --> Listener --> View Results in Table 2. 执行线程组,查看监听信息