什么是springmvc
Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。Spring Web MVC的正式名称来自其源模块(Spring -webmvc)的名称,但它更常见的名称是Spring MVC。
为什么要用Spring MVC
- 简化传统servlet处理请求代码
- 是spring的一部分,与spring无缝集成
- 提供大量API可以直接使用
执行流程分析
- 从浏览器发送请求到服务器,在servlet查找对应的servlet,映射把请求都交给核心控制器DispatcherServlet
- DispatcherServlet去springmvc.xml查找请求对应的Controller
- DispatcherServlet将请求转发到对应的Controller
- Controller中对应的方法区处理请求,并将结果返回给DispatcherServlet,DispatcherServlet再返回给浏览器
url-pattern的写法
url-pattern可以写成任意方法:*.action *.do *.abc
只要配置的url-pattern可以匹配请求就可以将请求转发给DispatcherServlet
一般情况下设置为*.do ,但是现在restful风格越来越流行可以设置url-pattern为/
这样设置之后所有的请求都会交给DispatcherServlet处理,静态资源也会交给DispatcherServlet处理,所以会出现静态资源无法访问的问题
解决方式:
- defaultServlet
打开你的tomcat中conf/web.xml,在这个文件中有一个叫做DefaultServlet的配置,当系统找不到处理某次url请求该交由谁处理的时候,就会交给这个servlet处理。我们可以通过使用这个DefaultServlet来处理静态资源,在你的系统中的web.xml文件中添加下面配置,要添加在DispatcherServlet的前面,这样系统就会将带有下面后缀名的请求交给defaultservlet来处理
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</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>*.css</url-pattern>
</servlet-mapping>
- mvc:default-servlet-handler
<mvc:default-servlet-handler/>
- mvc:resources
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:annotation-driven/>
如果不加注解驱动会出现404错误
注解的使用
注册扫描器
<!-- 注册组件扫描器 -->
<context:component-scan base-package="com.monkey1024.*"/>
@Controller:表示当前类是个Controller
@RequestMapping:表示当前方法为Controller的方法,该方法对执行value的url进行处理和响应。
@RequestMapping(value="/test.do",method = RequestMethod.*):请求的提交方式,*可以是post,get等
params属性:@RequestMapping(value="/test.do" , params={“name” , “age”}) 请求中必须携带name age
@RequestMapping(value="/test.do" , params={"!name" , “age”})
要求请求中必须携带请求参数 age,但必须不能携带参数 name
@RequestMapping(value="/test.do" , params={“name=jack” , “age=23”})
要求请求中必须携带请求参数 name,且其值必须为jack;必须携带参数 age,其值必须为 23
接收表单中的数据
如果表单中传过来的名称和方法参数一致则会直接赋值
Controller方法中参数列表是否需要写request和response,写不写都没有影响,spring mvc会为5个参数自动赋值:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- 请求携带的参数
- 用于承载数据的Mode
请求参数乱码问题:在web.xml中配置
<!--字符编码过滤器-->
<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>
<!--强制指定字符编码,即如果在request中指定了字符编码,那么也会为其强制指定当前设置的字符编码-->
<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>
参数名不一致:可以使用@RequestParam()注解来解决,这个注解的三个属性:
- value:指定请求参数的名称,即表单中input的name值。
- name:同value,两者只能使用一个
- required:指定该参数是否是必须传入的,boolean类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为 false,则表示有没有均可。
- defaultValue:指定当前参数的默认值。如果请求中没有该参数,则当前方法参数将取该默认值。
路径变量:除了接收表单提交的数据还可以获取url中携带的信息,@PathVariable注解可以解决,包含以下几个属性:
- value:指定请求参数的名称,即url中的值,当url中的名称和方法参数名称不一致时,可以使用该属性解决。
- name:同value,两者只能使用一个
- required:指定该参数是否是必须传入的,boolean类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为 false,则表示有没有均可。
Controller方法返回值
返回值类型:
- ModelAndView
需要跳转到jsp或资源,又要传递数据 - String
跳转资源 - void
如果你不用spring mvc帮你完成资源的跳转,此时可以将controller中的方法返回值设置为void。一般情况下有下面两个应用场景:
通过原始的servlet来实现跳转 // 不走视图解析器
request.getRequestDispatcher("/jsp/welcome.jsp").forward(request,response);
ajax响应
out.write(jsonString);
- 自定义类型
方法上加@ResponseBody注解
转发和重定向
转发:Controller中返回ModelAndView默认使用转发,显式使用则在setViewName()指定视图前加forward;视图解析器会失效
重定向:在指定视图前加redirect
string类型返回值的转发和重定向则在字符串前加上forward/redirect: