我在spring 3.1配置中使用mvc:resources时遇到问题。
最初我正在开发一个在tomcat 6上集成spring 3.0,JPA的项目。 在tomcat 6服务器上,我在web.xml中使用了以下servlet-mapping来从我的应用程序访问静态内容(css,js和png等)。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
我不确定这是否是最佳实践,但它在tomcat6环境中运行良好。它在tomcat 7上不起作用。所以我切换到spring 3.1以在applicationContext中使用mvc:resources元素。我为3.1更改了xml命名空间,并在applicationContext.xml中添加了两行。
<mvc:annotation-driven/>
<mvc:resources location="/resources/" mapping="/static/**"/>
在添加上述两行配置之前,整个应用程序运行良好。但是现在框架没有检测到所有带注释的控制器。我在应用程序根目录中没有index.jsp或任何欢迎文件,我将根请求“/”映射到带注释的RootController.java。所以appliation主页甚至没有加载。
当我在网上搜索解决方案时,我发现mvc:annotation-driven取代了我认为是由框架隐式定义的一些默认bean配置。我找到了一些适用于本论坛中某些人的解决方案,即我自己明确定义一些bean配置。 我尝试添加以下两行
<bean class ="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class ="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
但不幸的是,这并没有解决我的问题。我不确定这是否是我现在面临的真正问题,所以这是我的applicationContext.xml,您可以检查我当前的配置。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans 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"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="com.yewintko.uog.emailcampaignmanager">
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
<tx:annotation-driven/>
<mvc:annotation-driven/>
<mvc:resources location="/resources/" mapping="/static/**"/>
<bean class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean class = "org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<context:property-placeholder location="classpath:database.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="EmailCampaignManager"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${database.platform}"/>
<property name="showSql" value="${database.showSql}"/>
<property name="generateDdl" value="${database.generateDdl}"/>
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
</props>
</property>
</bean>
</beans>
我对spring很新,并且不知道我的applicationContext中缺少哪个配置。如果你有一点空闲时间,请有人帮助我。如果您需要更多信息,请告诉我。
问候 Yewint
答案 0 :(得分:0)
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
将你的控制器放在http://localhost:8080/{warname}/static/{controller}
但是映射您的资源servlet映射在同一个URL上。
您可以通过更改任一映射来解决此问题。
因为我假设我希望你的资源servlet指向/ static / *路径,你所要做的就是将servlet更改为/
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然后您的控制器位于http://localhost:8080/{warname}/{controller}
并且您的静态内容为http://localhost:8080/{warname}/static/
尝试将mvc:resources视为一个带有/ static / **的方法的控制器 它将捕获您尝试并对您的服务执行的所有请求。
出于性能原因,在生产环境中,最好使用常规网络服务器来提供静态内容。
答案 1 :(得分:0)
Spring没有扫描带注释的控制器是因为applicationContext.xml文件中有以下行。
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
请删除该行,它将解决您的问题。希望这可以帮助你欢呼。