启动顺序
在web.xml中定义的Spring的配置文件一般有两个:
1、Spring上下文环境的配置文件:applicationContext.xml
1 2 3 4 5 6
| <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:applicationContext.xml </param-value> </context-param>
|
2、SpringMVC配置文件:spring-servlet.xml
1 2 3 4 5 6 7 8 9
| <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
|
加载顺序是:首先加载Spring上下文环境配置文件,然后加载SpringMVC配置文件,并且如果配置了相同的内容,SpringMVC配置文件会被优先使用。
所以这里需要注意一个问题,一定要注意SpringMVC配置文件内容不要把Spring上下文环境配置文件内容覆盖掉。
比如在Spring上下文环境配置文件中先引入service层,然后又加入了事务:
1 2 3 4 5 6 7
| <context:component-scan base-package="com.acms.service"></context:component-scan>
<bean id="transactionManagerOracle" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSourceOracle" /> </bean> <tx:annotation-driven transaction-manager="transactionManagerOracle" />
|
但是在SpringMVC配置文件中却默认引入所有类(当然也包括service层),但是没有加入事务
1
| <context:component-scan base-package="com.acms"></context:component-scan>
|
那么这时事务功能是无法起作用的,也就是代码中加入@Transactional注解是无效的。
所以为了防止这种问题一般是在Spring上下文配置文件中引入所有的类,并且加上事务:
1 2 3 4 5 6 7
| <context:component-scan base-package="com.acms"></context:component-scan>
<bean id="transactionManagerOracle" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSourceOracle" /> </bean> <tx:annotation-driven transaction-manager="transactionManagerOracle" />
|
而在SpringMVC配置文件中只引入controller层:
1 2
| <context:component-scan base-package="com.acms.controller" /> <context:component-scan base-package="com.acms.*.controller" />
|
来源:http://blog.csdn.net/trigl/article/details/52073457
Spring MVC的web.xml配置详解
1、Spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name)
2、在web.xml配置监听器ContextLoaderListener(listener-class)
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
3、部署applicationContext的xml文件:contextConfigLocation(context-param下的param-name)
4、DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。
DispatcherServlet(servlet-name、servlet-class、init-param、param-name(contextConfigLocation)、param-value)在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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_3_0.xsd">
<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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext.xml</param-value> </context-param> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.json</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.map</url-pattern> </servlet-mapping> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.html</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/nopage.html</location> </error-page> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/error.html</location> </error-page> <session-config> <session-timeout>360</session-timeout> </session-config> </web-app>
|
来源:http://blog.csdn.net/u010796790/article/details/52098258
listener、 filter、servlet 加载顺序
context-param -> listener -> filter -> servlet
对于某类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。servlet 同 filter 类似 ,此处不再赘述。
如果要指定serverlet拦截“/”根目录处理欢迎页,必须加入下面这一项
1 2 3
| <welcome-file-list> <welcome-file></welcome-file> </welcome-file-list>
|
Spring MVC 去掉静态资源的拦截
当springMVC配置前端控制器拦截的所有请求时,去掉静态资源的拦截
1、前端控制器的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <servlet> <servlet-name>springMVC</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>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
|
/ 表示拦截所有的请求,包括静态资源
<url-pattern>/</url-pattern>
表示拦截所有的请求,包括静态资源
2、去静态资源拦截有三种方式
1、在web.xml中配置映射
2、在springMVC.xml中配置映射
3、在springMVC.xml中添加静态资源默认Servlet处理
方式一
在web.xml中配置映射
1 2 3 4 5 6 7 8 9 10
| <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> <url-pattern>*.css</url-pattern> <url-pattern>*.ico</url-pattern> <url-pattern>/img/*</url-pattern> <url-pattern>/fonts/*</url-pattern> <url-pattern>/font/*</url-pattern> </servlet-mapping>
|
可以根据自身情况,来配置映射
注意: 请将它放在所有Servlet的最前面(为了让它最先匹配),这样的话性能上应该比较好
方式二
在springMVC.xml中添加静态资源的映射
1 2 3
| <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/> <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
|
根据实际情况自行配置
方式三
在springMVC.xml中添加静态资源默认Servlet处理
1 2 3
| <mvc:default-servlet-handler/>
<mvc:default-servlet-handler default-servlet-name="myDefaultServlet"/>
|
注意: 这种方式对spring版本必须要求3.0.5及以上
来源:http://blog.csdn.net/mybook201314/article/details/73484686
SpringMVC上传图片以及 nginx + tomcat 动静分离
nginx作为web服务器不能解析jsp等页面,只能处理js、css、html等静态资源。所以可以使用nginx反向代理来找到图片来显示(后面会写),图片在数据库就保存为反向代理所指定的路径。
前台–使用kindeditor富编辑器来完成图片上传的前台代码以及回显(href一个图片地址,比如 image.xxx.com)。
后台–使用springmvc处理:
1、
1 2 3 4 5
| <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency>
|
2、
1 2 3 4 5
| <!-- 上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 5MB,它的单位是byte --> <property name="maxUploadSize" value="5242880"></property> </bean>
|
3、写一个controller,有@ResponseBody,返回一个由ObjectMapper将一个对象转为可以被kindeditor识别的json字符串。另外,由于kindeditor的缘故,这个controller的响应头要用text/json,而不是常用的application/json。使用
@RequestMapping(value = “/upload”, method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE)解决。参数是@RequestParam(“uploadFile”) MultipartFile uploadFile
4、对图片进行校验:从文件名、大小、内容三方面考虑。内容是在图片写到磁盘后,使用BufferedImage来校验宽高
5、指定图片存放的真实路径,可以DateTime来根据时间创建文件夹和重新定义文件名。比如E:\xxx\upload\image\2017\07\20\xxxxxx.jpg
6、返回到前台一个引用地址,用来保存到数据库(前台最终使用提交来保存所有信息),比如http://image.xxx.com/image/2017/07/20/xxxxxx.jpg
7、使用uploadFile.transferTo(newFile)将图片写到磁盘,校验图片内容,如果不符合则newFile.delete();
8、mapper.writeValueAsString(fileUploadResult)返回。fileUploadResult对象里面封装的内容就是kindeditor要求的。
9、nginx配置:
除了使用连接tomcat的server,再加一个指定本地文件的server:
1 2 3 4 5 6 7
| server { listen 80; server_name image.xxx.com; location / {# /表示port后第一个反斜杠,即这个反斜杠前面的东西,会被下面替代 root E:\\xxx\\upload; } }
|
当访问http://image.xxx.com/image/2017/07/20/xxxxxx.jpg时,
反向代理到E:\xxx\upload\image\2017\07\20\xxxxxx.jpg这个地址
来源:http://blog.csdn.net/u011302734/article/details/75453878