默认Tomcat是可以处理静态资源的(通过DefaultServlet处理在%tomcat_home%/conf/web.xml中),但是我们配置了SpringMVC后, 往往会将DispatcherServlet的拦截路径设置成"/",会将Tomcat中默认的DefaultServlet覆盖掉,所以静态资源也会进入DispatcherServlet中处理,而默认DispatcherServlet中是没有处理静态资源相关的逻辑, 所以访问静态资源就会报404
配置< mvc:default-servlet-handler />
将静态资源交还给容器来处理(比如说Tomcat就是让DefaultServlet来处理)
在dispatcher-servlet.xml配置文件中配置下面的一行配置即可
<mvc:resources mapping="/static/**" location="/static/" />
放行静态资源, mapping匹配你请求的URI; location指定静态资源相对位置,会将mapping中通配部分的内容拼到location指定的相对位置后面
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:resources mapping="/static/**" location="/static/" />
beans>
浏览器访问地址
http://localhost:8080/springmvc/static/index.html
SpringMVC提供了一个MultipartResolver接口用于支持文件上传。 MultipartResolver有两个实现类分别基于apache file-upload包和Serlvet3.0 API方式的文件上传。他们是:
通过apache common file-upload包的Servlet 2.5的方式上传文件
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.3.3version>
dependency>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
支持"maxUploadSize", “maxInMemorySize” and "defaultEncoding"三个参数
注意: apache file-upload相关的依赖需要自己另外添加进来
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>servlet 2.5方式文件上传title>
head>
<body>
<form enctype="multipart/form-data" action="upload2" method="post">
<input type="file" name="myFile" />
<input type="submit" value="提交" />
form>
body>
html>
UploadController .java
@Controller
public class UploadController {
@ResponseBody
@RequestMapping("/upload2")
public String upload2(@RequestParam("myFile") MultipartFile file){
try {
file.transferTo(new File("D:/" + file.getOriginalFilename()));
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}
通过Servlet 3.0的方式上传文件
<servlet>
<servlet-name>dispatcherservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>WEB-INF/dispatcher-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
<multipart-config />
servlet>
<servlet-mapping>
<servlet-name>dispatcherservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<bean name="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">bean>
在Controller中处理文件上传:
@Controller
public class FileUploadController {
@PostMapping("/form")
public String handleFormUpload(@RequestParam("name") String name,@RequestParam("file")MultipartFile file) {
if (!file.isEmpty()) {
byte[] bytes = file.getBytes();
// 将字节存储在某处
return "redirect:uploadSuccess";
}
return "redirect:uploadFailure";
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>servlet 2.5方式文件上传title>
head>
<body>
<form enctype="multipart/form-data" action="upload3" method="post">
<input type="file" name="myFile" />
<input type="submit" value="提交" />
form>
body>
html>
UploadController .java
@Controller
public class UploadController {
@ResponseBody
@RequestMapping("/upload3")
public String upload3(@RequestParam("myFile") MultipartFile file){
try {
file.transferTo(new File("D:/" + file.getOriginalFilename()));
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}
注意:上传文件响应中文内容会乱码
解决方法点击此处
在src\main\webapp\WEB-INF\dispatcher-servlet.xml配置文件中添加下面的配置
<mvc:interceptors>
<bean class="com.lanou3g.springmvc.interceptor.TestInterceptor"/>
mvc:interceptors>
(执行handler之前)preHandle
(执行handler之后)postHandle
(请求完成,返回到客户端之前)afterCompletion
TestInterceptor.java
public class TestInterceptor implements HandlerInterceptor {
/**
* 在调用实际的handler执行之前被DispatcherServlet(大总管)调用
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("TestInterceptor-preHandle");
return true;
}
/**
* 在调用实际的handler执行之后被DispatcherServlet(大总管)调用
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("TestInterceptor-postHandle");
}
/**
* 请求完成以后被DispatcherServlet(大总管)调用
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("TestInterceptor-afterCompletion");
}
}