基于Annotation注解整合SSH框架和基于XML文件配置Bean整合SSH框
1.新建一个动态web工程添加jar包
2.在com.digital.entity包下创建实体类UserInfo与数据中digital数据表user_Info对应 创建映射UserInfo.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.digital.entity">
<class name="UserInfo" table="user_info" catalog="digital">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="userName" type="java.lang.String">
<column name="userName" length="16" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="16" not-null="true" />
</property>
</class>
</hibernate-mapping>
使用Annotation完成UserInfo实体类与数据表的映射关系
@Entity
@Table(name = "user_info", catalog = "digital")
public class UserInfo {
对类中的属性进行映射 -主键属性
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public int getId() {
对非主属性
@Column(name = "userName", length = 16)
public String getUserName() {
return userName;
使用注解类后,就不在需要UserInfo.hbx.xml映射文件删除
—————————————————————————————————————————————————————————
3.Spring整合hibernate
目的
- -由Spring的IOC容器来管理Hibernate的SessionFactory
- 让Hibernate使用Spring的声明式事务
实现:
- 在src文件下创建Spring配置文件applicationContextxml
- 基于xml配置数据源dataSource
- 配置hibernate的sessionFactory实例
声明hibernate事务管理器、定义事务通知、定义切面、将事务通知和切面组合起来
—————————————————————————————————————————————————————————
4.配置applicationContext.xml文件
- 先加入头部声明文件、命名空间
并且将各个命名空间关联到项目里
- 加入c3p0数据源(实例化数据源)
<!-- 配置数据源 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql:///digital" />
<property name="user" value="root" />
<property name="password" value="123456" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="10" />
</bean>
配置Hibernate的SessionFactory(引用ref bean注入数据源dataSource、设置Hibernate基本属性,配置方言mysql,实例化SessionFactory)
- 在jar文件中寻找class的类文件
- 定义SessionFactory 的id Bean从jar包内引用类orm.hibernate5.LocalSessionFactoryBean配置hibernate的SessionFactory实例
- applicationcontext文件中为SessionFactory中name=“dataSource”属性注入数据源、
- 为SeesionFactory中基本属性name=“hibernateProperties”配置Hibernate基本属性方言、
<!-- 配置Hibernate的sessionFactory实例 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 配置数据源属性 -->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- 配置 Hibernate的基本属性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
- 配置Hibernate的映射文件的位置名称(引用注入UserInfo.hbx.xml)
<!-- 配置 Hibernate映射文件的位置及名称-->
<property name="mappingResources">
<list>
<value>com/digital/entity/UserInfo.hbm.xml</value>
</list>
</property>
</bean>
- 定义Hibernate事务管理器Bean(为TransactionManager事务管理器属性name=“SessionFactory”引用ref= SessionFactory实例,注入事务管理器中)
<!-- 声明Hibernate事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
声明式事务管理也有两种常用的方式
- 基于tx和aop名字空间的xml配置文件
- 基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。
基于annotation的配置(后面在applicacontext文件中添加的内容都删除)
- 开启注释处理器
<!-- 开启注解处理器 -->
<context:annotation-config />
- 基于@Transactional注解方式的事务管理
<!-- 开启Spring的Bean自动扫描机制来检查与管理Bean实例 -->
<context:component-scan base-package="com.digital" />
- 开启自动扫描机制检查与管理Bean实例
<tx:annotation-driven transaction-manager="transactionManager" />
简单的介绍事务的规则(传播行为)
常用required
Required
Support
Never
事务的管理主要任务:创建回滚提交事务 是否需要创建事务及如何创建事务有事务的传播行为控制
—————————————————————————————————————————————————————————
基于tx和aop名字空间的xml配置文件
- 定义数据通知,事务管理(将事务通知交给事务管理器处理,指定事务传播规则)
<!-- 定义事务通知 ,需要事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 指定事务传播规则 -->
<tx:attributes>
<!-- 对所有方法应用REQUIRED事务规则 -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
- 定义切面,并将事务通知和切面组合(定义那些方法应用那些规则)
<!--定义切面,并将事务通知和切面组合(定义哪些方法应用事务规则) -->
<aop:config>
<!-- 对com.digital.service包下的所有类的所有方法都应用事务规则 -->
<aop:pointcut id="serviceMethods" expression="execution(* com.digital.service.*.*(..))" />
<!-- 将事务通知和切面组合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
—————————————————————————————————————————————————————————
5.DAO层的开发
public interface UserInfoDAO {
public List<UserInfo> search(UserInfo cond);
}
- 调用注入的Session,进行增删改查数据库操作
public class UserInfoDAOImpl implements UserInfoDAO {
SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
- 定义UserInfoDAOImpl类的Bean并且类中的属性name=sessionFactory 注入实例ref=SessionFactory
<!-- 定义com.digital.dao.impl.UserInfoDAOImpl类-->
<bean id="userInfoDAO" class="com.digital.dao.impl.UserInfoDAOImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
- 使用注解@Repository(”userInfoDAO”)在Spring容器中注册一个userInfoDAO实例
@Repository("userInfoDAO")
public class UserInfoDAOImpl implements UserInfoDAO {
- 使用注解@Autowired完成SessionFactory属性的注入
// 通过@Autowired注解注入Spring容器中的SessionFactory实例
@Autowired
SessionFactory sessionFactory;
—————————————————————————————————————————————————————————
6.Service层的开发
- UserInfoService类
public interface UserInfoService {
public List<UserInfo> login(UserInfo cond);
}
- 在UserInfoServiceImpl中userInfoDAO属性对象注入UserInfoDAO对象实例
public class UserInfoServiceImpl implements UserInfoService {
UserInfoDAO userInfoDAO;
public void setUserInfoDAO(UserInfoDAO userInfoDAO) {
this.userInfoDAO = userInfoDAO;
}
- 定义Bean为在UserInfoServiceImpl类中的属性name=”userInfoDAO“注入ref=“userInfoDAO”实例
<!-- 定义UserInfoServiceImpl类,并为其userInfoDAO属性注入值-->
<bean id="userInfoService" class="com.digital.service.impl.UserInfoServiceImpl">
<property name="userInfoDAO" ref="userInfoDAO" />
</bean>
- 使用@Service注解:在Service服务层实例化UserInfoServiceImpl类放入Spring容器中
@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {
- 使用@Transactional实现事务管理(通过注解@Transactional的不同参数满足事务的不用事务要求)
//使用@Transactional注解实现事务管理
@Transactional
//使用@Service注解在Spring容器中注册名为userInfoService的UserInfoServiceImpl实例
@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {
- 使用@Autowired实现userInfoDAO的实例注入
//使用@Transactional注解实现事务管理
@Transactional
//使用@Service注解在Spring容器中注册名为userInfoService的UserInfoServiceImpl实例
@Service("userInfoService")
public class UserInfoServiceImpl implements UserInfoService {
//使用@Autowired注解注入UserInfoDAOImpl实例
@Autowired
UserInfoDAO userInfoDAO;
—————————————————————————————————————————————————————————
7.Action层的开发
public class UserInfoAction extends ActionSupport {
UserInfo ui;
public UserInfo getUi() {
return ui;
}
public void setUi(UserInfo ui) {
this.ui = ui;
}
UserInfoService userInfoService;
public void setUserInfoService(UserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
public String doLogin() throws Exception {
List<UserInfo> uiList = userInfoService.login(ui);
if (uiList.size() > 0) {
// 登录成功,转发到到index.jsp
return "index";
} else {
// 登录失败,重定向到login.jsp
return "login";
}
}
- 在Spring配置文件中配置Action实例(在UsuerInfoAction类中属性userInfoService需要注入实例,设置原型模式scope=“prototype”每一个请求都注入新的
)
<!-- 定义UserInfoAction类 ,并为其中属性userInfoService注入值 -->
<bean name="uiAction" class="com.digital.action.UserInfoAction" scope="prototype">
<property name="userInfoService" ref="userInfoService" />
</bean>
- 在项目stc中目录创建struts2的配置文件struts.xml
- class=“uiAction”为页面提交的action提交到Spring 中的方法uiAction,并注入Bean实例
- method=“doLogin”为页面提交的action提交到UserInfoAction类中doLogin方法响应
<struts>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<!-- 定义一个名称为digital的包,继承struts 2的默认包,指定命名空间为"/" -->
<package name="digital" namespace="/" extends="struts-default">
<!-- 为类中的方法配置映射 -->
<action name="doLogin" class="uiAction" method="doLogin">
- 为UserInfoAction类doLogin方法返回的结果响应到指定跳转的页面
<result name="index" type="dispatcher">index.jsp</result>
<result name="login" type="redirect">login.jsp</result>
</action>
</package>
</struts>
- 使用@controller:在容器中对UserInfoAction类实例化 使用
- @scope(”prototype”):指定原型模式
//使用@Controller注解在Spring容器中注册UserInfoAction实例
//使用@Scope("prototype")指定原型模式
@Controller
@Scope("prototype")
public class UserInfoAction extends ActionSupport {
UserInfo ui;
使用@Autowired:对userInfoService注入实例化对象
// 使用@Autowired注解注入UserInfoServiceImpl实例
@Autowired
UserInfoService userInfoService;
- 使用@Action注解:ACTION中下的一个方法doLogin方法,通过改变value值响应多个不同的URL.
- @Result中name值根据不同的type值 跳转到不同的location本地页面
@Action(value=”/doLogin”,results={
@Result(name=”index”,type=”dispatcher”,location=”/index.jsp”),
@Result(name=”login”,type=”redirect”,location=”/login.jsp”)})
public String doLogin()throws Exception
{
List<UserInfo> uiList = userInfoService.login(ui);
if(uiList.size()>0)
{
return "index";
}
else
return "login";
}
—————————————————————————————————————————————————————————
8.Spring整合Struts2
目的:
- 使用SpringIOC容器管理Struts2的Action
步骤:
- 在web.xml配置文件中制定以Lisetener的方式启动Spring,
并配置Struts2的StrutsPrepareAndExecuteFilter
实现步骤
指定Listerner方式启动Spring
监听类的导入
<!-- 指定以Listerner方式启动Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- 指定Spring的上下文配置文件applicationContext
<!-- 指定Spring配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
- 配置struts2的核心控制器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 整个web.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<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>digital-1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 指定以Listerner方式启动Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定Spring配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
—————————————————————————————————————————————————————————
9.Struts文件配置 头部声明
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
- Anction访问的Spring的bean实例(class=uiAction),完成Action类里面属性的配置
<struts>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<!-- 定义一个名称为digital的包,继承struts 2的默认包struts-default,指定命名空间为"/" -->
<package name="digital" namespace="/" extends="struts-default">
<!-- 为类中的方法配置映射 -->
<action name="doLogin" class="uiAction" method="doLogin">
<result name="index" type="dispatcher">index.jsp</result>
<result name="login" type="redirect">login.jsp</result>
</action>
</package>
</struts>
- 基于annotation配置修改struts配置文件
因为使用@anction注解已经完成上述内容,所以struts配置文件中上述内容不需要可以删除
@Action(value=”/doLogin”,results={
@Result(name=”index”,type=”dispatcher”,location=”/index.jsp”),
@Result(name=”login”,type=”redirect”,location=”/login.jsp”)})