`
如若_晴
  • 浏览: 111135 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Struts2.3+Spring3.2的整合 案例

阅读更多
原文转自:http://blog.csdn.net/riyunzhu/article/details/7887901

这两天都是一直在鼓捣Struts2.3如何整合Spring3.2以及dao层到底选用什么以及如何整合。下面就把自己这两天的一些小成果分享出来也以便自己以后在实际项目中快速搭建。
首先是Struts2.3整合Spring3.2
1、新建一个web工程(这个就不说了)
2、添加Struts2.3
把Struts开发所需的jar复制到工程的lib文件中。开发struts必须包如下:

3、创建action类
声明:整个示例只有一个简单的用户登录。
本例中的action类名为 LoginAction,该类中的代码如下:

[java] view plaincopy
package com.riyun.action; 
 
import com.opensymphony.xwork2.ActionSupport; 
public class LoginAction extends ActionSupport{ 
     
    private static final long serialVersionUID = 1L; 
     
         
    private String userName; 
    private String passWord; 
     
    public String getUserName() { 
        return userName; 
    } 
    public String getPassWord() { 
        return passWord; 
    } 
    public void setUserName(String userName) { 
        this.userName = userName; 
    } 
    public void setPassWord(String passWord) { 
        this.passWord = passWord; 
    } 
     
     
    public String   execute() throws Exception{ 
        if(userName.equals("riyun")&&passWord.equals("123")){ 
               return SUCCESS; 
          }else{ 
               return ERROR; 
            } 
[java] view plaincopy


至于该类为什么继承ActionSupport,相信网上讲述Struts1.X与Struts2.X的文章已经很多了,这里就不罗嗦了。
4、修改项目中的index.jsp代码,修改后的index.jsp代码如下:

[html] view plaincopy
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<%@taglib prefix="s" uri="/struts-tags" %> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
     
    <title>My JSP 'index.jsp' starting page</title> 
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    --> 
  </head> 
   
  <body> 
    <s:form action="login"> 
        <s:textfield name="userName" label="用户名" key="user"></s:textfield> 
        <s:password  name="passWord" label="密码" key="password"></s:password> 
        <s:submit key="login" value="提交"></s:submit> 
    </s:form> 
  </body> 
</html> 

[html] view plaincopy
 
新建两个success.jsp、error.jsp页面。后面action处理结果跳转有用,如果登陆成功则跳转到success.jsp,反之则跳转到error.jsp!
5、 新建一个以struts.xml为名的xml文件
  文件中的代码如下:

[html] view plaincopy
<?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> 
     <!-- struts的action配置文件 --> 
      
     <!-- 所有的action都应该放在对应的package下 --> 
     <package name="riyun" extends="struts-default"> 
        <action name="login" class="com.riyun.action.LoginAction"> 
            <!-- 定义逻辑视图和物理资源之间的映射 --> 
            <result name="success">/success.jsp</result> 
            <result name="error">/error.jsp</result> 
        </action> 
     </package> 
  </struts> 

6、在web.xml中添加struts拦截器。
    Web.xml的代码如下:

[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
   
    <!-- 定义struts2的核心filter --> 
    <filter> 
        <filter-name>struts2</filter-name> 
        <filter-class> 
            org.apache.struts2.dispatcher.FilterDispatcher             
        </filter-class> 
    </filter> 
    <!-- 让struts定义的核心filter拦截所有请求 --> 
    <filter-mapping> 
        <filter-name>struts2</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 
     
    <!-- 项目欢迎界面 --> 
    <welcome-file-list> 
        <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
     
</web-app> 

至此Struts2.3整合成功,接下来继续整合Spring3.2。
7、导入所需spring的jar包如下;

对于Spring的jar包没有研究过,所以我这里把spring所有的jar都复制到了lib目录中去了。另外还需要导入struts2-spring-plugin-2.3.4.1.jar包。
8、在web-inf目录中新建一个applicationContext.xml为名的xml文件(该文件与web.xml是在同一级目录)
该applicationContext.xml文件中的代码如下:

[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
"http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="userDao" class="com.riyun.daoImpl.UserDaoImpl">  </bean>   
    <bean id="login" class="com.riyun.action.LoginAction">   
        <property name="userDao" ref="userDao" />   
    </bean>   
</beans> 


9、修改struts.xml文件,修改后的struts.xml文件中的代码如下
[html] view plaincopy
<?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> 
     <!-- struts的action配置文件 --> 
     <!-- 将action托管给spring --> 
     <constant name="struts.objectFactory" value="spring"></constant>   
     <!-- 所有的action都应该放在对应的package下 --> 
     <package name="riyun" extends="struts-default"> 
        <action name="login" class="com.riyun.action.LoginAction"> 
            <!-- 定义逻辑视图和物理资源之间的映射 --> 
            <result name="success">/success.jsp</result> 
            <result name="error">/error.jsp</result> 
        </action> 
     </package> 
  </struts> 


10、修改web.xml文件,修改后的web.xml文件中的代码如下:

[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
   
    <!-- 初始化 --> 
     <context-param> 
         <param-name>contextConfigLocation</param-name> 
         <!-- 如果有多个文件,在文件之间用英文逗号隔开 --> 
         <!-- <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/applicationContext-db.xml 
         </param-value> --> 
         <param-value>/WEB-INF/applicationContext.xml</param-value> 
     </context-param> 
    <!-- 监听器 --> 
    <!-- 配置spring监听器 -->   
    <listener>   
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
    </listener>   
     <!-- 定义struts2的核心filter --> 
    <filter> 
        <filter-name>struts2</filter-name> 
        <filter-class> 
            org.apache.struts2.dispatcher.FilterDispatcher             
        </filter-class> 
    </filter> 
    <!-- 让struts定义的核心filter拦截所有请求 --> 
    <filter-mapping> 
        <filter-name>struts2</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 
     
    <!-- 项目欢迎界面 --> 
    <welcome-file-list> 
        <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
     
</web-app> 

ok,到此为此Struts2.3整合Spring3.2就可以了。那实际项目中不可能不跟数据库打交道。常见的dao层用的是hibernate。但其实还有一些跟hibernate功能相似而且相对于hibernate来说配置更简单的dao层应用可以供我们选择。这里我就选用了JDBC。利用JDBC作为dao层的应用,每个dao层都要继承JDBCSupport类。
11、添加dao层,添加UserDao接口、添加UserDaoImpl实现接口类
UserDao接口的代码如下:
[java] view plaincopy
package com.riyun.dao; 
 
public interface UserDao { 
     
    /*用户登录
     * pram:userName,passWord
     * return:boolean
     */ 
    public boolean login(String userName,String passWord); 
 


UserDaoImpl实现接口类的代码如下:

[java] view plaincopy
package com.riyun.daoImpl; 
 
import java.util.Map; 
 
 
import org.springframework.dao.EmptyResultDataAccessException; 
import org.springframework.jdbc.core.support.JdbcDaoSupport; 
 
import com.riyun.dao.UserDao; 
 
public class UserDaoImpl extends JdbcDaoSupport implements UserDao{ 
 
    //用户登录 
    public boolean login(String userName, String passWord) { 
        // TODO Auto-generated method stub 
        String sql="select job,ename from emp where ename=?"; 
        Map map=this.getJdbcTemplate().queryForMap(sql, new Object[] {userName}); 
        try{ 
            String pass=(String) map.get("job"); 
            if(passWord.equals(pass)){           
                return true; 
            }else{ 
                return false; 
            } 
        }catch(EmptyResultDataAccessException e){ 
            e.printStackTrace(); 
            return false; 
        }        
    } 

12、修改LoginAction类的代码,修改后的代码如下:


[java] view plaincopy
package com.riyun.action; 
 
import org.apache.log4j.Logger; 
 
import com.opensymphony.xwork2.ActionSupport; 
import com.riyun.dao.UserDao; 
 
public class LoginAction extends ActionSupport{ 
     
    private static final long serialVersionUID = 1L; 
     
         
    private UserDao userDao; 
    private String userName; 
    private String passWord; 
     
    public UserDao getUserDao() { 
        return userDao; 
    } 
    public void setUserDao(UserDao userDao) { 
        this.userDao = userDao; 
    } 
 
    public String getUserName() { 
        return userName; 
    } 
    public String getPassWord() { 
        return passWord; 
    } 
    public void setUserName(String userName) { 
        this.userName = userName; 
    } 
    public void setPassWord(String passWord) { 
        this.passWord = passWord; 
    } 
     
     
    public String   execute() throws Exception{ 
        if(userDao.login(userName, passWord)){ 
            return SUCCESS; 
        }else{ 
            return ERROR; 
        } 
    } 
     

13、修改applicationContext.xml文件,修改后的文件代码如下:
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
"http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  destroy-method="close" dependency-check="none"> 
            <property name="driverClass"> 
                <value>oracle.jdbc.driver.OracleDriver</value> 
            </property> 
            <property name="jdbcUrl"> 
                <value>jdbc:oracle:thin:@localhost:1521:orcl</value> 
            </property> 
            <property name="user"> 
                <value>scott</value> 
            </property> 
            <property name="password"> 
                <value>123</value> 
            </property> 
            <!-- <property name="acquireIncrement"> 
                <value>${c3p0.acquireIncrement}</value> 
            </property> 
            <property name="initialPoolSize"> 
                <value>${c3p0.initialPoolSize}</value> 
            </property> 
            <property name="minPoolSize"> 
                <value>${c3p0.minPoolSize}</value> 
            </property> 
            <property name="maxPoolSize"> 
                <value>${c3p0.maxPoolSize}</value> 
            </property> 
            <property name="maxIdleTime"> 
                <value>${c3p0.maxIdleTime}</value> 
            </property> 
            <property name="idleConnectionTestPeriod"> 
                <value>${c3p0.idleConnectionTestPeriod}</value> 
            </property> 
            <property name="maxStatements"> 
                <value>${c3p0.maxStatements}</value> 
            </property> 
            <property name="numHelperThreads"> 
                <value>${c3p0.numHelperThreads}</value> 
            </property>--> 
    </bean> 
    <bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
        <property name="dataSource"> 
            <ref local="dataSource" /> 
        </property> 
    </bean> 
    <bean id="txManager" abstract="true" 
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
        <property name="transactionManager" ref="transactionManager" /> 
        <property name="transactionAttributes"> 
            <props> 
                <prop key="add*"> 
                    PROPAGATION_REQUIRED,-DataAccessException 
                </prop> 
                <prop key="save*"> 
                    PROPAGATION_REQUIRED,-DataAccessException 
                </prop> 
                <prop key="edit*"> 
                    PROPAGATION_REQUIRED,-DataAccessException 
                </prop> 
                <prop key="update*"> 
                    PROPAGATION_REQUIRED,-DataAccessException 
                </prop> 
                <prop key="del*"> 
                    PROPAGATION_REQUIRED,-DataAccessException 
                </prop> 
                <prop key="handle*"> 
                    PROPAGATION_REQUIRED,-DataAccessException 
                </prop> 
                <prop key="notify*"> 
                    PROPAGATION_REQUIRED,-DataAccessException 
                </prop> 
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
                <prop key="query*">PROPAGATION_REQUIRED,readOnly,-DataAccessException</prop> 
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 
                <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop> 
            </props> 
        </property> 
    </bean> 
     
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
        <constructor-arg ref="dataSource" /> 
    </bean> 
    <bean id="userDao" class="com.riyun.daoImpl.UserDaoImpl">   
          <property name="jdbcTemplate" ref="jdbcTemplate"></property> 
    </bean>   
    <bean id="login" class="com.riyun.action.LoginAction">   
        <property name="userDao" ref="userDao" />   
    </bean>   
</beans> 
至此整个例子ok了。
在dao层连接数据库的时候还需要导入各个数据库所必须的jar包以及c3p0-0.9.1.2.jar这样的包。
总结:整合过程中 碰到许许多多的问题,相信大家看我这篇文章也会碰到许许多多不一样的问题,但是有问题不可怕,我们要做的就是分析问题的原因。我在整合过程碰到最多的问题就是classnotfound类的问题,其实这类的问题就是没有导入相关jar包导致的错误或者jar冲突导致的。
分享到:
评论

相关推荐

    pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.002)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于ssm框架+mysql+jsp实现的监考安排与查询系统

    有学生和教师两种角色 登录和注册模块 考场信息模块 考试信息模块 点我收藏 功能 监考安排模块 考场类型模块 系统公告模块 个人中心模块: 1、修改个人信息,可以上传图片 2、我的收藏列表 账号管理模块 服务模块 eclipse或者idea 均可以运行 jdk1.8 apache-maven-3.6 mysql5.7及以上 tomcat 8.0及以上版本

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.001)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于MATLAB车牌识别代码实现代码【含界面GUI】.zip

    matlab

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于Web的毕业设计选题系统的设计与实现(springboot+vue+mysql+说明文档).zip

    随着高等教育的普及和毕业设计的日益重要,为了方便教师、学生和管理员进行毕业设计的选题和管理,我们开发了这款基于Web的毕业设计选题系统。 该系统主要包括教师管理、院系管理、学生管理等多个模块。在教师管理模块中,管理员可以新增、删除教师信息,并查看教师的详细资料,方便进行教师资源的分配和管理。院系管理模块则允许管理员对各个院系的信息进行管理和维护,确保信息的准确性和完整性。 学生管理模块是系统的核心之一,它提供了学生选题、任务书管理、开题报告管理、开题成绩管理等功能。学生可以在此模块中进行毕业设计的选题,并上传任务书和开题报告,管理员和教师则可以对学生的报告进行审阅和评分。 此外,系统还具备课题分类管理和课题信息管理功能,方便对毕业设计课题进行分类和归档,提高管理效率。在线留言功能则为学生、教师和管理员提供了一个交流互动的平台,可以就毕业设计相关问题进行讨论和解答。 整个系统设计简洁明了,操作便捷,大大提高了毕业设计的选题和管理效率,为高等教育的发展做出了积极贡献。

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    婚恋网站 SSM毕业设计 附带论文.zip

    婚恋网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的戒烟网站答辩PPT.pptx

    基于java的戒烟网站答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    机器学习(预测模型):自行车共享使用情况的数据集

    Capital Bikeshare 数据集是一个包含从2020年5月到2024年8月的自行车共享使用情况的数据集。这个数据集记录了华盛顿特区Capital Bikeshare项目中自行车的租赁模式,包括了骑行的持续时间、开始和结束日期时间、起始和结束站点、使用的自行车编号、用户类型(注册会员或临时用户)等信息。这些数据可以帮助分析和预测自行车共享系统的需求模式,以及了解用户行为和偏好。 数据集的特点包括: 时间范围:覆盖了四年多的时间,提供了长期的数据观察。 细节丰富:包含了每次骑行的详细信息,如日期、时间、天气条件、季节等,有助于深入分析。 用户分类:数据中区分了注册用户和临时用户,可以分析不同用户群体的使用习惯。 天气和季节因素:包含了天气情况和季节信息,可以研究这些因素对骑行需求的影响。 通过分析这个数据集,可以得出关于自行车共享使用模式的多种见解,比如一天中不同时间段的使用高峰、不同天气条件下的使用差异、季节性变化对骑行需求的影响等。这些信息对于城市规划者、交通管理者以及自行车共享服务提供商来说都是非常宝贵的,可以帮助他们优化服务、提高效率和满足用户需求。同时,这个数据集也

Global site tag (gtag.js) - Google Analytics