2016-11-08 90 views
1

在我的spring spring控制器中,我寫了一個@PostConstruct配置函數,但問題在於它運行project.Below是我的web.xml和servlet-context.xml文件。如何爲spring創建servlet-context.xml和servlet-context-dispatcher.xml文件

的web.xml:

 <?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
    <display-name>SaveMoneyOauth</display-name> 

     <servlet> 
      <servlet-name>MyProject</servlet-name> 
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/servlet-context.xml</param-value> 
     </init-param> 
        <load-on-startup>1</load-on-startup> 
      </servlet> 


      <servlet-mapping> 
        <servlet-name>MyProject</servlet-name> 
        <url-pattern>/</url-pattern> 
      </servlet-mapping>  

      <listener> 
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
      </listener> 

      <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value> 
       /WEB-INF/servlet-context.xml, 
       /WEB-INF/spring-security.xml 
      </param-value> 
      </context-param> 


      <!-- Spring Security --> 

      <filter> 
        <filter-name>springSecurityFilterChain</filter-name> 
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
      </filter> 

      <filter-mapping> 
        <filter-name>springSecurityFilterChain</filter-name> 
        <url-pattern>/*</url-pattern> 
      <dispatcher>REQUEST</dispatcher> 
        <dispatcher>ERROR</dispatcher> 
      </filter-mapping> 
    </web-app> 

的servlet-context.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" xmlns:context="http://www.springframework.org/schema/context" 
      xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" 
      xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> 
      <context:annotation-config /> 
     <context:component-scan base-package="com.example.myproject" /> 
      <mvc:annotation-driven> 
      <mvc:message-converters register-defaults="false"> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> 
      </mvc:message-converters> 
      </mvc:annotation-driven> 

      <bean id="multipartResolver" 
     class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 

     <!-- one of the properties available; the maximum file size in bytes --> 
     <property name="maxUploadSize" value="1000000000" /> 
      </bean> 

      <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://localhost:3306/SaveIt"/> 
     <property name="username" value="root"/> 
     <property name="password" value="password"/> 
     <property name="validationQuery" value="SELECT 1"/> 
    </bean> 

    <!-- Hibernate Session Factory --> 
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource"/> 
     <property name="packagesToScan"> 
     <array> 
      <value>com.example.myproject</value> 
     </array> 
     </property> 
     <property name="hibernateProperties"> 
     <value> 
      hibernate.dialect=org.hibernate.dialect.MySQLDialect 
     </value> 
     </property> 
    </bean> 
    <!-- Hibernate Transaction Manager --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="mySessionFactory"/> 
    </bean> 

    <!-- Activates annotation based transaction management --> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 
    </beans> 

我發現這個問題,是因爲我已配置的servlet-context.xml的同時作爲的ContextLoaderListener和DispatcherServlet的。因此,爲了避免這個問題,我必須拆分這些該XML文件sperate two.So我在web.xml

 <servlet> 
     <servlet-name>SaveMoneyOauth</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/servlet-context-dispatcher.xml</param-value> 
    </init-param> 
       <load-on-startup>1</load-on-startup> 
     </servlet> 

改變了DispatcherServlet的下面,但我怎麼能分割文件代碼到Servlet的context.xml中和servlet的上下文dispatcher.xml?我應該在這兩個文件中寫什麼?請幫助我。

回答

1

你通過的ContextLoaderListener加載的東西,應該是根WebApplicationContext的

了根WebApplicationContext應該包含所有的基礎設施 豆應您的其他背景和Servlet實例 之間共享。這些繼承的bean可以在 特定於servlet的作用域中被覆蓋,並且可以爲給定的Servlet實例定義新的作用域特定的bean 。

通過DispatcherServlet加載的bean是特定於應用程序的servlet上下文,它繼承了您在根web應用程序上下文中定義的所有bean。

因此理想情況下,應用程序特定的bean如會話工廠,事務管理器和其他相關基礎結構bean應該放在根web應用程序上下文中。豆類如控制器和視圖解析器應該在你的servlet環境中運行

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-servlet