SSH2集成之注解式开发

一.项目开发环境

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值