需求:
目录结构:
设计表:
依赖:
<!-- junit 测试用, -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.26</version>
<scope>test</scope>
</dependency>
<!-- springmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-hibernate</artifactId>
<version>1.2.9</version>
</dependency>
<!-- jdbc -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>jdbc</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- serlvet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.14</version>
</dependency>
<!-- javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.22.0-GA</version>
</dependency>
配置:
properties
jdbc:
jdbc.username = scott
jdbc.password = tiger
jdbc.url = jdbc:oracle:thin:@192.168.1.108:1521:orcl
jdbc.driverClassName = oracle.jdbc.driver.OracleDriver
log4j:
log4j.rootLogger = info,a,b
log4j.appender.a = org.apache.log4j.ConsoleAppender
log4j.appender.a.Target = System.err
log4j.appender.a.layout = org.apache.log4j.SimpleLayout
log4j.appender.b = org.apache.log4j.FileAppender
log4j.appender.b.File = D:/gz.log
log4j.appender.b.layout = org.apache.log4j.PatternLayout
log4j.appender.b.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
xml:
spring-hibernate.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 开启扫描扫控制器 -->
<context:component-scan
base-package="com.hxzy.ssh.dao" scoped-proxy="interfaces"></context:component-scan>
<context:component-scan
base-package="com.hxzy.ssh.service" scoped-proxy="interfaces"></context:component-scan>
<!-- 读取jdbc配置 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:jdbc.properties" />
</bean>
<!-- jdbc -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"
value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 创建hibernate 会话工厂 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingLocations"><!-- or <property name="mappingResources"> -->
<list>
<value>classpath*:hbm/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.hbm2ddl.auto = update
hibernate.show_sql = true
</value>
</property>
</bean>
<!-- 事务管理器 -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice transaction-manager="txManager" id="txAdvice">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="get*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="aop"
expression="execution(* com.hxzy.ssh.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="aop"/>
</aop:config>
</beans>
spring-mvc.xml:
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan
base-package="com.hxzy.ssh.controller"></context:component-scan>
<!-- 视图解析 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="suffix" value=".jsp"></property>
</bean>
映射:
author.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hxzy.ssh.entity.Author" table="author"
lazy="true">
<id name="authorId" column="authorId" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">
seq_author_authorId
</param>
</generator>
</id>
<property name="authorName" column="authorName"
type="java.lang.String"></property>
<property name="passWord" column="passWord"
type="java.lang.String"></property>
<set name="set" inverse="true" cascade="save-update">
<key column="authorId" />
<one-to-many class="com.hxzy.ssh.entity.Book" />
</set>
</class>
</hibernate-mapping>
book.hbm.xml:
<class name="com.hxzy.ssh.entity.Book" table="book" lazy="true">
<id name="bookId" column="bookId" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">
seq_book_bookId
</param>
</generator>
</id>
<property name="bookName" column="bookName" type="java.lang.String"></property>
<many-to-one name="author" class="com.hxzy.ssh.entity.Author" cascade="save-update"
not-null="true">
<column name="authorId"></column>
</many-to-one>
这是一个双向关联多对一映射
entity:
public class Author {
private String authorName;
private int authorId;
private String passWord;
private Set<Book> set = new HashSet<Book>();
}
public class Book {
private int bookId;
private String bookName;
private Author author = new Author();
}
public class Page {
private int totalPageNum;
private int totalBookNum;
private int currentPageNum;
}
dao层:增删改查跑不掉
BookDao
@Component
public class BookDaoImpl implements BookDao {
Session session = null;
Transaction tx = null;
private static SessionFactory sessionFactory;
/**
* 实现增删改查book功能
*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@SuppressWarnings("static-access")
@Resource(name = "sessionFactory")
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* 添加书籍book
*/
@Override
public void addBook(Book book) {
// TODO Auto-generated method stub
session = getSession();
tx = session.beginTransaction();// 开启事务
try {
book.setBookId(0);
session.saveOrUpdate(book);
tx.commit();// 提交事务
} catch (Exception e) {
e.printStackTrace();
tx.rollback();// 失败则回滚
} finally {
session.close();// 关闭资源
}
}
@Override
public void deleteBook(Book book) {
// TODO Auto-generated method stub
}
/***/
@Override
public void updateBook(Book book) {
// TODO Auto-generated method stub
}
/***
* 获取session
*/
public Session getSession() {
session = sessionFactory.openSession();
return session;
}
@SuppressWarnings("unchecked")
@Override
public List<Book> getBookList(Author author, int currentPageNum) {
// TODO Auto-generated method stub
session = getSession();
List<Book> bookList = new ArrayList<Book>();
int Page_Size = 3;//每一页的book数量
try {
Query q = session.createQuery("from Book where authorId =:authorId");
q.setMaxResults(Page_Size);
q.setFirstResult(Page_Size * (currentPageNum-1));// 最小结果3*(n-1)
bookList = q
.setParameter("authorId", author.getAuthorId())
.list();//查出结果集
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return bookList;
}
/**
* 获取书籍总数
*/
public int getTotalBookNum(Author author) {
session = getSession();
BigDecimal i = null;
int j = 0;
try {
i = (BigDecimal) session.createSQLQuery("select count(1) from book").uniqueResult();
j =i.toBigInteger().intValue();//转换为int数值
// 查出总书数量
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return j;
}
/**
* 5本书一页,获取总页数
*/
public int getTotalPageNum(Author author) {
int i = (getTotalBookNum(author) % 3 == 0)? getTotalBookNum(author)/3: getTotalBookNum(author)/3+1;
return i;
}
/**
* 由bookname获取单个book
*/
@Override
public Book getBook(Book book) {
session = sessionFactory.openSession();
Book book1 = null;
try {
String hql = "from Book where bookName = :bookName";// 根据bookname查出book
book1 = (Book) session.createQuery(hql).setParameter("bookName", book.getBookName()).uniqueResult();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();// 关闭资源
}
return book1;
}
}
AuthorDao
@Component//准备authorImpl的bean
public class AuthorDaoImpl implements AuthorDao {
Session session = null;
private static SessionFactory sessionFactory;
@SuppressWarnings("static-access")
@Resource//注入sessionFactory
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
//System.out.println("sessionFactory:" + sessionFactory);
}
Transaction tx = null;
@Override
public void addAuthor(Author author) {
// TODO Auto-generated method stub
}
@Override
public void deleteAuthor(Author author) {
// TODO Auto-generated method stub
}
/**
* 关闭资源
* */
public void destory() {
if(session!=null) {
session.close();
}
}
/**
* 获取单个author
*/
@Override
public Author getAuthor(Author author) {
// System.out.println("author:"+author.getAuthorName()+author.getPassWord());
session = sessionFactory.openSession();
Author author1 = null;
try {
String hql = "from Author where authorName = :authorName and passWord = :passWord";
author1 = (Author) session.createQuery(hql).setParameter("passWord", author.getPassWord())
.setParameter("authorName", author.getAuthorName()).uniqueResult();
// System.out.println("author1:"+author1.getAuthorName()+author1.getPassWord());
} catch (Exception e) {
e.printStackTrace();
} finally {
destory();//关闭资源
}
return author1;
// TODO Auto-generated method stub
}
/**
* 获取单个author by id
*/
@Override
public Author getAuthor(int id) {
// System.out.println("author:"+author.getAuthorName()+author.getPassWord());
session = sessionFactory.openSession();
Author author1 = null;
try {
String hql = "from Author where authorId = :id";
author1 = (Author) session.createQuery(hql).setParameter("id", id)
.uniqueResult();
// System.out.println("author1:"+author1.getAuthorName()+author1.getPassWord());
} catch (Exception e) {
e.printStackTrace();
} finally {
destory();//关闭资源
}
return author1;
}
@Override
public void updateAuthor(Author author) {
// TODO Auto-generated method stub
session = sessionFactory.openSession();
tx = session.beginTransaction();//开启更新事务
try {
session.update(author);
tx.commit();//提交事务
}catch(Exception e) {
e.printStackTrace();
tx.rollback();//异常则回滚
}finally {
session.close();//关闭资源
}
}
}
控制层:
ListController
@Controller
public class ListController {
/**
* 书籍列表
* 实现增删改查书籍功能
* */
private BookService bookService;
private AuthorService authorService;
@Resource(name="bookServiceImpl")
public void setBookService(BookService bookService) {
this.bookService = bookService;
}
@Resource(name="authorServiceImpl")
public void setAuthorService(AuthorService authorService) {
this.authorService = authorService;
}
/**
* 查看书籍列表
* */
@RequestMapping(value="/list",method=RequestMethod.GET)
public ModelAndView getBookListMav(ModelAndView mav,HttpSession session) {
Author author = (Author) session.getAttribute("author");
Page page = (Page) session.getAttribute("page");
List<Book> bookList = bookService.getBookList(author,page.getCurrentPageNum());
if(page.getTotalBookNum() == 0) {//初始化page部分参数
page.setTotalBookNum(bookService.getTotalBookNum(author));
page.setTotalPageNum(bookService.getTotalPageNum(author));
}
mav.addObject("page", page);//传参page
mav.addObject("bookList", bookList);//传参booklist
mav.setViewName("list");
return mav;
}
/**
* 添加书籍列表
* */
@RequestMapping(value="/addlist",method = RequestMethod.POST)
public ModelAndView addBookListMav(@ModelAttribute Book book,ModelAndView mav) {
Author author = new Author();
Set<Book> set = new HashSet<Book>();
author = authorService.getAuthor(book.getBookId());
System.out.println("authorid:"+author.getAuthorId());
set.add(book);
author.setSet(set);
book.setAuthor(author);
bookService.addBook(book);//添加到数据库
Book book1 = bookService.getBook(book);
Page page = new Page(bookService.getTotalPageNum(author),bookService.getTotalBookNum(author));
if(book1!=null) {
List<Book> bookList = new ArrayList<Book>();
bookList = bookService.getBookList(author,-1);//查看添加的结果
mav.addObject("bookList", bookList);
mav.addObject("page", page);
mav.setViewName("list");
}else {
mav.setViewName("add");
}
return mav;
}
/**
* first首页
* */
@RequestMapping(value="/first",method=RequestMethod.GET)
public ModelAndView firstMav(HttpSession session,ModelAndView mav) {
Page page = (Page) session.getAttribute("page");
page.setCurrentPageNum(1);
mav.setViewName("list");
mav = getBookListMav(mav,session);
return mav;
}
/**
* last上一页
* */
@RequestMapping(value="/last",method=RequestMethod.GET)
public ModelAndView lastMav(HttpSession session,ModelAndView mav) {
Page page = (Page) session.getAttribute("page");
page.setCurrentPageNum(page.getCurrentPageNum()-1>1?page.getCurrentPageNum()-1:1);
mav.setViewName("list");
getBookListMav(mav,session);
return mav;
}
/**
* next下一页
* */
@RequestMapping(value="/next",method=RequestMethod.GET)
public ModelAndView nextMav(HttpSession session,ModelAndView mav) {
Page page = (Page) session.getAttribute("page");
page.setCurrentPageNum(page.getCurrentPageNum()+1<page.getTotalPageNum()?page.getCurrentPageNum()+1:page.getTotalPageNum());
mav.setViewName("list");
getBookListMav(mav,session);
return mav;
}
/**
* 末页
* */
@RequestMapping(value="/final",method=RequestMethod.GET)
public ModelAndView finalMav(HttpSession session,ModelAndView mav) {
Page page = (Page) session.getAttribute("page");
page.setCurrentPageNum(page.getTotalPageNum());
mav.setViewName("list");
mav = getBookListMav(mav,session);
return mav;
}
}
LoginController:
/**
* 登录控制器
*实现登录控制
*index.html-->login.jsp
*登录成功login-->info.jsp
*登录失败login-->login.jsp
* */
@Controller
public class LoginController {
private AuthorService authorService;
/**
*注入authorservice
* */
@Resource(name="authorServiceImpl")
public void setAuthorService(AuthorService authorService) {
this.authorService = authorService;
}
/**
* 截取index主页跳转到登录页面
* index-->login
* */
@RequestMapping(value="index",method=RequestMethod.GET)
public String index() {
// System.out.println("进来了index");
return "login";
}
/**
* 截取login返回modelandview
* 去service查询
* 登录成功转到info
* 登录失败转到login
* */
@RequestMapping(value="/login",method=RequestMethod.POST)
public ModelAndView login(@ModelAttribute Author author,ModelAndView mav) {
// System.out.println("进入了mav");
Author author1 = authorService.getAuthor(author);
// System.out.println(author1);
if(author1!=null) {//查询结果相同,登录成功
// System.out.print("author1输出了");
mav.addObject("author1",author1);
Page page = new Page(0, 0);
page.setCurrentPageNum(1);
mav.addObject("page",page);
mav.setViewName("info");
}else {//查询结果不同,登录失败
// mav.addObject(author1);
mav.setViewName("login");
}
return mav;//返回视图
}
/**
* 截取updateAuthor返回modelandview
* */
@RequestMapping(value="/updatePassWord.html",method=RequestMethod.POST)
public ModelAndView updatePassword(@ModelAttribute Author author,ModelAndView mav) {
authorService.updateAuthor(author);//更新密码
Author author1 = authorService.getAuthor(author);
if(author1!=null) {//查询结果相同,修改成功
System.out.print("修改密码成功");
mav.addObject("author1",author1);
mav.setViewName("info");
}else {//查询结果不同,修改失败
mav.setViewName("updatePassWord");
}
return mav;//返回视图
}
}
视图层:
index.jsp:
<jsp:forward page="index.html"></jsp:forward
login.jsp:
<form action="login.html" method="post">
AuthorName: <input type="text" name="authorName" /> <br>
PassWord: <input type="password" name="passWord" /><br>
<input type="submit" value="登录"/>
</form>
info.jsp:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<div>welcome ${author1.authorName}</div>
<c:set var="author" value="${author1}" scope="session"></c:set>
<c:set var="page" value="${page }" scope="session" />
<div>
<a href="updatePassWord.jsp"><button>修改密码</button></a>
</div>
<div class="add">
<a href="add.jsp"><button>添加新书籍</button></a>
</div>
<!-- <div class="delete"> -->
<!-- <a href="del.jsp"><button >删除</button></a> -->
<!-- </div> -->
<!-- <div class="update"> -->
<!-- <a href="upd.jsp"><button >编辑</button></a> -->
<!-- </div> -->
<div class="select">
<a href="list.html"><button>查询</button></a>
</div>
list.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>展示列表</title>
<style>
#sheet {
display:inline-block;
}
</style>
</head>
<body>
<%-- ${sessionScope.author.authorId} --%>
<div>${author.authorName}的书单:</div>
<div>一共 ${sessionScope.page.totalPageNum} 页</div>
<div>查询到 ${sessionScope.page.totalBookNum} 条记录</div>
<c:set var="pn" value="${session.page.currentPageNum }"></c:set>
<c:set var="pt" value="${session.page.totalPageNum }"></c:set>
<c:set var="page" value="${page }" scope="session" />
<div class="bookid" id="sheet">
<a class="title">书籍编号</a></br>
<c:forEach items="${bookList}" var="item">
<c:out value="${item.getBookId()}" /></br>
</c:forEach>
</div>
<div class="bookname" id="sheet">
<a class="title">书名</a></br>
<c:forEach items="${bookList}" var="item">
<c:out value="${item.getBookName()}" /></br>
</c:forEach>
</div> </br>
<a href="first.html"><button>首页</button></a>
<a href="last.html"><button>上一页</button></a>
<a href="next.html"><button>下一页</button></a>
<a href="final.html"><button>末页</button></a>
<div class="add">
<a href="add.jsp"><button>添加</button></a>
</div>
</body>
</html>
add.jsp:
<form action="addlist.html" method="post">
bookname: <input type="text" name="bookName" /> <br>
<input type="hidden" name="bookId" value="${sessionScope.author.authorId}" />
<input type="submit" value="提交" />
</form>
updatepassword.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>修改密码</title>
</head>
<body>
<input type="hidden" name="authorpass" value="${sessionScope.author.passWord}" id="oldpass" />
<form action="updatePassWord.html" method="post">
<input type="hidden" name="authorId" value="${sessionScope.author.authorId}" />
<input type="hidden" name="authorName" value="${sessionScope.author.authorName}" />
原密码: <input type="text" name="oldPassWord" id="pass" /> <br>
新密码: <input type="password" name="passWord" /> <br>
确认新密码: <input type="password" name="passWord2" /> <br>
<input type="submit" value="修改密码" id="submit"/>
</form>
</body>
<script src="jquery-3.2.1.min.js"></script>
<script src="jquery-1.7.2.min.js"></script>
<script>
$(function(e){
$("#submit").click(function(){
if($(" #pass ").val() != $(" #oldpass ").val()){
alert("原密码不正确");
$("form").load("http://localhost:8080/ssh/updatePassWord form");
}
if($(" input[ name='password' ] ").val() != $(" input[ name='password2' ] ").val()){
alert("新密码不一致");
$("form").load("http://localhost:8080/ssh/updatePassWord form");
}
});
});
</script>
</html>