ssh框架整合

27 篇文章 0 订阅
7 篇文章 0 订阅

一:三大框架整合理论

1.spring与struts2整合就是将Action对象交给spring容器负责创建
2.spring与hibernate整合就是将sessionFactory交给spring来负责维护以及aop事务

二.导入包

1.新建ssh_crm工程
2.lib下面:
Hibernate包:hibernat-release-5.0.7.Final.lib.required下的全部jar//必须的包
hibernat-release-5.0.7.Final.lib.jpa下的jar//java persist api java的持久化规范(接口)hibernate-entitymanager-5.0.7.Final
数据库驱动:mysql-connector-java-5.1.7-bin.jar//数据库驱动
struts2包:struts-blank.war/WEB-INF/lib/*        //struts2空白案例下的所有包
注意:javassist.jar重复,删掉版本低的
struts2-spring-plugin-2.3.24.jar //struts2整合spring的插件包
导入这个包之后,struts2在启动时会去寻找spring容器,找不到就要报错,单独用struts2不要导入这个包
spring包:基本4+2//core,beans,context,expression,日志包:logging com.springsource.org.apache.commons.logging-1.1.1 ,log4j com.springsource.org.apache.log4j-1.2.15
整合web包:spring-web
整合aop:4个spring-aop,spring-aspect,aop联盟aopalliance,aopweaver 
整合jdbc事务:4个spring-jdbc,spring-tx,spring-orm,c3p0
整合junit测试:spring-test
标签库:jstl,standard两个标签库
42个包

三.单独整合spring到web项目

1.src下
新建applicationContext.xml
<beans></beans>
切换到设计视图,右键edit namespace,先导入一个xsi,再选中Specify new namespace分别导入四个context,tx,beans,aop命名空间
复制版本前面一段到name中,Beans的prefix是空的,其他都是name最后一段
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" 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-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
</beans>
 2.新建UserAction 包cn.itcast.web.action
 public class UserAction extends ActionSupport{

 }
 3.applicationContext.xml中
 <beans>
 .....
 <bean name="userAction" class="cn.itcast.web.action.UserAction">
 </bean> 
 
 </beans>
 4.web.xml中
 <!--让spring随着web启动而创建的监听器-->
 <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>
5.启动ssh_crm项目
四.单独整合struts2到web项目

 1.src中
 新建struts.xml
 导入约束
 找到struts-core.jar中的struts-2.3.dtd复制约束就搞定了
 <!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
 webcontent下新建success.jsp <body>哈哈</body>
 内容:
 <struts>
<package name="crm" namespace="/" extends="struts-default">
<action name="UserAction_*" class="cn.itcast.web.action.UserAction" method="{1}">
<result name="success" >/success.jsp</result>
</action>
</package>
 </struts>
 2.配置核心过滤器
 在web.xml中
 <!--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>
 3.启动项目

五.整合struts2与spring

1.配置常量
在struts.xml中配置常量
<!--struts.objectFactory = spring将action的创建交给spring容器-->
<constant name="struts.objectFactory" value="spring"></constant>
新建UserService接口 cn.itcast.service
public interface UserService{
User getUserByCodePassword(User u);
}
cn.itcast.domain中
User实体User.hbm.xml映射文件
UserServiceImpl cn.itcast.service.impl
implements UserService
System.out.println("getUserByCodePassword");
public class UserAction extends ActionSupport{
private UserService userService;

public void setUserService(UserService userService) {
this.userService = userService;
}
public void setUs(UserService userService){
this.userService = userService;
 
}
public String login() throws Exception{
System.out.println(userService);
return super.execute();
}
}


2.<!--整合方案2:class属性填写spring中action对象的BeanName完全由spring管理action生命周期,包括Action的创建,注意,需要手动组装依赖属性-->
<struts>
<package name="crm" namespace="/" extends="struts-default">
<action name="UserAction_*" class="userAction" method="{1}">
<result name="success">success.jsp</result>
</action>
</package>
</struts>
3.applicationContext.xml中
<!--action-->
<!--注意:Action对象作用范围一定是多例的,这样才符合struts2架构-->
<bean name="userAction" class="cn.itcast.web.action.UserAction" scope="prototype">
<property name="userService" ref="userService"></property>

</bean>
<!--service--> 
<bean name="userService" class="cn.itcast.service.impl.UserServiceImpl"></bean>
控制台打印userService对象就注入成功
六.单独配置hibernate

1.复制一个hibernate.cfg.xml过来
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>

<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库url -->
<property name="hibernate.connection.url">jdbc:mysql:///crm</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">123</property>
<!-- 数据库方言
注意: MYSQL在选择方言时,请选择最短的方言.
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>


<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
<property name="hibernate.format_sql">true</property>
<!-- 
自动导出表结构. 自动建表
-->
<property name="hibernate.hbm2ddl.auto">update</property>
 
<!-- 引入实体配置文件 -->
<mapping resource="cn/itcast/domain/Customer.hbm.xml" />
<mapping resource="cn/itcast/domain/LinkMan.hbm.xml" />
<mapping resource="cn/itcast/domain/User.hbm.xml" />

</session-factory>
</hibernate-configuration>




2.测试
cn.itcast.test 包中
package cn.itcast.test;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;


import cn.itcast.domain.User;


//测试hibernate框架
public class HibernateTest{
@Test
public void fun1(){
Configuration conf = new Configuration().configure();

SessionFactory sf = conf.buildSessionFactory();

Session session = sf.openSession();

Transaction tx = session.beginTransaction();

User u = new User();
u.setUser_code("tom");
u.setUser_name("汤姆");
u.setUser_password("1234");
session.save(u);

tx.commit();
session.close();
sf.close();
}

}




自己导入Customer,LinkMan实体和映射文件然后新建一个数据库,让hibernate帮我们创建三张表

七.整合hibernate与spring

1.原理
将sessionFactory对象交给spring容器管理
<!--将SessionFactory配置到spring容器中-->
applicationContext.xml




<!--将SessionFactory配置到spring容器中 -->
<bean name="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--配置hibernate基本信息 -->
<property name="hibernateProperties">
<!--必选配置 -->
<props>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql:///crm</prop>
<prop key="hibernate.connection.username">root</prop>
<prop key="hibernate.connection.password">123</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>




<!--可选配置 -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">
update
</prop>
</props>
</property>
<!--引入orm元数据,指定orm元数据所在的包路径,spring会自动读取包中的所有配置 -->
<property name="mappingDirectoryLocations" value="classpath:cn/itcast/domain">

</property>
</bean>
2.测试
//测试hibernate框架
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class HibernateTest{
@Resource(name="sessionFactory")
private SessionFactory sf; 
@Test
public void fun2(){

Session session = sf.openSession();

Transaction tx = session.beginTransaction();

User u = new User();
u.setUser_code("jack");
u.setUser_name("杰克");
u.setUser_password("1234");
session.save(u);
tx.commit();
session.close();
}

}

八.引入c3p0连接池

1.applicationContext.xml中
<!--读取db.properties文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置c3p0连接池-->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
2.注掉必选配置,方言别注掉
加上
<!--将连接池注入到sessionFactory,hibernate会通过连接池获得连接-->
<property name="dataSource" ref="dataSource" ></property>
3.db.properties中
jdbc.jdbcUrl=jdbc:mysql:///crm
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=123
 


九.HibernateTemplate模板操作数据库

1.创建cn.itcast.dao
 public interface UserDao{
//根据登录名称查询user 对象
User getByUserCode(String usercode);

 }
 2.cn.itcast.dao.impl
 //HibernateDaoSupport 为dao注入sessionFactory
 public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
public User getByUserCode(final String usercode) {
//HQL
return getHibernateTemplate().execute(new HibernateCallback<User>(){
public User doInHibernate(Session session)throws HibernateException{
String hql = "from User where user_code = ?";
Query query = session.createQuery(hql);
query.setParameter(0,usercode);
User user = (User) query.uniqueResult();
return user;
}


});
//Criteria
DetachedCriter dc = DetachedCriteria.forClass(User.class);

dc.add(Restrictions.eq("user_code",usercode));

List<User> list = (List<User>) getHibernateTemplate().findByCriteria(dc);

if(list != null && list.size()>0){
return list.get(0);

}else{
return null;
}

}




 }
 3.applicationContext中配置dao
 <!--dao-->
 
 <bean name="userDao" class="cn.itcast.dao.impl.UserDaoImpl">
<!--注入sessionFactory-->
<property name="sessionFactory" ref="sessionFactory" ></property>
 </bean>
4.测试
hibernateTest中
package cn.itcast.test;


import javax.annotation.Resource;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;


//测试hibernate框架
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class HibernateTest{
@Test
public void fun1(){
Configuration conf = new Configuration().configure();

SessionFactory sf = conf.buildSessionFactory();

Session session = sf.openSession();

Transaction tx = session.beginTransaction();

User u = new User();
u.setUser_code("tom");
u.setUser_name("汤姆");
u.setUser_password("1234");
session.save(u);

tx.commit();
session.close();
sf.close();
}
@Resource(name="sessionFactory")
private SessionFactory sf; 
@Test
public void fun2(){

Session session = sf.openSession();

Transaction tx = session.beginTransaction();

User u = new User();
u.setUser_code("jack");
u.setUser_name("杰克");
u.setUser_password("1234");
session.save(u);
tx.commit();
session.close();
}

@Resource(name="userDao")
private UserDao ud;
@Test
//测试Dao Hibernate模板
public void fun3(){
User u = ud.getByUserCode("tom");
System.out.println(u);
//User中加toString()方法

}

}

十.整合aop事务

1.xml配置aop事务
applicationContext中


<!-- 核心事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" >
<property name="sessionFactory" ref="sessionFactory" ></property>
</bean>

<!-- 配置通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager" >
<tx:attributes>
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 配置将通知织入目标对象
配置切点
配置切面 -->
<aop:config>
<aop:pointcut expression="execution(* cn.itcast.service.impl.*ServiceImpl.*(..))" id="txPc"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" />
</aop:config>


2.注解配置事务
先把xml配置事务的代码注掉applicationContext中
<!--开启注解事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>


在UserServiceImpl中
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
public class UserServiceImpl implements UserService{
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
public void saveUser(User u){
ud.save(u);
}
}
//在下面测试方法中改一下
u.setUser_code("hqy");
u.setUser_name("郝强勇");
u.setUser_password("1234");




3.测试
UserService中
//注册用户
void saveUser(User u);
UserServiceImpl中实现
private UserDao ud;
生成setter方法
@Override
public void saveUser(User u){
ud.save(u);
}
//在applicationContext中注入UserDao
<bean name="userService"...
<property name="ud" ref="userDao"></property>
</bean>
//在UserDao中
//保存用户
void save(User u);
//在UserDaoImpl中实现
@Override
public void save(User u){
getHibernateTemplate().save(u);
}
HibernateTest中
@Test
//测试aop事务
@Resource(name="userService")
private UserService us;
@Test
public void fun4(){
User u = new User();
u.setUser_code("rose");
u.setUser_name("肉丝");
u.setUser_password("1234");

us.saveUser(u);


}

十一.扩大session作用范围

1.为了避免使用懒加载时出现no-session问题,需要扩大session的作用范围
2.配置filter
<!--扩大session作用范围
注意:任何filter一定要在struts的filter之前调用-->


<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>

十二.练习客户登陆

1.UserAction中
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
private UserService userService;
public void setUserService(UserService userService){
this.userService = userService;

}

public String login() throws Exception{
//1.调用Service执行登录逻辑
User u = userService.getUserByCodePassword(user);
//2.将返回的User对象放入session域
ActionContext.getContext().getSession().put("user",u);
//3.重定向到项目首页
return "toHome";
}
@Override
public User getModel(){
return user;
}


}
在struts.xml中
<action name="UserAction_*" ...
//导入页面
<result name="toHome" type="redirect">/index.htm</result>
</action>


2.UserServiceImpl中
@Override
public User getUserByCodePassword(User u){
//1.根据登录名称查询登录用户
User existU = ud.getByUserCode(u.getUser_code());
//2.判断用户是否存在,不存在,抛出异常,提示用户名不存在
if(existU==null){

throw new RuntimeException("用户名不存在");
}
//3.判断用户密码是否正确,不正确抛出异常提示密码错误
if(!existU.getUser_password().equals(u.getUser_password())){
throw new RuntimeException("密码错误");

}
//4.返回查询到的用户对象
return existU;
}


//在struts.xml中配置异常信息处理
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
</global-exception-mappings>
在<action name="UserAction_*"中
<result name="error" >/login.jsp</result>
3.运行客户登陆









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值