var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20738293-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script')"/>
jutleo
欢迎走进有风的地方~~
posts - 63,  comments - 279,  trackbacks - 0

Spring2.5.3+Hibernate3.2+Struts2.0.11整合

 

 

只有Struts2基础(初学Hibernate/Spring第三天就想着整合),有些地方不是很懂,看了网上大部分的例子、blog,百分百的MyEclipse插件,本人不太习惯使用MyEclipse,主要是Eclipse使用的时间比较长,使用MyEclipse6.0.1时(第一次用)比如你要输入.getHibernateTemplate()时,输入点时就有提示,但是当我输入点后面的字母出错时,只能返回到输入点之前才按点“.”可以提示,按ALT+/也不会出现,是不是我不知道快捷键,或是其它的方式,总之我在Eclipse中输入一半错误时按ALT+/可以又出来提示,虽然不是特依赖提示功能,但是用起来还是不爽,毕竟每天都在使用它,哪位要是知道的话烦请告诉一声bulktree@126.com

仅仅看了两天的官方文档就写了这个整合的新闻发布系统,感觉蛮好的,是个好的开始 come on!


以下是一个新闻发布系统的登录模块:(两天看文档,一夜写成的,不是很完善,仅仅实现基本的增删查改功能,主要是整合练习)


首先配置三个框架,有人说要是使用MyEclipse自动生成会有顺序Spring->Hibernate->Struts,太依赖工具不是本人的习惯,这些是后话。
开发工具Eclipse J2EE Developer Tomcat6.0.13 Mysql 6.0
新建Dynamic Web Project

拷贝工程所需的jar包到WEB-INF/lib

数据库创建脚本

DROPTABLE context;

CREATETABLE context

(

    id VARCHAR(32) NOTNULLPRIMARYKEY,

    title VARCHAR(100),

    times DATETIME,

    content VARCHAR(500),

    author VARCHAR(50),

    click INT,

    typeVARCHAR(50)

);

DROPTABLEuser;

CREATETABLEuser

(

    uid VARCHAR(50) NOTNULLPRIMARYKEY,

    uname VARCHAR(50),

    password VARCHAR(50) NOTNULL

);

web.xml中配置Struts2Spring

<filter>

       <filter-name>Struts2</filter-name>

       <filter-class>

           org.apache.struts2.dispatcher.FilterDispatcher

       </filter-class>

    </filter>

    <filter>

       <filter-name>encodingFilter</filter-name>

       <filter-class>

           org.springframework.web.filter.CharacterEncodingFilter

       </filter-class>

       <init-param>

           <param-name>encodingFilter</param-name>

           <param-value>UTF-8</param-value>

       </init-param>

    </filter>

    <filter-mapping>

       <filter-name>Struts2</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    <listener>

       <listener-class>

           org.springframework.web.context.ContextLoaderListener

       </listener-class>

    </listener>

项目中我使用的是Tomcat数据源配置如下,如果你不使用Tomcat数据源也可以在下面的配置文件中配置:

<Context docBase="news-SSH2" path="/news-SSH2" reloadable="true" source="org.eclipse.jst.jee.server:news-SSH2">

              <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/news" password="1234" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/news?autoReconnect=true" username="root"/>

           </Context>

也在在配置applicationContext.xml文件中配置数据源

<!-- 定义数据源Bean,使用C3P0数据源实现 -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

       <!-- 指定连接数据库的驱动 -->

       <property name="driverClass" value="com.mysql.jdbc.Driver"/>

       <!-- 指定连接数据库的URL -->

       <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/news"/>

       <!-- 指定连接数据库的用户名 -->

       <property name="user" value="root"/>

       <!-- 指定连接数据库的密码 -->

       <property name="password" value="1234"/>

       <!-- 指定连接数据库连接池的最大连接数 -->

       <property name="maxPoolSize" value="20"/>

       <!-- 指定连接数据库连接池的最小连接数 -->

       <property name="minPoolSize" value="1"/>

       <!-- 指定连接数据库连接池的初始化连接数 -->

       <property name="initialPoolSize" value="1"/>

       <!-- 指定连接数据库连接池的连接的最大空闲时间 -->

       <property name="maxIdleTime" value="20"/>

   </bean>

applicationContext.xml中配置sessionFactory

<bean id="dataSource"

        class="org.springframework.jndi.JndiObjectFactoryBean">

       <property name="jndiName" value="java:comp/env/jdbc/news"></property>

    </bean>

    <!-- 管理Hibernate -->

    <bean id="sessionFactory"

        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

       <property name="dataSource" ref="dataSource"></property>

       <property name="mappingResources">

           <list>

              <value>org/bulktree/ssh2/news/vo/User.hbm.xml</value>

              <value>org/bulktree/ssh2/news/vo/News.hbm.xml</value>

           </list>

       </property>

       <property name="hibernateProperties">

           <value>

              hibernate.dialect=org.hibernate.dialect.MySQLDialect

           </value>

       </property>

    </bean>


3.
开始编码:
我们必须明确Spring框架的体系结构,新建以下几个包

User.java

package org.bulktree.ssh2.news.vo;

publicclass User {

    private String uid;

    private String uname;

    private String password;

    public String getUid() {

       returnuid;

    }

    Getter/setter’’’’’’’’’’’

    publicvoid setPassword(String password) {

       this.password = password;

    }

}

User类同包下即org.bulktree.ssh2.news.vo新建User.hbm.xml文件

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.bulktree.ssh2.news.vo">

 <class name="User" table="user">

 <id column="uid" name="uid" type="string">

   <generator class="assigned"/>

 </id>

 <property column="uname" name="uname" type="string"/>

 <property column="password" name="password" type="string"/>

 </class>

</hibernate-mapping>

新建UserDao.java接口

package org.bulktree.ssh2.news.dao;

import java.util.List;

import org.bulktree.ssh2.news.vo.User;

publicinterface UserDao {

    /**

     *增加一个用户

     *@throwsException

     */

    publicvoid addUser(User user) throws Exception;

    /**

     *根据uid/password查询User

     *@paramuid

     *@parampassword

     *@return

     *@throwsException

     */

    public User queryByUidAndPassword(String uid, String password) throws Exception;

    /**

     *删除用户

     *@paramuid

     *@throwsException

     */

    publicvoid delete(String uid) throws Exception;

    /**

     *查询全部用户

     *@returnList

     *@throwsException

     */

    public List<User> queryAll() throws Exception;

}



UserDaoImpl.java接口实现类

package org.bulktree.ssh2.news.dao.impl;

import java.util.List;

import org.bulktree.ssh2.news.dao.UserDao;

import org.bulktree.ssh2.news.vo.User;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**

 * 继承HibernateDaoSuppor类实现getHibernateTemplate()

 *

 * @author bulktree

 *

 */

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    @Override

    public void addUser(User user) throws Exception {

       this.getHibernateTemplate().save(user);

    }

    @Override

    public void delete(String uid) throws Exception {

       // TODO Auto-generated method stub

    }

    @Override

    public List<User> queryAll() throws Exception {

       // TODO Auto-generated method stub

       return null;

    }

    @Override

    public User queryByUidAndPassword(String uid, String password)

           throws Exception {

       String hql = "FROM User as u WHERE u.uid=? and u.password=?";

       String[] str = new String[] { uid, password };

       List<User> users = this.getHibernateTemplate().find(hql, str);

       if (users != null && users.size() >= 1) {

           return users.get(0);

       } else {

           return null;

       }

    }

}

Service层,新建一UserService.java接口

package org.bulktree.ssh2.news.service;

publicinterface UserService {

    /**

     *添加一个用户

     *@paramuid

     *@paramuname

     *@parampassword

     *@return新增用户的uid

     *@throwsException

     */

    public String addUser(String uid, String uname, String password) throws Exception;

    /**

     *验证登录

     *@paramuid

     *@parampassword

     *@returnuid

     *@throwsException

     */

    public String isLogin(String uid, String password) throws Exception;

}

接口实现类

package org.bulktree.ssh2.news.service.impl;

import org.bulktree.ssh2.news.dao.UserDao;

import org.bulktree.ssh2.news.service.UserService;

import org.bulktree.ssh2.news.vo.User;

/**

 * UserService实现类

 *

 * @author bulktree

 *

 */

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {

       this.userDao = userDao;

    }

    @Override

    public String addUser(String uid, String uname, String password)

           throws Exception {

       User user = new User();

       user.setUid(uid);

       user.setUname(uname);

       user.setPassword(password);

       userDao.addUser(user);

       return user.getUid();

    }

    @Override

    public String isLogin(String uid, String password) throws Exception {

       User user = userDao.queryByUidAndPassword(uid, password);

       if(user != null) {

           return user.getUname();

       } else {

           return null;

       }

    }

}

最后我们新建一ActionLoginAction.java

package org.bulktree.ssh2.news.action;

import java.util.Map;

import org.bulktree.ssh2.news.service.UserService;

import org.bulktree.ssh2.news.vo.User;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**

 * 登录Action

 * @author bulktree

 *

 */

public class LoginAction extends ActionSupport {

    private User user;

    private UserService userService;

    public User getUser() {

       return user;

    }

    public void setUser(User user) {

       this.user = user;

    }

    public UserService getUserService() {

       return userService;

    }

    public void setUserService(UserService userService) {

       this.userService = userService;

    }

    @Override

    public String execute() throws Exception {

       if (isInvalid(user.getUid())) {

           this.addFieldError("uid", "登录ID不能为空");

           return INPUT;

       }

       if (isInvalid(user.getPassword())) {

           this.addFieldError("password", "密码项不能为空");

           return INPUT;

       }

      

       String uname = userService.isLogin(user.getUid(), user.getPassword());

       if (uname != null) {

           Map session = ActionContext.getContext().getSession();

           session.put("uname", uname);

           session.put("uid", user.getUid());

           return SUCCESS;

       } else {

           this.addFieldError("idorpassword", "登录ID或密码错误");

           return INPUT;

       }

    }

    private boolean isInvalid(String value) {

       return (value == null || value.length() == 0);

    }

}

下来就是login.jsp页面文件了

<center>

    <div style="color: red"><s:fielderror /><s:actionmessage /></div>

<s:form action="login" method="post">

    <s:textfield name="user.uid" label="UID" tooltip="ENTER YOUR UID" />

    <s:password name="user.password" label="PASSWORD"

       tooltip="ENTER YOUR PASSWORD" />

    <s:submit></s:submit>

   

</s:form>

<s:a href="regist.jsp">REGIST NEW COUNT</s:a></center>

下来就是applicationContext.xml文件的配置

<bean id="userdao" class="org.bulktree.ssh2.news.dao.impl.UserDaoImpl">

       <property name="sessionFactory">

           <ref bean="sessionFactory"/>

       </property>

    </bean>

   

    <!-- bean配置 -->

    <bean id="newsdao" class="org.bulktree.ssh2.news.dao.impl.NewsDaoImpl">

       <property name="sessionFactory">

           <ref bean="sessionFactory"/>

       </property>

    </bean>

    <bean id="loginAction" class="org.bulktree.ssh2.news.action.LoginAction">

       <property name="userService">

           <ref bean="userservice"/>

       </property>

    </bean>

   

        </bean>

·beanid属性就是对应类class的实例

·property元素的name属性为beanclass属性对应类的属性名,

·ref为引用bean,引用的是beanid

Struts.xml文件完整配置

<?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.i18n.encoding" value="UTF-8" />

    <package name="SSH2" extends="struts-default">

       <action name="login" class="loginAction">

           <result>/addNews.jsp</result>

           <result name="input">/login.jsp</result>

       </action>

      

       <action name="regist" class="registAction">

           <result>/login.jsp</result>

           <result name="input">/regist.jsp</result>

       </action>

      

       <action name="listall" class="listallAction">

           <result>/newsList.jsp</result>

           <result name="input">/addNews.jsp</result>

       </action>

      

       <action name="notice" class="noticeAction">

           <result type="redirect-action">listall</result>

           <result name="input">/addNews.jsp</result>

       </action>

    </package>

   

</struts>

·form表单的action对应struts.xml文件中的actionname属性,由于StrustSpring管理,struts.xml文件中的action元素class属性对应的是applicationContext.xml文件中bean元素id属性

最后贴上完整的applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <!-- 使用JNDI数据源 -->

    <bean id="dataSource"

       class="org.springframework.jndi.JndiObjectFactoryBean">

       <property name="jndiName" value="java:comp/env/jdbc/news"></property>

    </bean>

    <!-- 管理Hibernate -->

    <bean id="sessionFactory"

        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

       <property name="dataSource" ref="dataSource"></property>

       <property name="mappingResources">

           <list>

              <value>org/bulktree/ssh2/news/vo/User.hbm.xml</value>

              <value>org/bulktree/ssh2/news/vo/News.hbm.xml</value>

           </list>

       </property>

       <property name="hibernateProperties">

           <value>

              hibernate.dialect=org.hibernate.dialect.MySQLDialect

           </value>

       </property>

    </bean>

   

    <bean id="userdao" class="org.bulktree.ssh2.news.dao.impl.UserDaoImpl">

       <property name="sessionFactory">

           <ref bean="sessionFactory"/>

       </property>

    </bean>

   

    <!-- bean配置 -->

    <bean id="newsdao" class="org.bulktree.ssh2.news.dao.impl.NewsDaoImpl">

       <property name="sessionFactory">

           <ref bean="sessionFactory"/>

       </property>

    </bean>

    <bean id="userservice" class="org.bulktree.ssh2.news.service.impl.UserServiceImpl">

       <property name="userDao">

           <ref bean="userdao"/>

       </property>

    </bean>

   

    <bean id="newservice" class="org.bulktree.ssh2.news.service.impl.NewsServiceImpl">

       <property name="newsDao">

           <ref bean="newsdao"/>

       </property>

    </bean>

   

    <bean id="loginAction" class="org.bulktree.ssh2.news.action.LoginAction">

       <property name="userService">

           <ref bean="userservice"/>

       </property>

    </bean>

   

    <bean id="registAction" class="org.bulktree.ssh2.news.action.RegistAction">

       <property name="userService">

           <ref bean="userservice"/>

       </property>

    </bean>

    <bean id="noticeAction" class="org.bulktree.ssh2.news.action.NoticeNewsAction">

       <property name="newsService">

           <ref bean="newservice"/>

       </property>

    </bean>

   

    <bean id="listallAction" class="org.bulktree.ssh2.news.action.QueryAllNews">

       <property name="newsDao">

           <ref bean="newsdao"/>

       </property>

    </bean>

</beans>

·applicationContext.xml文件默认加载路径classpath下,也就是WEB-INF

·整个工程没有用到hibernate.cfg.xml文件,Spring管理了hibernate,这个文件不起什么作用了,但是最好还是加上

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

 <session-factory>

 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

 <mapping class="com.bulktree.ssh2.vo.User"

   package="com.bulktree.ssh2.vo" resource="com/bulktree/ssh2/vo/User.hbm.xml"/>

 </session-factory>

</hibernate-configuration>

posted on 2008-04-18 13:59 凌晨风 阅读(8388) 评论(20)  编辑  收藏 所属分类: Spring/Hibernate/Struts2

FeedBack:
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-04-18 14:19 | 凌晨风
*顺便说一下,只是初学,第一次整合,多多批评指教。
*还有一问题,我在一个action类里写好几个方法execute***方法,在struts.xml文件中通过method属性匹配,要是整合Spring,我该怎么处理多方法的action,在application中该怎么配置?
*系统没有分页,哪位能给个高效分页的整合代码看看?本人不胜感激!  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-04-18 14:42 | wellfuls
你的学习态度很好,思路也对,你说的那几个问题其实不是问题,多百度一下,就行了.祝你越来越强.------过路人.  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-04-18 15:48 | 落Nicety
1。快捷键的问题,Myeclipse 下应该是 ctrl+space 不过这个快捷键与输入法切换有冲突,最好改下。
2.应该可以配置成spring代理 struts的的action

路过~~  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合[未登录]
2008-04-18 15:51 | jones
第一:eclipse中的所有快捷键都能自己在首选项中设置,包括内容辅助快捷键
第二:spring还没有入门,业务方法上竟然没有应用事务  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-04-18 16:55 | 王能
今天SEO大赛关于西藏的问题,大家说说有没有什么想法啊?
关于西藏的问题,可以参考 http://www.bt285.cn/tibetisxizang 这里  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-04-19 13:09 | 王者之风
解决方法:window(窗口)--preference(选项)---General(普通)---keys(键)在右边窗口下找到Content assistant(内容辅助)将其快捷键改掉就行了(随便你怎么改,只要不冲突就行了^-^)  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-04-21 07:43 | opas
呵呵,写得不错,学了个东西

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>

org.springframework.web.filter.CharacterEncodingFilter

</filter-class>

<init-param>

<param-name>encodingFilter</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>
  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-09-08 02:32 | 过路者
写的不错,思路清晰!  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-09-17 14:37 | 游客
希望你能把你的完整的源代码以附件的形式贴出来!!谢谢!!  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-09-18 14:29 | 游客
麻烦把你的全部代码给我发份!谢谢!!
邮箱:cjb125@163.com  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-09-24 11:27 | 路过
写的不错,初学能写成这样的确不错。Hibernate跟Spring的东西还有很多需要学习,祝你越来越好。路过...  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2008-09-25 12:10 | 凌晨风
项目源码下载地址,很久都没有做这些,现在参与一个金融项目,有什么问题大家互相交流
http://www.blogjava.net/Files/bulktree/news-SSH2.rar  回复  更多评论
  
# 编译器代码辅助键
2009-01-27 00:42 | NoName
Ctrl+Space 是大部分编译器代码辅助的默认键 ,
但与windows输入法切换冲突。
先右键输入法图标 ,点建设置 ,把Ctrl+Space换成别的。
我一般用Ctrl+Shift+0,切换搜狗拼音
我一般用Ctrl+Shift+9,切换Windows拼音
比Ctrl+shift好
  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2009-02-25 20:27 | 风无极
咋不弄运行啊 报错了 我的环境是myeclipse5.1 tomcat 5.5 jdk1.5
严重: Error filterStart
2009-2-25 20:02:52 org.apache.catalina.core.StandardContext start
严重: Context [/news-SSH2] startup failed due to previous errors
2009-2-25 20:02:52 org.springframework.context.support.AbstractApplicationContext doClose

望大家指教啦 谢谢  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合[未登录]
2009-02-26 10:52 | cn-done
@凌晨风
依然还是在Struts.xml中配置method 在action节点中设置不同的method方法,相同的class,不同的name

在applicationContext.xml中针对class 设置相关的service就对了

  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2009-03-10 09:53 | 龙华城
路过,学习了,代码还没看,先看的评论,应该不错,你的博客收藏了.希望还会有更多的好东西分享.  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2009-03-10 10:45 | 凌晨风
现在回过头来在看以前写的东西真是太简单了,有时间重新写一篇整合的,这些都是很基础啊  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2009-03-30 10:42 | 路过
@风无极
应该是你引用的包有问题,struts2 有基本的几个包就可以了,core,struts2-spring-plugin commons-fileupload,commons-io,xwork,struts2.jar 在加上spring 的几个包和hibernate3.jar  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合[未登录]
2009-06-03 16:38 | Harold.Zhang
struts.objectFactory=spring源码中没有,好像不能跑吧!  回复  更多评论
  
# re: Spring2.5.3+Hibernate3.2+Struts2.0.11整合
2009-12-23 16:25 | Mr.Kin
最关键的jar包清单 没有加上..有空加上吧..很多人不是因为配置问题.而是因为jar出问题  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(11)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

新闻分类

新闻档案

收藏夹

围脖

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜