文章目录
第二章 SpringMVC注解式开发
所需依赖
<dependencies>
<!-- jackson依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<!-- springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
1. @RequestMapping注解的使用
属性:value 请求的uri地址。
位置:
1)在方法的上面,必须的。
@RequestMapping(value = "/some.do",method = RequestMethod.GET)
public ModelAndView doSome(){}
@RequestMapping(value = "/other.do",method = RequestMethod.POST)
public ModelAndView doOther(){}
@RequestMapping(value = "/other.do",method = RequestMethod.POST)
public ModelAndView doOther(){}
2)在类的上面作为模块的名称
在类的上面作为模块的名称
http://localhost:8080/ch02_requestmapping/test/some.do
http://localhost:8080/ch02_requestmapping/test/second.do
test 是公用的前缀字符串。可以使用@RequestMapping放在类上,表示与test相关的操作。例如在StudentController类上面加上@RequestMapping("/student")。类中的方法上加上@RequestMapping(value = {"/add.do","/first.do"}) @RequestMapping(value = {"/query.do","/second.do"}),项目网站的不同的URL分别是
http://localhost:8080/ch02_requestmapping/student/add.do
http://localhost:8080/ch02_requestmapping/student/query.do
分别代表了与student相关的添加和查询操作。
2.接收请求中的参数
对应HttpServletRequest , HttpServletResponse ,只需要在控制器方法的形参列表中,定义就可以了。框架会给参数赋值,在控制器方法内部可以直接使用request , response ,session参数。
400: http status, 表示客户端异常。主要是发生在用户提交参数过程中。
接收请求中的参数:逐个接收,对象接收
2.1 逐个接收
逐个接收:请求中的参数名和控制器方法的形参名一样。安装名称对应接收参数。
<form action="receive-property.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交参数">
</form>
Controller接收参数
@RequestMapping(value = "receive-property.do")
public ModelAndView doPropertyParam(HttpServletRequest request,String name,int age) throws UnsupportedEncodingException {};
接收参数的问题:
- 参数最好使用包装类型。例如Integer,能接收空值情况,接收的是null
- 框架可以使用String到int , long .float , double等类型的转换。
- post请求中有乱码的问题,使用字符集过滤器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6v9XUeo-1636009861551)(C:\Users\高昱泽\Desktop\SpringMVC详解(二)]\image-20211101203114904.png)
不加过滤器就会出现乱码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4migAyVd-1636009861554)(C:\Users\高昱泽\Desktop\SpringMVC详解(二)]\image-20211101203143199.png)
2.2 CharacterEncodingFilter使用:
在web.xml
<!-- 声明过滤器,框架提供的,解决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>
<init-param>
<!-- 强制请求(request)对象 使用encoding 的编码方式-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 强制应答(response)对象使用encoding的编码方式-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 强制所有请求,先经过过滤器处理-->
<url-pattern>/*</url-pattern>
</filter-mapping>
2.3 请求中参数名和形参名不一样,使用@RequestParam
* 逐个接收请求参数,请求中参数名和形参名不一样
* @RequestPara : 解决名称不一样的问题
* 属性:value 请求中的参数名称
* required ;boolean类型的,默认是true
* true : 请求中必须有此参数,没有报错。
* false: 请求中可以没有此参数。
* 位置·:在形参定义的前面
* */
@RequestMapping(value = "receive-param.do")
public ModelAndView doReceiveParam(
@RequestParam(value = "rname",required = false) String name,
@RequestParam(value = "rage",required = false) Integer age) {};
2.4 对象接收
对象接收:在控制器方法的形参是java对象,使用java对象的属性接收请求中的参数值。
要求 : java对象的属性名和请求中参数名一样。
例子:
public class Student {
// 属性名和请求中参数名一样
private String name;
private Integer age;
//get和set方法
// controller
* 使用对象接收请求中的参数
* 要求:参数名和java对象的属性名一样。
* java类需要有一个无参数构造方法,属性有set方法
*
* 框架的处理:
* 1.调用Student的无参数构造方法,创建对象
* 2.调用对象set方法,同名的参数,调用对应的set方法。
* 参数是name,调用setName(参数值)
* */
@RequestMapping("/receive-object.do")
public ModelAndView doReceiveObject(Student student){
System.out.println("MyController的方法doReceiveObject="+student);
ModelAndView mv = new ModelAndView();
mv.addObject("myname",student.getName());
mv.addObject("myage",student.getAge());
mv.setViewName("show");
return mv;
}
3.控制器方法的返回值
控制器方法的返回值表示本次请求的处理结果,返回值有ModelAndView,String,void,Object。
请求的处理结果包含:数据和视图。
3.1 ModelAndView 数据和视图。
请求的结果有数据和视图,使用ModelAndView最方便。
数据:存放request作用域。
视图:执行forward转发操作
实例
resources下的springmvc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- springmvc的配置文件-->
<!-- 声明组件扫描器-->
<context:component-scan base-package="com.sunny.controller"/>
<!-- 声明视图解析器:帮助处理视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:指定视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀:视图文件的拓展名-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Controller
/**
* 控制器方法返回String,表示逻辑名称。需要项目中配置视图解析器。
* */
@RequestMapping(value = "/return-string-view.do")
public String doReturnStringView1(HttpServletRequest request,String name,int age) throws UnsupportedEncodingException {
System.out.println("执行了MyController的doReturnStringView1方法name="+name+",age="+age);
//处理数据
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//返回结果,forward,转发到show.jsp
//逻辑名称,需要配置视图解析器
return "show";
}
jsp
<p>控制器返回String-逻辑视图名称</p>
<form action="return-string-view.do" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交参数">
</form>
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>shoiw</title>
</head>
/WEB-INF/view/show.jsp,显示request作用域中的数据<br/>
<H3>myname数据: ${myname}</H3>
<h3>myage数据: ${myage}</h3>
</body>
</html>
3.2 String视图
框架对返回值是String,执行的是forward转发操作。视图可以表示为完整视图路径,或者使用的逻辑名称。
PS: resources下的springmvc.xml 中视图解析器直接注释掉。
* 控制器方法返回String,表示完整视图路径。需要项目中不能配置视图解析器。
* */
@RequestMapping(value = "/return-string-view2.do")
public String doReturnStringView2(HttpServletRequest request,String name,int age) throws UnsupportedEncodingException {
System.out.println("执行了MyController的doReturnStringView2方法name="+name+",age="+age);
// 处理数据
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//返回结果,forward,转发到show.jsp
//视图解析器 /WEB-INF/view/WEB-INF/view/show.jsp 这样有重复的,页面找不到
return "/WEB-INF/view/show.jsp";
}
3.3 void 没有数据和视图 (了解就可以,比较少用)
void:没有数据和视图,可以使用HttpServletResponse对象输出数据,响应ajax请求。
/**
* 控制器方法返回是void,响应ajax请求,使用HttpServlet输出数据
*
* **/
@RequestMapping("/return-void-ajax.do")
public void returnVoiidAjax(HttpServletResponse response, String name, Integer age) throws IOException {
System.out.println("处理void返回类型,name="+name+",age="+age);
//调用service得到结果对象
Student student = new Student();
student.setName(name+"同学");
student.setAge(age);
//把对象转为json
ObjectMapper om =new ObjectMapper();
String json = om.writeValueAsString(student);
System.out.println("服务器端对象转为的json==="+json);
// 输出json,响应ajax
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
}
ajax
<head>
<title>请求方式</title>
<script type="text/javascript" src="js/jquery-3.4.1.js"></script>
<script type="text/javascript">
$(function () {
//绑定事件
$("#btnAjax").on("click",function () {
$.ajax({
url:"return-void-ajax.do",
data:{
name:"lisi",
age:20
},
dataType:"json",
success:function (resp) {
//resp = XMLHttpRequest.responseText;
alert("resp===="+resp.name+"===="+resp.age);
}
})
})
})
</script>
</head>
3.4 Object
返回值Student 表示数据,还是视图。所以控制器方法返回对象Object,用来响应ajax请求。返回对象Object,可以是List,Student,Map,String,Integer…这些都是数据,而ajax请求需要的是数据。在ajax请求中,一般需要从服务器返回的是json格式的数据,经常要处理java对象到json的转换。而且还需要输出数据响应ajax请求。框架提供了处理java对象到json转换,还有数据输出的工作。
3.4.1 HttpMessageConverter 消息转换器
HttpMessageConverter 接口,作用是 1)实现请求的数据转为java对象,2)把控制器方法返回的对象转为 json,xml,text,二进制等不同格式的数据。
视图html,jsp发起请求,传递数据 name =lisi age=20 或者json数据{name:“zhangsan”,age:20}
Controller接收数据。框架提供了HttpMessageConverter接口能接收数据。、
1)接收name,age ,或json数据,把这些数据转为java对象,给你的controller使用。
2)控制器方法返回对象,把对象转为json,或者其他数据格式。
public Student doAjax(){
return new Student("lisi",20);
}
public interface HttpMessageConverter<T> {
/**
作用:检查claz这个类型的对象,能否转为mediaType表示的数据格式
如果能转为mediaType表示的类型,返回true,返回true调用read()。
*/
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
/**
作用:接收请求中的数据,把数据转为 clazz 表示的对象。
*/
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
/**
作用:检查clazz这种数据类型,能否转为mediaType表示的数据格式。
*/
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
/**
作用:把t对象,按照contentType说明的格式,把对象转为json或者xml。
*/
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
MediaType : 媒体类型,表示互联网中数据的格式。例如application/json , text/html , image/gif
HttpMessageConverter接口的实现类:
MappingJackson2HttpMessageConverter:使用jackson工具库中的ObjectMapper把java对象转为json数据格式
StringHttpMessageConverter:把字符串类型的数据,进行格式转换和编码。
怎么使用实现类:
框架根据控制器方法的返回类型,自动查找使用的实现类。
@RequestMapping("/return-void-ajax1.do")
public Student returnVoiidAjax1(Student student) {
System.out.println("处理void返回类型,name="+name+",age="+age);
Student student = new Student();
student.setName("lisi");
student.setAge(20);
return student;
}
默认情况下:springmvc使用了HttpMessageConverter接口的4个实现类。包括了StringHttpMessageConverter。需要在springmvc的配置文件,加入注解驱动的标签。mvc:annotation-driven。加入这个标签后,springmvc项目启动后,会创建HttpMessageConverter接口的七个实现类对象,包括StringHttpMessageConverter和MappingJackson2HttpMessageConverter。
在resources文件下的springmvc.xml中添加
<!-- 声明注解驱动:创建HttpMessageConverter接口的7个实现类对象-->
<mvc:annotation-driven/>
3.4.2 @ResponseBody
@ResponseBody注解的作用,就是把Student转换后的json通过HttpServletResponse对象输出给浏览器。
// 输出json,响应ajax
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
@ResponseBody 注解作用就是上面的代码实现
3.4.3 控制器方法返回对象转为json的步骤
1)pom.xml加入jackson 依赖,springmvc框架,默认处理json就是使用jackson
2)在springmvc的配置文件中,加入注解驱动的标签mvc:annotation-driven
3)在控制器方法的上面加入@ResponseBody注解,表示返回值数据,输出到浏览器。
json 数组
* 控制器方法返回是List<Student> --- json array
* */
@RequestMapping("/doListJsonArray.do")
@ResponseBody
public List<Student> doAjaxJsonArray(String name,Integer age){
System.out.println("控制器方法返回的是List<Student>,转为jsonarray。"+name+"=="+age);
Student student = new Student();
student.setAge(20);
student.setName("张三同学");
Student student1 = new Student();
student1.setName("李四同学");
student1.setAge(26);
List<Student> list = new ArrayList<>();
list.add(student);
list.add(student1);
return list;
}
<script type="text/javascript">
$(function () {
//绑定事件
$("#btnAjax").on("click",function () {
$.ajax({
//url:"doStudentJson.do",
url:"doListJsonArray.do",
data:{
name:"lisi",
age:20
},
dataType:"json",
success:function (resp) {
//resp = XMLHttpRequest.responseText;
//alert("resp===="+resp.name+"===="+resp.age);
$.each(resp,function(i,n){
// n {"name":"李四同学","age":26}
alert("n name="+n.name+"===age"+n.age);
})
}
})
})
})
</script>
控制器方法返回String–数据
* 控制器方法返回String--数据
*
* 区分返回值String是数据还是视图:
* 1.方法上面有@ResponseBody注解就是数据
* 2.方法上面没有@ResponseBody注解就是视图
*
* Content-Type: text/plain;charset=ISO-8859-1
*
* 解决中文,需要使用@ResponseBody的produces属性。
* producess属性:指定content-type的值。
*
* 框架处理String返回值
* 1.框架使用的StringHttpMessageConverter
* 2.StringHttpMessageConverter使用的是Content-Type: text/plain;charset=ISO-8859-1
content-type : 告诉浏览器,怎么显示服务器返回的数据
* */
@RequestMapping(value = "/doStringData.do",produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name,Integer age){
System.out.println("控制器方法返回String,是数据");
return "Hello SpringMVC注解式开发";
}
$(function () {
//绑定事件
$("#btnAjax").on("click",function () {
$.ajax({
url:"doStringData.do",
data:{
name:"lisi",
age:20
},
dateType:"text",
success:function (resp) {
alert("resp==="+resp);
}
})
})
})
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 声明springmvc的核心对象
访问mymvc地址后,报错 文件没有找到,找的文件/WEB-INF/springmvc-servlet.xml
/WEB-INF/myweb-servlet.xml
错误原因:
在Servlet的init()方法中,创建springmvc使用的容器对象WebApplicationContext.
WebApplicationContext ctx = new ClassPathXmlApplicationContext("配置文件");
1.配置文件的默认路径: /WEB-INF/<servlet-name>-servlet.xml-->
<servlet>
<servlet-name>myweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 2.自定义配置文件的位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--
表示服务器tomcat创建对象的顺序,是个整数值,大于等于0.
数值越小,创建对象的时间越早。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myweb</servlet-name>
<!--
url-pattern 作用:把一些请求交给指定的servlet处理
使用中央调度器(DispatcherServlet)
1.使用拓展名方式,格式 *.xxx,xxx是自定义的拓展名。
例如 *.do , *.action, *.mvc 等等。 不能使用*.jsp
<url-pattern>*.do</url-pattern>
http://localhost:8080/myweb/some.do
http://localhost:8080/myweb/user/list/queryUser.do
2.使用斜杠 “/”
<url-pattern>/mymvc</url-pattern>
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 声明过滤器,框架提供的,解决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>
<init-param>
<!-- 强制请求(request)对象 使用encoding 的编码方式-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 强制应答(response)对象使用encoding的编码方式-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 强制所有请求,先经过过滤器处理-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
4.静态资源的处理
访问地址:
当web.xml中DispatcherServlet的url-pattern是 *.do
http://localhost:8080/ch05_url_pattern/images/p1.jpg tomcat
http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js tomcat
http://localhost:8080/ch05_url_pattern/index.jsp tomcat
http://localhost:8080/ch05_url_pattern/html/test.html tomcat
http://localhost:8080/ch05_url_pattern/some.do DispatcherServlet(springmvc框架)
4.1 tomcat的default servlet
tomacat安装目录/conf/web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
default 叫做默认servlet,作用:
1.它提供静态资源的处理。
2.它处理所有未映射到其他请求的请求处理。
4.2 中央调度器设置“ / ” 产生的问题
http://localhost:8080/ch05_url_pattern/index.jsp tomcat成功访问
http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js tomcat 404 没有对应的控制器对象
http://localhost:8080/ch05_url_pattern/images/p1.jpg tomcat 404 没有对应的控制器对象
http://localhost:8080/ch05_url_pattern/html/test.html tomcat 404 没有对应的控制器对象
http://localhost:8080/ch05_url_pattern/some.do 200 MyController
2.使用斜杠 “/” 。导致中央调度器称为了默认的default servlet。
需要处理静态资源和其他的未映射的请求。默认中央调度器没有处理
静态资源的控制器对象,所以静态资源都是 404 。some.do这个请求
有MyController对象,所以能访问。
如果项目中,中央调度器设置了“/”,动态资源能访问,静态资源不能访问。
需要处理静态资源的访问工作。
4.3 第一种方式处理静态资源
在springmvc的配置文件加入 mvc:default-servlet-handler标签,springmvc框架会在项目运行时,加入DefaultServletHttpRequestHandler对象,让这个对象处理静态资源的访问。
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"
>
<!-- springmvc的配置文件-->
<!-- 声明组件扫描器-->
<context:component-scan base-package="com.sunny.controller"/>
<!-- 声明视图解析器:帮助处理视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:指定视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀:视图文件的拓展名-->
<property name="suffix" value=".jsp"/>
</bean>
声明注解驱动:
default-servlet-handler 和@RequestMaping使用有冲突。 加上注解驱动就能解决问题
<mvc:annotation-driven/>
声明静态资源的第一种方式
创建DefaultServletHttpRequestHandler处理静态资源。
DefaultServletHttpRequestHandler把接收的静态资源的地址,转发给tomcat的default.
优点:
解决方式简单
缺点:
依赖tomcat服务器提供的能力。
<mvc:default-servlet-handler/>
</beans>
2.4 第二种静态资源的处理方式(推荐使用)
在springmvc配置文件中加入一个 mvc:resources 标签,框架会创建ResourceHttpRequestHandler控制器对象,使用这个对象处理静态资源的访问。不依赖tomcat服务器。推荐使用。
当静态资源比较多时,就在webapp目录下创建一个static目录放静态资源。
声明注解驱动:
default-servlet-handler 和@RequestMaping使用有冲突。 加上注解驱动就能解决问题
resources 和@RequestMaping使用有冲突。
<mvc:annotation-driven/>
声明静态资源的第二种处理方式
mapping:访问静态资源的uri地址,可以使用通配符。(**)
**:表示任意的目录和资源名称
location:静态资源在项目中的位置,不要使用/WEB-INF目录
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
一句话设置静态资源
<mvc:resources mapping="/static/**" location="/static/"/>
</beans>