`

如何将Spring和Struts2进行整合及加入监听器后抛异常的解决方法

SSH 
阅读更多

1、添加一个jar包
    struts2-spring-plugin-2.3.24.1.jar

 

除了添加jar包以外,整合还需要做哪些操作?

1.将原先的struts.xml中的action属性写成bean的名称,并且在TestAction.java中添加annotation注释

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

<struts>

	<!-- 配置扩展名为action -->
	<constant name="struts.action.extension" value="action"></constant>

	<!-- 如果这个选项的value为true则代表可以使用动态方法调用即可以使用类似于u!load.action?id=1 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="false" />

	<!-- 要是value为true表示配置为开发模式从而代码可以热部署 -->
	<constant name="struts.devMode" value="true" />



	<package name="default" namespace="/" extends="struts-default">

		<!-- 配置测试用的action,当与spring整合后,class属性写的就是bean的名称 -->
		<action name="test" class="testAction">
			<result name="success">/test.jsp</result>
		</action>
	</package>

</struts>

 

package com.jxust.oa.test;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

@Controller
@Scope("prototype")
public class TestAction extends ActionSupport {

	@Override
	public String execute() throws Exception{
		System.out.print("--------->TestAction execute()");
		return "success";
	}
}

 

2.在web.xml中配置spring的监听器用于初始化ApplicationContext对象

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

	<!-- 配置spring的监听器用于初始化ApplicationContext对象 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext*.xml</param-value>
	</context-param>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<!-- 配置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-app>

 

 做完以上操作以后,和预期效果不一样,抛出了BeanInitialzationException异常

严重: Context initialization failed
org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/jdbc.properties]
	at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:78)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:553)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:527)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:362)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5017)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5531)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1263)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1948)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/jdbc.properties]
	at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:117)
	at org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:182)
	at org.springframework.core.io.support.PropertiesLoaderSupport.mergeProperties(PropertiesLoaderSupport.java:161)
	at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:69)
	... 19 more

 

解决此异常的方法:由于在applicationContext.xml中加载外部properties配置文件中location的值为jdbc.properties从而引发了这个异常

 

所以解决这个问题的关键就在于将applicationContext.xml的中加载外部properties配置文件中location的值改成classpath:jdbc.properties即可

<?xml version="1.0" encoding="UTF-8"?>
<!-- - Middle tier application context definition for the image database. -->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


	<!-- 自动扫描与装配bean -->
	<context:component-scan base-package="com.jxust.oa"></context:component-scan>

	<!-- 加载外部的properties配置文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>

	<!-- 配置数据库连接池(c3p0) -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!-- 基本信息 -->
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<property name="driverClass" value="${driverClass}"></property>
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>

		<!-- 其他配置 -->
		<!-- 初始化时获得三个连接,取值应在minPoolSize与maxPoolSize之间,Default:3 -->
		<property name="initialPoolSize" value="3"></property>
		<!-- 连接池中保留的是最小连接数,Default:3 -->
		<property name="minPoolSize" value="3"></property>
		<!-- 连接池中保留的是最大连接数,Default:15 -->
		<property name="maxPoolSize" value="15"></property>
		<!-- 当连接池中的连接耗尽的时候c3p0一次同时获得的连接数,Default:3 -->
		<property name="acquireIncrement" value="3"></property>
		<!-- 控制数据源内加载的PreparedStatements,如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0 -->
		<property name="maxStatements" value="0"></property>
		<!-- maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statement数,Default:0 -->
		<property name="maxStatementsPerConnection" value="0"></property>
		<!-- 最大空F闲时间,1800秒内未使用则连接被丢弃,若为0则永不丢弃,Default:0 -->
		<property name="maxIdleTime" value="1800"></property>

	</bean>

	<!-- 配置SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	</bean>
	
	<!-- 配置声明式事务管理(采用基于注解的方式) -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

 

 重新部署tomcat,得到预期效果,Struts2和spring的整合完成!酷

 

分享到:
评论

相关推荐

    dwr和spring和struts2整合

    将DWR、Spring和Struts2整合的关键步骤如下: 1. **配置Spring**:首先,在Spring配置文件中定义Bean,包括Struts2的Action类和DWR的接口实现类。使用Spring的`&lt;bean&gt;`标签声明这些类,并设置相应的属性,如Service...

    Spring+Struts2_整合原理

    因此,将Spring与Struts2进行整合,可以充分发挥两者的优势:Spring负责业务逻辑层的管理,而Struts2专注于表现层的处理,这种组合方式已经成为构建复杂Java Web应用的标准实践之一。 #### 二、整合步骤 ##### 1. ...

    spring和struts整合的三种方案

    Spring 和 Struts 整合是企业级 Java 应用开发中常见的技术组合,它们各自在应用程序架构中扮演着重要的角色。Spring 提供了依赖注入(DI)和面向切面编程(AOP),而 Struts 则是一个经典的MVC框架,用于处理用户...

    Spring整合Struts

    因为StrutsTestCase的MockStrutsTestCase不会在启动时初始化监听器,所以将所有上下文文件放置在插件中是一种变通方法。 配置完插件后,就可以让Spring管理你的Action了。Spring1.1.3提供了两种方式: 1. 覆盖...

    struts2-hibernate3-spring整合需要的全部jar包

    3. 配置web.xml,设置过滤器和监听器,使Spring和Struts2协同工作。 4. 在Action类上添加注解或配置,与Spring的Bean管理相结合。 5. 使用Hibernate配置hibernate.cfg.xml,设置数据库连接和实体类映射。 通过这个...

    Myeclipse下整合springstruts2

    在本文中,我们将探讨如何在MyEclipse环境中整合Spring和Struts2框架,这对于初学者来说是一个重要的学习步骤。整合这两个框架可以创建一个强大的MVC架构,方便地管理业务逻辑和服务层。以下是如何进行环境搭建和...

    Struts2与Spring2.5的整合

    整合 Struts2 和 Spring2.5 后,我们可以享受到以下好处: - **依赖注入**:Spring 管理了 Action 类的生命周期和依赖,使得代码更易于测试和维护。 - **解耦合**:业务逻辑和服务层之间的耦合度降低,提高了代码的...

    spring+struts2图书管理系统

    接下来,我们探讨如何将Spring与Struts2进行整合。整合的关键在于Spring的ApplicationContext能够作为全局的依赖注入容器,为Struts2的Action提供服务。这通常通过实现Spring的Web应用上下文监听器...

    MyClipse6.0\Struts2,Spring与Hibernate整合应用,学生成绩管理系统

    - **实现WEB层**:配置Struts2的过滤器和Spring监听器,编写Action类并注入Service层的bean,设置Struts2的配置文件和JSP页面。 5. **数据库设计** - 学生信息表(xsb):包含学号(XH)、姓名(XM)、性别(XB)...

    Struts2与Spring之间的整合方法与原理

    Struts2与Spring之间的整合是企业级应用中常见的技术组合,因为它们分别提供了优秀的MVC框架支持和依赖注入(DI)及面向切面编程(AOP)能力。整合这两个框架可以使开发更加灵活,同时利用Spring的管理功能来增强...

    Spring-整合-Struts2

    ### Spring 整合 Struts2 详解 ...通过以上步骤,我们可以成功地将Spring和Struts2进行整合,实现更加灵活、高效的开发模式。这种整合方式不仅提高了代码的复用性,还增强了系统的可扩展性和可维护性。

    spring与struts2整合

    Spring 和 Struts2 整合是企业级 Java 开发中常见的技术组合,这两种框架的结合可以充分利用它们的优点,提供灵活的控制层和强大的持久化支持。下面将详细解释整合过程中的关键知识点。 首先,整合所需的基础组件...

    Struts2.2+Hibernate3.3+Spring2.5.6整合 一个简单的CRUD案例

    - 在`web.xml`中配置Struts的启动参数和Spring监听器。 4. **配置Spring的`applicationContext.xml`**: - 根据使用的数据库类型(这里是SQL Server 2005),添加相应的驱动JAR,例如`jtds-1.2.jar`。 - 在`...

    struts2+spring整合

    完成`WebApplicationContext`的加载后,我们开始进行Struts2和Spring的整合。整合有两种主要方法: 1. **Spring管理Action**: - 在Spring配置文件中定义Action类及其依赖,Action类通常配置为`scope="prototype"`...

    struts 整合spring 例子,测试通过

    Struts2 和 Spring 整合是Java开发中常见的实践,主要目的是为了利用Spring的强大功能,如依赖注入(DI)和面向切面编程(AOP),同时保持Struts2的MVC架构的优势。以下是对整合过程的详细说明: 首先,Spring框架...

    struts2 整合spring 必备包 s2sh

    8. **异常处理**:Struts2 提供了全局异常处理机制,可以与 Spring 的异常处理结合,创建统一的错误页面和错误信息。 9. **测试**:整合后,Action 对象作为 Spring 的bean,可以方便地进行单元测试,使用 `@...

    struts2整合spring

    将Struts2与Spring进行整合能够充分发挥两者的优势,使得开发者能够更灵活地管理业务逻辑与Web组件之间的关系,从而提高开发效率和系统的可维护性。本文将详细介绍如何实现Struts2与Spring的整合。 #### 二、所需...

    Struts整合Spring步骤

    如果一切正常,当在`login.jsp`提交表单时,Struts 2会调用`LoginAction`的`execute`方法,该方法会利用Spring管理的`LoginService`进行业务处理,然后根据结果跳转到相应的JSP页面。 通过这种方式整合Struts 2和...

Global site tag (gtag.js) - Google Analytics