一.项目开发环境
1.开发工具:eclipse+MySQL
2.项目运行环境:Maven工程+web3.0+jdk1.8
3.SSH2:struts2+hibernate+spring
4.插件:Lombok+spring tool suite
5.前端:easyUI+jQuery
二.项目搭建步骤
1.pom.xml配置,注意:一定要加上这个jar包:struts2-convention-plugin
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zking</groupId>
<artifactId>ssh2third</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ssh2third Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- 1.hibernate相关 -->
<hibernate.version>5.2.12.Final</hibernate.version>
<ehcache.version>2.10.0</ehcache.version>
<mysql.version>5.1.44</mysql.version>
<!-- 2.spring相关 -->
<spring.version>5.0.1.RELEASE</spring.version>
<!-- 3.struts2相关 -->
<struts2.version>2.5.13</struts2.version>
<!-- 4.log4j2+slf4j配置 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j2.version>2.9.1</log4j2.version>
<log4j2.disruptor.version>3.2.0</log4j2.disruptor.version>
<!-- 5.junit+servlet -->
<junit.version>4.12</junit.version>
<servelt.version>4.0.0</servelt.version>
<!-- 6.jstl+standard -->
<jstl.version>1.2</jstl.version>
<standard.version>1.1.2</standard.version>
<!-- 7.tomcat-jsp-api -->
<tomcat-jsp-api.version>8.5.30</tomcat-jsp-api.version>
<!-- 8.jackson -->
<jackson-annotations.version>2.2.3</jackson-annotations.version>
<jackson-core.version>2.2.3</jackson-core.version>
<jackson-databind.version>2.2.3</jackson-databind.version>
<!-- 9.lombok -->
<lombok.version>1.18.2</lombok.version>
</properties>
<dependencies>
<!-- 1.hibernate相关 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 2.spring相关 -->
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 3.struts2相关 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<!-- 4.log4j2+slf4j配置 -->
<!-- slf4j核心包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<!--用于与slf4j保持桥接 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--核心log4j2jar包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
<scope>runtime</scope>
</dependency>
<!--需要使用log4j2的AsyncLogger需要包含disruptor -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>${log4j2.disruptor.version}</version>
</dependency>
<!-- 5.junit+Servlet -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servelt.version}</version>
<scope>provided</scope>
</dependency>
<!-- 6.jstl+standard -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
</dependency>
<!-- 7.tomcat-jsp-api -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>${tomcat-jsp-api.version}</version>
</dependency>
<!-- 8.jackson -->
<!-- jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-annotations.version}</version>
</dependency>
<!-- jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-core.version}</version>
</dependency>
<!-- jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind.version}</version>
</dependency>
<!-- 红辣椒 用于实体类注解式开发 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>ssh2sec</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.spring与hibernate集成
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 1.自动扫描与装配bean -->
<context:component-scan base-package="com.zking.ssh"/>
<!-- 2.注入数据库配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 3.注册数据源 c3p0 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${db.username}"></property>
<property name="password" value="${db.password}"></property>
<property name="driverClass" value="${db.driverClass}"></property>
<property name="jdbcUrl" value="${db.jdbcUrl}"></property>
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize"
value="${db.initialPoolSize}"></property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="${db.maxPoolSize}"></property>
<!--连接池中保留的最小连接数。 -->
<property name="minPoolSize" value="${db.minPoolSize}" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="${db.maxIdleTime}" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement"
value="${db.acquireIncrement}" />
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。
所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:
0 -->
<property name="maxStatements" value="${db.maxStatements}" />
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod"
value="${db.idleConnectionTestPeriod}" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts"
value="${db.acquireRetryAttempts}" />
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。
如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
<property name="breakAfterAcquireFailure"
value="${db.breakAfterAcquireFailure}" />
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod
或automaticTestTable 等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout"
value="${db.breakAfterAcquireFailure}" />
</bean>
<!-- 4.配置localSessionFactory 相当于之前的hibernate-cfg.xml -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- hibernate相关属性 -->
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
<!--spring与Hibernate集成无法显示sql语句问题,请见集成后hibernate无法显示sql语句.txt -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 格式化输出语句 -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 配置实体注解扫描 -->
<property name="packagesToScan">
<list>
<value>com.zking.ssh.book.entity</value>
</list>
</property>
</bean>
<!-- 5.注入hibrnateTemplate模板 -->
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 6.使用注解实现事务管理 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
3.spring与struts2集成
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- <include file="struts-base.xml"></include> -->
<!-- 开启struts2开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 启用struts2配置文件自动加载模式 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!-- 将action创建交由spring容器来管理 -->
<constant name="struts.objectFactory" value="spring"></constant>
<!-- 注解式配置 -->
<constant name="struts.convention.action.packages"
value="com.zking.ssh" />
<package abstract="true" name="struts-base"
extends="struts-default">
<!-- 开启struts2动态方法调用 默认是不开启的! -->
<global-allowed-methods>regex:.*</global-allowed-methods>
</package>
</struts>
4.web.xml配置
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!-- Spring上下文ApplicationContext.xml的加载 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 启动Web容器时,自动装配ApplicationContext.xml的配置信息 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 中文乱码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 防止内存泄露、缓存清除监听器 -->
<listener>
<listener-class>
org.springframework.web.util.IntrospectorCleanupListener
</listener-class>
</listener>
<!-- 用于支持3种Bean的作用域:request,session和globalSession -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- 把session的关闭延迟到jsp页面显示之后,请配在struts2上面 -->
<filter>
<filter-name>OpenSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- struts2核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts2Config</param-name>
<param-value>classpath:struts.xml</param-value>
</init-param>
<!-- 自动扫描action -->
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.zking.ssh</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
三.项目示例演示(bean)
1.我的项目结构
2.base层(BaseDao BaseBiz BaseAction)
BaseAction
package com.zking.ssh.base.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.ActionSupport;
public abstract class BaseAction extends ActionSupport implements ServletRequestAware, ServletResponseAware {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
protected ServletContext application;
@Override
public void setServletResponse(HttpServletResponse response) {
this.response=response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request=request;
this.session=request.getSession();
this.application=request.getServletContext();
}
}
BaseBiz
package com.zking.ssh.base.biz;
//暂时没有东西
public abstract class BaseBiz {
}
BaseDao
package com.zking.ssh.base.dao;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
//暂时没东西
public abstract class BaseDao extends HibernateDaoSupport {
}
3.book层(Book BookDao BookBiz BookAction)
Book实体类
package com.zking.ssh.book.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
//实体类
@Entity
//与实体类对应的数据库表
@Table(name="t_book")
//使用了Lombok插件 简化实体类开发
@Data
public class Book implements Serializable {
//id 自增列
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer bid;
private String bname;
private String btype;
private Float bprice;
private String bookImage;
}
IBookDao接口
package com.zking.ssh.book.dao;
import java.util.List;
import com.zking.ssh.base.util.PageBean;
import com.zking.ssh.book.entity.Book;
public interface IBookDao {
public void addBook(Book book);
public void delBook(Book book);
public void editBook(Book book);
public Book get(Book book);
public List<Book> queryBookPager(Book book,PageBean pageBean);
}
BookDaoImpl实现类
package com.zking.ssh.book.dao.impl;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.zking.ssh.base.dao.BaseDao;
import com.zking.ssh.base.util.PageBean;
import com.zking.ssh.base.util.StringUtils;
import com.zking.ssh.book.dao.IBookDao;
import com.zking.ssh.book.entity.Book;
//代表实体类 并命名bookDao
@Repository("bookDao")
//事务处理
@Transactional
public class BookDaoImpl implements IBookDao {
//注入hibernateTemplate 自动装配
@Autowired
private HibernateTemplate hibernateTemplate;
@Override
public void addBook(Book book) {
this.hibernateTemplate.save(book);
}
@Override
public void delBook(Book book) {
Book b = get(book);
if(null!=b)
this.hibernateTemplate.delete(b);
}
@Override
public void editBook(Book book) {
this.hibernateTemplate.update(book);
}
@Override
public Book get(Book book) {
Book b = this.hibernateTemplate.get(Book.class, book.getBid());
return b;
}
@Override
public List<Book> queryBookPager(Book book, PageBean pageBean) {
return this.hibernateTemplate.execute(new HibernateCallback<List<Book>>() {
@Override
public List<Book> doInHibernate(Session session) throws HibernateException {
String hql = "from Book where 1=1";
if(StringUtils.isNotBlank(book.getBname()))
hql+=" and bname like '%"+book.getBname()+"%'";
if(StringUtils.isNotBlank(book.getBtype()))
hql+=" and btype like'%"+book.getBtype()+"%'";
hql+=" order by bid desc";
if(pageBean.isPagination()) {
String hql2="select count(1) from Book ";
Query query = session.createQuery(hql2);
List list = query.list();
if(null!=list && 0!=list.size()) {
pageBean.setTotal(Integer.parseInt(list.get(0).toString()));
}
}
Query<Book> query = session.createQuery(hql, Book.class);
query.setFirstResult(pageBean.getStartIndex());
query.setMaxResults(pageBean.getRows());
return query.list();
}
});
}
}
IBookBiz接口
package com.zking.ssh.book.biz;
import java.util.List;
import com.zking.ssh.base.util.PageBean;
import com.zking.ssh.book.entity.Book;
public interface IBookBiz {
public void addBook(Book book) throws Exception;
public void delBook(Book book) throws Exception;
public void editBook(Book book) throws Exception;
public Book get(Book book) throws Exception;
public List<Book> queryBookPager(Book book, PageBean pageBean) throws Exception;
}
BookBizImpl实现类
package com.zking.ssh.book.biz.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.zking.ssh.base.biz.BaseBiz;
import com.zking.ssh.base.util.PageBean;
import com.zking.ssh.book.biz.IBookBiz;
import com.zking.ssh.book.dao.IBookDao;
import com.zking.ssh.book.dao.impl.BookDaoImpl;
import com.zking.ssh.book.entity.Book;
//表示业务逻辑层
@Service("bookBiz")
//事务处理
@Transactional
public class BookBizImpl extends BaseBiz implements IBookBiz {
//注入持久层对象
@Autowired
private IBookDao bookDao=new BookDaoImpl();
@Override
public void addBook(Book book) {
System.out.println("bbbbbbb");
bookDao.addBook(book);
}
@Override
public void delBook(Book book) {
bookDao.delBook(book);
}
@Override
public void editBook(Book book) {
bookDao.editBook(book);
}
@Override
public Book get(Book book) {
return bookDao.get(book);
}
@Override
public List<Book> queryBookPager(Book book, PageBean pageBean) {
return bookDao.queryBookPager(book, pageBean);
}
}
BookAction控制层
package com.zking.ssh.book.action;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ModelDriven;
import com.zking.ssh.base.action.BaseAction;
import com.zking.ssh.base.util.CommonUtils;
import com.zking.ssh.base.util.PageBean;
import com.zking.ssh.book.biz.IBookBiz;
import com.zking.ssh.book.biz.impl.BookBizImpl;
import com.zking.ssh.book.entity.Book;
//表示控制层
@Controller("bookAction")
//action是多例模式
@Scope("prototype")
//等价于struts2配置文件中的package元素的extends属性
@ParentPackage("struts-default")
//给予命名空间
@Namespace("/")
public class BookAction extends BaseAction implements ModelDriven<Book> {
private Book book=new Book();
//注入action的biz对象
@Autowired
private IBookBiz bookBiz=new BookBizImpl();
@Override
public Book getModel() {
return this.book;
}
//等价于struts2配置文件中的action元素的name属性和method属性的复合
@Action("bookAction_addBook")
public String addBook() {
try {
bookBiz.addBook(book);
CommonUtils.toJSONMessager(response, true, "添加书本成功!");
} catch (Exception e) {
CommonUtils.toJSONMessager(response, false, "添加书本失败!");
e.printStackTrace();
}
return null;
}
@Action("bookAction_delBook")
public String delBook() {
try {
bookBiz.delBook(book);
CommonUtils.toJSONMessager(response, true, "删除书本成功!");
} catch (Exception e) {
e.printStackTrace();
CommonUtils.toJSONMessager(response, false, "删除书本失败!");
}
return null;
}
@Action("bookAction_editBook")
public String editBook() {
try {
bookBiz.editBook(book);
CommonUtils.toJSONMessager(response, true, "修改书本成功!");
} catch (Exception e) {
e.printStackTrace();
CommonUtils.toJSONMessager(response, false, "修改书本失败!");
}
return null;
}
@Action("bookAction_queryBookPager")
public String queryBookPager() {
try {
PageBean pageBean=new PageBean();
pageBean.setRequest(request);
List<Book> books = bookBiz.queryBookPager(book, pageBean);
CommonUtils.toJSONPager(request, response, pageBean.getTotal(), books, true, "ok");
} catch (Exception e) {
CommonUtils.toJSONPager(request, response,0, null, false, e.getMessage());
e.printStackTrace();
}
return null;
}
}
四.前端效果展示(SSH2+Ajax+jQuery+easyUI)
五.总结及注意事项
1.SSH2集成并不难,但是可能写的过程中是真的想吐血,现在笔者将步骤也写的很清楚了,具体要看你们怎么去理解了
2.SSH2的配置式与注解式各有各的优势吧,看你怎么去选择了.注解式的确为我们的项目开发省去了很多麻烦,精简开发.但也有不足,尤其在关系处理方面使用配置式的逻辑更为清晰明了
3.本次SSH2注解式集成让我们将核心配置文件缩减到了两个,applicationCnetext.xml和struts.xml.当然还有零配置文件的,可以尝试一下!
4.实体类也是非常简洁,这里使用了Lombok的插件,省去了许多的get set tostring 等等的方法,具体用法请参考这链接:https://www.jianshu.com/p/b7094a0f6ebe
5.一般使用hibernate会一个实体类对应一个实体映射文件,而使用注解后只需要给实体类加上相关注解即可,我觉得这个极为方便emmm
6.使用注解后会发现如果你对AOP和IOC不够理解的话,是很难去灵活运用注解,这样注解并不会让你的开发更高效
7.以上示例中缺少了部分工具类和相关前端代码,笔者将工具类分享在这儿,但是前端代码就按照自己的想法和喜欢的框架去构建吧.
链接:https://pan.baidu.com/s/1HMi2r6ZTHyBMny6n8tXiaQ
提取码:djej