经过几天的奋战,终于将Hibernate4+Spring4+Struts2整合成功了。一路走来艰辛艰辛啊,尤其是jar包,我是一个一个的试的,差点把我整死了。本解决方法针对xml配置,非注解,注解的话需要加入注解包,下面我提供包的可能已经包括注解包了,提供的方法中也有注解的配置。
本实例,Hibernate为模型层,Spring为控制层,Struts2为表现层
写在开始:
本方法的目录结构如下:
[caption id="attachment_363" align="alignnone" width="335"]
目录结构[/caption]
1,先说说版本:
hibernate-core-4.3.9.Final.jar
spring-core-4.1.6.RELEASE.jar
struts2-core-2.3.24.jar
均为当前最新版本
2,整合方法,为了节约您的时间,我将ssh所需要的jar包已经打包,并上传到百度云盘,下面提供下载下载。
3,配置文件:
a,hibernate的映射配置文件我在这里就不说了
b,先看applicationContext.xml
这个配置文件,定义了Spring与Hibernate整合的一些配置,以及后期的action的一些配置也在里面
下面贴上全部代码以及注释:
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd"
>
<!-- 加载数据库连接配置信息,配置信息都下在了文件jdbc.properties里面-->
<bean id="DBconfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<!-- calss是DataSource实现类 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="url" value="${jdbc.url}" />
<property name="driverClassName" value="${jdbc.driver}" />
</bean>
<!-- 这里开始就实现了与Hibernate的整合 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<!-- 连接数据源(注入dataSource) -->
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<!-- 配置数据库方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<!-- sql语句显示 -->
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<!-- 配置ORM(XML文件)映射文件 -->
<property name="mappingResources">
<list>
<value>emb/model/hibernate/po/userloginpo.hbm.xml</value>
</list>
</property>
<!-- 配置注解的实体类
<property name="annotatedClasses">
<value>his.hib.po.userloginpo</value>
</property>
-->
</bean>
<bean id="hibernateUtil"
class="emb.model.hibernate.util.HibernateUtil">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userimpl" class="emb.controller.spring.beanDaoFactoryORImpl.userImpl" />
<!-- 此处为配置action 第一个name是名字,第二个name是该action中的属性(接口)以及属性对应的实现类 -->
<bean name="okuserpass" class="emb.view.struts.action.Login">
<property name="iuser">
<ref bean="userimpl" />
</property>
</bean>
</beans>
后面三个bean,第一个是注入sessionfactory,第二个是创建userimpl实体类的bean,第三个bean配置的是action
此文件的配置信息 大家可以参考我之前写的一篇文章
https://www.bugkong.com/archives/2015_06_350.html
c,struts.xml里面主要注意两处,第一,加入<constant name="struts.objectFactory" value="spring" />
第二,在配置action时的struts.xml,其class不使用类的全路劲,而使用我们在applicationContext.xml里面配置的bean,以下为全部的代码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" /> <!-- 中文乱码,设置编码格式为gbk --> <constant name="struts.i18n.encoding" value="gbk" /> <package name="struts2" extends="struts-default"> <!-- 定义全局结果 --> <global-results> <result name="login" type="redirect">login.jsp</result> </global-results> <!-- 此处class为spring中配置的beanid --> <action name="login" class="okuserpass"> <result>login_success.jsp</result> <result name="input">login_error.jsp</result> </action> </package> </struts>
d,web.xml配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd"> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLScbema-instance" xsi:xchemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置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> <!-- 配置Spring信息 --> <context-param> <param-name> contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> <welcome-file-list> <welcome-file>Login.jsp</welcome-file> </welcome-file-list> </web-app>
4,类的配置
a,模型层:实体类以及 映射文件我们就不说了,主要说说hibernate的工具类应该怎么写,我们把以前写的删掉,重新写。
大家看上面applicationContext.xml里面有段代码是这么写的
<bean id="hibernateUtil"
class="emb.model.hibernate.util.HibernateUtil">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
因此我们看看hibernate工具类怎么写的
public class HibernateUtil {
private static HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
hibernateTemplate = new HibernateTemplate(sessionFactory);
}
public HibernateTemplate getSessionFactory() {
System.out.println("我在HibernateUtil");
return hibernateTemplate;
}
}
以上代码我们定义了sessionFactory的一个set方法,这个方法需要一个SessionFactory的一个参数,而这个参数正是由上面的配置文件中注入进来的。注入的sessionFactory是由配置文件定义好了的。
好了,在hibernate就只需要一个工具类就行了,至于目录中提到的其他包,大家不用管,那我是额外写的其他东西
b,控制层:现在我们看看Spring的emb.controller.spring.beanDaoFactoryORImpl这个包,这个包我主要放接口的实现类,或其他类
而emb.controller.spring.IbeanDaoFactory这个包主要放接口
接口类Iuser,只有一个类:
public interface Iuser {
public boolean userlogin(String username,String userpass); //判断用户密码
}
实现类userImpl,继承了接口。实现了判断用户名和密码是否正确的方法,本实例不讨论其他的哈:
静态块用于初始化。方法中的查询用了hibernateTemplate的find方法。这里和hibernate有点区别。大家注意。
userloginpo这个是hibernate的po层的映射类
public class userImpl implements Iuser{
private static HibernateTemplate hibernateTemplate;
static
{
@SuppressWarnings("resource")
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HibernateUtil hibernateutil = (HibernateUtil) context.getBean("hibernateUtil");
hibernateTemplate = hibernateutil.getSessionFactory();
}
@Override
public boolean userlogin(String username, String userpass) {
Iterator it = null;
List list = null;
userloginpo ulp = null;
String hql = "from userloginpo U where U.username=? and userpass=?";
Object[] values = {username,userpass};
list = hibernateTemplate.find(hql, values);
if((null == list) || (list.size() ==0)){
System.out.println("登录失败了哦");
return false;
}else{
it = list.iterator();
while(it.hasNext()){
ulp = (userloginpo) it.next();
}
System.out.println("登录成功");
System.out.println("用户名是"+ulp.getUsername());
return true;
}
}
}
c,表现层:接下来我们看看表现层的action写法
public class Login extends ActionSupport{
{
System.out.println("我在Login");
}
private Iuser iuser;
private String username;
private String password;
public Iuser getIuser() {
return iuser;
}
public void setIuser(Iuser iuser) {
this.iuser = iuser;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception{
if(iuser.userlogin(username, password)){
return "success";
}else{
return "input";
}
}
上面的代码,我大概解释下,在applicatinContext里面已经配置了此action,并且已经将这个action的属性(一个接口)的实现类已经注入进来了。因此我们在execute方法里才能如此写。
5,自此,我们的配置就完成了,写一个jsp页面进行测试吧:
<body> <div class="login_center"> <div class="pleaseLogin">请登录</div> <div> <!-- theme的值为 xhtml,html,simple,ajax 没有simple这个属性,标签会换行 --> <ss:form theme="simple" action="login"> 姓名:<ss:textfield name="username" /> <br /> 密码:<ss:password name="password" /> <br /> <!-- 隐藏域 --> <!-- 防止重复提交 --> <ss:token /> <ss:submit value="提交" /> <ss:reset value="重置" /> </ss:form> </div> </div> </body>
再写个登录成功和登录失败的页面哦login_success.jsp login_error.jsp
全部的jar下载 该jar已更新到最新。
本文为仓促中写完的,如果有疑问,感谢您留言反馈
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情