Spring MVC 配置文件dispatcher-servlet.xml 文件详解(转自 学无止境-yj)
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
- <!-- 使用spring提供的PropertyPlaceholderConfigurer读取数据库配置信息.properties
- 1、这里的classpath可以认为是项目中的src-
- 2、属性名是 locations,使用子标签<list></list>可以指定多个数据库的配置文件,这里指定了一个
- 其中order属性代表其加载顺序,而ignoreUnresolvablePlaceholders为是否忽略不可解析的 Placeholder,
- 如配置了多个PropertyPlaceholderConfigurer,则需设置为true
- <bean id="propertyConfigurerForProject2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="2" />
- <property name="ignoreUnresolvablePlaceholders" value="true" />
- <property name="locations">
- <list>
- <value>classpath:/spring/include/jdbc-parms.properties</value>
- <value>classpath:/spring/include/base-config.properties</value>
- </list>
- </property>
- </bean>-->
- <bean id="propertyConfigurer"
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="location" value="classpath:/application.properties"/>
- </bean>
- <!--注解探测器,在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,
- 如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean
- 注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。
- 另外<context:annotation-config/>还提供了两个子标签
- 1. <context:include-filter> 2.<context:exclude-filter>
- <context:component-scan>有一个use-default-filters属性,改属性默认为true,这就意味着会扫描指定包下的全部的标有@Component的类,
- 并注册成bean.也就是@Component的子注解@Service,@Reposity等。所以如果仅仅是在配置文件中这么写
- <context:component-scan base-package="com.test.myapp.web"/>
- Use-default-filter此时为true,那么会对base-package包或者子包下的jun所有的进行java类进行扫描,并把匹配的java类注册成bean。
- 可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。如下所示
- <context:component-scan base-package="com.test.myapp.web.Controller">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- 这样就会只扫描base-package指定下的有@Controller下的java类,并注册成bean.
- 但是因为use-dafault-filter在上面并没有指定,默认就为true,所以当把上面的配置改成如下所示的时候,就会产生与你期望相悖的结果(注意base-package包值得变化)
- <context:component-scan base-package="com.test.myapp.web ">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- 此时,spring不仅扫描了@Controller,还扫描了指定包所在的子包service包下注解@Service的java类
- 此时指定的include-filter没有起到作用,只要把use-default-filter设置成false就可以了。这样就可以避免在base-packeage配置多个包名这种不是很优雅的方法来解决这个问题了。
- 另外在我参与的项目中可以发现在base-package指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定<context:exclude-filter>来进行过滤,说明此包不需要被扫描。综合以上说明
- Use-dafault-filters=”false”的情况下:<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描-->
- <context:component-scan base-package="com.test.myapp">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- <!-- 视图解析器,根据视图的名称new ModelAndView(name),在配置文件查找对应的bean配置
- 这个视图解析器跟XmlViewResolver有点类似,也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象。
- 不同点有二,一是BeanNameViewResolver要求视图bean对象都定义在Spring的application context中,
- 而XmlViewResolver是在指定的配置文件中寻找视图bean对象,二是BeanNameViewResolver不会进行视图缓存。
- 如果没有设置viewResolver,spring使用InternalResourceViewResolver进行解析。
- Spring实现ViewResolver的非抽象类且我们经常使用的viewResolver有以下四种:
- 1、InternalResourceViewResolver 将逻辑视图名字解析为一个路径
- 2、BeanNameViewResolver 将逻辑视图名字解析为bean的Name属性,从而根据name属性,找定义View的bean
- 3、ResourceBundleResolver 和BeanNameViewResolver一样,只不过定义的view-bean都在一个properties文件中,用这个类进行加载这个properties文件
- 4、XmlViewResolver 和ResourceBundleResolver一样,只不过定义的view-bean在一个xml文件中,用这个类来加载xml文件
- DispatcherServlet会加载所有的viewResolver到一个list中,并按照优先级进行解析。
- 我们不想只使用一种视图解析器的话,可以在[spring-dispatcher-name]-servlet.xml定义多个viewResolver:
- 注意order中的值越小,优先级越高。而id为viewResolver 的viewResolver的优先级是最低的。
- -->
- <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
- <property name="order" value="1"/>
- </bean>
- <!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
- <!--<property name="prefix" value="/WEB-INF/"/>-->
- <!--<property name="suffix" value=".html"/>-->
- <!--</bean>-->
- <!--基于json格式的mvc交互-->
- <bean name="jsonView" class="com.test.myapp.MappingFastJsonJsonView">
- <property name="contentType" value="application/json;charset=UTF-8"/>
- </bean>
- <!-- spring mvc +servlet3.0上传文件配置,文件上传插件uploadify的应用
- 1) 在Web.xml的配置
- 需要在web.xml添加multipart-config,如下所示
- <servlet>
- <servlet-name>AcrWeb</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- <multipart-config>
- <max-file-size>52428800</max-file-size>
- <max-request-size>52428800</max-request-size>
- <file-size-threshold>0</file-size-threshold>
- </multipart-config>
- </servlet>
- 2) 在spring的application.xml(名字不一定是application)的配置,需要在该配置文件下添加一个如下的bean
- spring mvc +servlet3.0上传文件配置
- <bean id="multipartResolver"
- class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
- </bean>
- 3) 在jsp页面中需要引入一些相关的该插件的包
- <script src="<c:url value="/asset/admin/js/uploadify/jquery.uploadify.min.js"/>"></script>
- 4) 定义一个选择文件的input框
- <div class="box-body">
- <span class="label input g1">上传apk</span>
- <input id="apk_upload" name="apk_upload" type="file"/>
- <input id="apkUrl" type="hidden" name="apkUrl"/>
- </div>
- 5) Input file与插件进行绑定
- $("#apk_upload").uploadify({
- swf: "<c:url value='/asset/admin/js/uploadify/uploadify.swf'/>",
- //cancelImg : "<c:url value='/asset/admin/js/uploadify/uploadify-cancel.png'/>",
- uploader: "/acr/admin/app/apkupload",
- fileObjName: "file",//对应着文件输入框
- width:300,
- buttonText: '<img src="/acr/asset/admin/js/uploadify/upload.png" />',
- // onInit: function () { $(".uploadify-queue").hide(); },
- //removeCompleted : false,
- onUploadSuccess : function(file, data, response) {
- $("#apkUrl").val(data);
- },
- onUploadError : function(file, errorCode, errorMsg, errorString) {
- alert('文件 ' + file.name + ' 上传失败: ' + errorString);
- }
- });
- 注意:该插件的uploadify.swf文件时放入到项目的某一个文件下面
- Uploader的值对应的是url,该值映射到了springmvc的一个方法,该方法是文件上传的核心,
- 负责把文件写到指定位置的地方去。
- 6) Spring 后台代码的实现
- @RequestMapping(value = "/apkupload", method=RequestMethod.POST)
- public @ResponseBody String apkUpload(
- @RequestParam MultipartFile file,
- Model model,
- HttpServletRequest request) throws IOException {
- InputStream input = null;
- OutputStream output = null;
- String root = "H:/file";
- //生成了文件名字
- String filename = file.getOriginalFilename();
- //文件要上传的位置
- String fileFullName = buildUpPath(root, filename);
- try {
- File dir = new File(root);
- if(!dir.exists()){
- dir.mkdirs();
- }
- input = file.getInputStream();
- output = new FileOutputStream(new File(fileFullName));
- //保存文件
- IOUtils.copy(input, output);
- } catch (Throwable e) {
- throw e;
- }finally{
- IOUtils.closeQuietly(input);
- IOUtils.closeQuietly(output);
- }
- return root+"/"+filename;
- }
- 其中filename对应着步骤5的onUploadSuccess中的data
- -->
- <bean id="multipartResolver"
- class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
- </bean>
- </beans>
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
- <!-- 使用spring提供的PropertyPlaceholderConfigurer读取数据库配置信息.properties
- 1、这里的classpath可以认为是项目中的src-
- 2、属性名是 locations,使用子标签<list></list>可以指定多个数据库的配置文件,这里指定了一个
- 其中order属性代表其加载顺序,而ignoreUnresolvablePlaceholders为是否忽略不可解析的 Placeholder,
- 如配置了多个PropertyPlaceholderConfigurer,则需设置为true
- <bean id="propertyConfigurerForProject2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="2" />
- <property name="ignoreUnresolvablePlaceholders" value="true" />
- <property name="locations">
- <list>
- <value>classpath:/spring/include/jdbc-parms.properties</value>
- <value>classpath:/spring/include/base-config.properties</value>
- </list>
- </property>
- </bean>-->
- <bean id="propertyConfigurer"
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="location" value="classpath:/application.properties"/>
- </bean>
- <!--注解探测器,在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,
- 如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean
- 注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。
- 另外<context:annotation-config/>还提供了两个子标签
- 1. <context:include-filter> 2.<context:exclude-filter>
- <context:component-scan>有一个use-default-filters属性,改属性默认为true,这就意味着会扫描指定包下的全部的标有@Component的类,
- 并注册成bean.也就是@Component的子注解@Service,@Reposity等。所以如果仅仅是在配置文件中这么写
- <context:component-scan base-package="com.test.myapp.web"/>
- Use-default-filter此时为true,那么会对base-package包或者子包下的jun所有的进行java类进行扫描,并把匹配的java类注册成bean。
- 可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。如下所示
- <context:component-scan base-package="com.test.myapp.web.Controller">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- 这样就会只扫描base-package指定下的有@Controller下的java类,并注册成bean.
- 但是因为use-dafault-filter在上面并没有指定,默认就为true,所以当把上面的配置改成如下所示的时候,就会产生与你期望相悖的结果(注意base-package包值得变化)
- <context:component-scan base-package="com.test.myapp.web ">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- 此时,spring不仅扫描了@Controller,还扫描了指定包所在的子包service包下注解@Service的java类
- 此时指定的include-filter没有起到作用,只要把use-default-filter设置成false就可以了。这样就可以避免在base-packeage配置多个包名这种不是很优雅的方法来解决这个问题了。
- 另外在我参与的项目中可以发现在base-package指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定<context:exclude-filter>来进行过滤,说明此包不需要被扫描。综合以上说明
- Use-dafault-filters=”false”的情况下:<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描-->
- <context:component-scan base-package="com.test.myapp">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- <!-- 视图解析器,根据视图的名称new ModelAndView(name),在配置文件查找对应的bean配置
- 这个视图解析器跟XmlViewResolver有点类似,也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象。
- 不同点有二,一是BeanNameViewResolver要求视图bean对象都定义在Spring的application context中,
- 而XmlViewResolver是在指定的配置文件中寻找视图bean对象,二是BeanNameViewResolver不会进行视图缓存。
- 如果没有设置viewResolver,spring使用InternalResourceViewResolver进行解析。
- Spring实现ViewResolver的非抽象类且我们经常使用的viewResolver有以下四种:
- 1、InternalResourceViewResolver 将逻辑视图名字解析为一个路径
- 2、BeanNameViewResolver 将逻辑视图名字解析为bean的Name属性,从而根据name属性,找定义View的bean
- 3、ResourceBundleResolver 和BeanNameViewResolver一样,只不过定义的view-bean都在一个properties文件中,用这个类进行加载这个properties文件
- 4、XmlViewResolver 和ResourceBundleResolver一样,只不过定义的view-bean在一个xml文件中,用这个类来加载xml文件
- DispatcherServlet会加载所有的viewResolver到一个list中,并按照优先级进行解析。
- 我们不想只使用一种视图解析器的话,可以在[spring-dispatcher-name]-servlet.xml定义多个viewResolver:
- 注意order中的值越小,优先级越高。而id为viewResolver 的viewResolver的优先级是最低的。
- -->
- <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
- <property name="order" value="1"/>
- </bean>
- <!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
- <!--<property name="prefix" value="/WEB-INF/"/>-->
- <!--<property name="suffix" value=".html"/>-->
- <!--</bean>-->
- <!--基于json格式的mvc交互-->
- <bean name="jsonView" class="com.test.myapp.MappingFastJsonJsonView">
- <property name="contentType" value="application/json;charset=UTF-8"/>
- </bean>
- <!-- spring mvc +servlet3.0上传文件配置,文件上传插件uploadify的应用
- 1) 在Web.xml的配置
- 需要在web.xml添加multipart-config,如下所示
- <servlet>
- <servlet-name>AcrWeb</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- <multipart-config>
- <max-file-size>52428800</max-file-size>
- <max-request-size>52428800</max-request-size>
- <file-size-threshold>0</file-size-threshold>
- </multipart-config>
- </servlet>
- 2) 在spring的application.xml(名字不一定是application)的配置,需要在该配置文件下添加一个如下的bean
- spring mvc +servlet3.0上传文件配置
- <bean id="multipartResolver"
- class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
- </bean>
- 3) 在jsp页面中需要引入一些相关的该插件的包
- <script src="<c:url value="/asset/admin/js/uploadify/jquery.uploadify.min.js"/>"></script>
- 4) 定义一个选择文件的input框
- <div class="box-body">
- <span class="label input g1">上传apk</span>
- <input id="apk_upload" name="apk_upload" type="file"/>
- <input id="apkUrl" type="hidden" name="apkUrl"/>
- </div>
- 5) Input file与插件进行绑定
- $("#apk_upload").uploadify({
- swf: "<c:url value='/asset/admin/js/uploadify/uploadify.swf'/>",
- //cancelImg : "<c:url value='/asset/admin/js/uploadify/uploadify-cancel.png'/>",
- uploader: "/acr/admin/app/apkupload",
- fileObjName: "file",//对应着文件输入框
- width:300,
- buttonText: '<img src="/acr/asset/admin/js/uploadify/upload.png" />',
- // onInit: function () { $(".uploadify-queue").hide(); },
- //removeCompleted : false,
- onUploadSuccess : function(file, data, response) {
- $("#apkUrl").val(data);
- },
- onUploadError : function(file, errorCode, errorMsg, errorString) {
- alert('文件 ' + file.name + ' 上传失败: ' + errorString);
- }
- });
- 注意:该插件的uploadify.swf文件时放入到项目的某一个文件下面
- Uploader的值对应的是url,该值映射到了springmvc的一个方法,该方法是文件上传的核心,
- 负责把文件写到指定位置的地方去。
- 6) Spring 后台代码的实现
- @RequestMapping(value = "/apkupload", method=RequestMethod.POST)
- public @ResponseBody String apkUpload(
- @RequestParam MultipartFile file,
- Model model,
- HttpServletRequest request) throws IOException {
- InputStream input = null;
- OutputStream output = null;
- String root = "H:/file";
- //生成了文件名字
- String filename = file.getOriginalFilename();
- //文件要上传的位置
- String fileFullName = buildUpPath(root, filename);
- try {
- File dir = new File(root);
- if(!dir.exists()){
- dir.mkdirs();
- }
- input = file.getInputStream();
- output = new FileOutputStream(new File(fileFullName));
- //保存文件
- IOUtils.copy(input, output);
- } catch (Throwable e) {
- throw e;
- }finally{
- IOUtils.closeQuietly(input);
- IOUtils.closeQuietly(output);
- }
- return root+"/"+filename;
- }
- 其中filename对应着步骤5的onUploadSuccess中的data
- -->
- <bean id="multipartResolver"
- class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
- </bean>
- </beans>
Spring MVC 配置文件dispatcher-servlet.xml 文件详解(转自 学无止境-yj)的更多相关文章
- web.xml文件详解
web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...
- tomcat 加载顺序 web.xml文件详解
一. 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Se ...
- Maven pom.xml文件详解
Maven pom.xml文件详解 一.简介 POM全称是Project Object Model,即项目对象模型. pom.xml是maven的项目描述文件,它类似与antx的project.xml ...
- javaweb web.xml文件详解
web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...
- [转]AndroidManifest.xml文件详解
转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...
- 史上最全的maven的pom.xml文件详解(转载)
此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- AndroidManifest.xml文件详解
本文为安全专家李洋的最新一篇专栏文章<AndroidManifest.xml文件详解>.AndroidManifest.xml是一个跟安全相关的配置文件,该配置文件是Android安全保障 ...
- AndroidManifest.xml文件详解(uses-permission)
语法(SYNTAX): <uses-permissionandroid:name="string"/> 被包含于(CONTAINED IN): <manifest ...
- Java自动化测试框架-12 - TestNG之xml文件详解篇 (详细教程)
1.简介 现在这篇,我们来学习TestNG.xml文件,前面我们已经知道,TestNG就是运行这个文件来执行测试用例的.通过本篇,你可以进一步了解到:这个文件是配置测试用例,测试套件.简单来说,利用这 ...
随机推荐
- Linux经常使用的文件传输的几种方式
Linux经常使用的文件传输的几种方式 1.终端新建stfp协议连接 或者命令方式: sftp -P22 root@192.168.11.100 端口可以不用填写,默认是22,端口的P是大写. 将本地 ...
- 用json方法来作深拷贝应该知道的一点东西!
之前写js比较多的的时候也写过深拷贝,浅拷贝,继承啥的,还有自定义的监听事件.然而过了很久都忘了. 最近在项目上用的深拷贝都是 b = JSON.parse( JSON.stringify(a) ) ...
- 51 Nod 1028 大数乘法 V2【Java大数乱搞】
1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A ...
- [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)
以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= = 定义(来自关于后缀数组的那篇国家集训队论文..) 后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列S ...
- Big Event in HDU(多重背包套用模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...
- More is better(并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=1856 More is better Time Limit: 5000/1000 MS (Java/Others) ...
- git学习四:eclipse使用git提交项目
支持原创:http://blog.csdn.net/u014079773/article/details/51595127 准备工作: 目的:eclipse使用git提交本地项目,提交至远程githu ...
- hbase安装版本
Hbase的安装部署,依赖HDFS,Zookeeper-3.4.5,jDK1.7以上,Hadoop-2.5.0以上
- 布隆(Bloom)过滤器 JAVA实现
前言 Bloom过滤器,通过将字符串映射为信息指纹从而节省了空间.Bloom过滤器的原理为,将一个字符串通过一定算法映射为八个Hash值,将八个Hash值对应位置的Bitset位进行填充.在进行校验的 ...
- [国嵌攻略][106][Linux内存管理子系统]
内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址 ...