spring 和 springmvc 的父子容器关系浅析

news/2024/7/4 10:01:48

以###问题###
在工程项目中,一开始将所有的附件路径定义在工具类中。使用 static String 的形式;于是就在项目的开发过程中产生不便,也使得配置属性不灵活,不利于模块化的管理信息和提高项目的可扩展性以及维护性。因此就将项目的属性常量抽取 出来,配置的属性文件中。但在此过程中产生了在@controller 注解的模块中无法加载在属性文件配置的常量。 同时也使用了@service 注解层注入常量的方法。但均已失败告终。
最后在分析了spring 和 spring mvc 的源码和属性文件之间在web中的加载顺序和相互之间的关系。解决了此问题。以下是分析解决的过程。

 

代码

 

web.xml

 

    <display-name>demo-manager</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <!-- 初始化spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext-*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--解决post乱码-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- springmvc的前端控制器 -->
    <servlet>
        <servlet-name>demo-manager</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo-manager</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

 

spring-mvc.xml

 

        <!--配置包扫描器-->       
        <context:component-scan base-package="com.demo.controller"></context:component-scan>
        <!--配置注解驱动-->
        <mvc:annotation-driven/>
        <!--试图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean> 
        <!--静态资源映射-->
        <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
        <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

 

application-dao.xml

 

    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:properties/*.properties"/>    
    <!-- 数据路连接池 --> 
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="maxActive" value="10"/>
        <property name="minIdle" value="5"/>
    </bean>
    <!-- spring管理sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--数据库连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--加载mybatis的全局配置文件-->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />       
    </bean> 
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.demo.mapper"/>
    </bean>      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

 

以上的配置文件可以解决@service 中@value(“${ATTPATH}’) .
同时要想解决在@controller 层中注入属性配置文件中的值,经过自己测试,存在三种方式:

 

1.get set 方法

 

(1)在@service 中 注入:

 

@Value("${ATT_PATH}")
private String attPath;
  • 1
  • 2

 

(2)然后get set

 

(3)在@controller 中获取值。

 

2,公有化 @service中注入的值

 

@Value("${ATT_PATH}")
public  String attPath;
  • 1
  • 2

 

3.在spring-mvc.xml 中加载属性配置文件

 

<!-- 加载文件上传路径配置文件 解决@controller 中无法注入配置文件中的属性 -->
<context:property-placeholder location="classpath*:file.properties"/>
  • 1
  • 2

 

这样可以直接在@controller 中注入配置的属性文件

 

@Value("${ATT_PATH}")
private String attPath;
  • 1
  • 2

 

关于spring 和spring MVC的父子容器关系

在web.xml 中只加载spring-mvc.xml 则是没有问题的。但是只加载spring.xml 是错误的。
spring 是父容器, springmvc 是子容器,子容器可以使用父容器的对象,但是父容器是不能使用子容器的对象的。注意,这里是对象。在实际的项目中。我们通常是在spring.xml 中加载我们在资源包下定义的属性文件的,于是,我们也只有在@service 层中通过@value(“

 

http://m.blog.csdn.net/article/details?id=51088414

 

 

..)@controller使springmvc.xml@contrller@value(


http://www.niftyadmin.cn/n/3296582.html

相关文章

Struts2 Get传值乱码过滤器

问题的原因在于get传值的时候&#xff0c;getParameter方法使用的是ISO8859-1编码&#xff0c;。修改一下此方法 &#xff08;1&#xff09;java类1&#xff1a;EncodeRequestWrapper.java public class EncodeRequestWrapper extends HttpServletRequestWrapper { private Ht…

拖拽drag_html5的拖放(drag和drop)

<p>请把 W3School 的图片拖放到矩形中&#xff1a;</p><div id"div1" ondrop"drop(event)" ondragover"allowDrop(event)"></div> <br /> <img id"drag1" src"/i/eg_dragdrop_w3school.gif&quo…

Groovy创始人James Strachan博客称:Java面临终结Scala将来可能替代javac

Groovy创始人James Strachan前日在其博客上发表了一篇文章&#xff0c;题目为《Scala将取代Java /javac&#xff1f;》。以下是正文部分的翻译&#xff1a;不要误解我的意思——我在过去的这十来年里写了无数的Java代码&#xff0c;并且坚信它相对C和Smalltalk来说是一个巨大的…

Android发送信息模拟系统

Android系统中已经有了我们熟悉并常用的发送信息功能&#xff0c;在程序中叫做已经有了此Activity&#xff0c;那么有时候我们需要在编写Android程序时调用此应用程序以实现通过我们的程序发送信息。具体实现方式如下&#xff1a; 1. 建立xml布局文件&#xff0c;最终效果如下&…

Spring MVC上下文父子容器

在Spring MVC的启动依赖Spring框架&#xff0c;有时候我们在启动Spring MVC环境的时候&#xff0c;如果配置不当的话会造成一些不可预知的结果。下面主要介绍一下Spring MVC环境启动的时候context的状态。 通常情况下使用Spring MVC需要进行如下配置&#xff1a; 1、web.xml中增…

七牛云 转码_阿里云,腾讯云,金山云,七牛云的视频云方案有什么区别?

国内的视频云&#xff0c;在之前几年会有着火爆的竞争&#xff0c;以公共云作为代表的腾讯云&#xff0c;还有阿里云&#xff0c;早就已经在市场上投入大量的资金&#xff0c;准备研发视频云&#xff0c;并且还做出市场推广&#xff0c;取得较好的成绩。七牛云&#xff0c;金山…

windows编译Qt5.15 MySql驱动

本文主要简要记录下如何在Windows上编译Qt MySql驱动。细支末节难以言表&#xff0c;需要一定经验。 Qt源码中没有集成mysql的开发库文件&#xff0c;因为mysql所用开源协议与Qt不兼容。 需要从mysql官网下载mysql的安装包或者压缩包&#xff0c;mysql中自带了最新的C开发库。…

HDU 1102 Constructing Roads HDU1863 畅通工程

这两个题都是畅通工程的。杭电上真是各种畅通工程。 1102 题目链接http://acm.hdu.edu.cn/showproblem.php?pid1102 还是用的Prim算法。 View Code 1 #include<stdio.h>2 #include<string.h>3 #define N 10000004 int map[110][110],lowcost[110];5 int visi…