springMVC最重要的就是前端控制器DispatchServlet了。他是整个springMVC应用的核心。需要将它配置在web.xml中。
1.DispatchServlet的配置
<!--配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化加载配置文件 spring ioc 初始化-->
//如果没有配置init-param,应用程序默认会到WEB-INF目录下找servletName-servlet.xml的配置文件
//servletName指的是前端控制器的名称即<servlet-name>springmvc</servlet-name>中指定的springmvc
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!--标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.@Controller注解
使用该注解时不需要实现Controller接口。只需要将该注解标注在类上面就表示他是一个控制器了,
然后通过spring的扫描机制找到该类就行,<context:component-scan base-package="包名">
与实现接口相比较,使用注解可以同时处理多个请求,而使用接口一次只能处理一个请求。
3.@RequestMapping注解
RequestMapping用于映射一个请求或者一个方法。可以标注在类上,也可以标注在方法上。例如:
@Controller
@RequestMapping("/jason")
public class FirstController {
@RequestMapping("/test")
public String handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Model model)
throws Exception {
model.addAttribute("msg", " hello springMVC ");
return "redirect:http://www.baidu.com";
}
}
请求路径则变为http://localhost:8080/springmvc/jason/test
3.1 @RequestMapping注解的属性
@RequestMapping注解的属性有7个,都是可选属性,默认为value,@RequestMapping(value="/jason"),
但是当只有一个属性的时候,与@RequestMapping("/jason")是一样的。
@RequestMapping的属性如下表所示
属性名 | 类型 | 描述 |
name | String | 可选属性,用于为映射地址指定别名 |
value | String[] | 可选属性,同时也是默认属性。用于映射一个请求和一种方法,可以标注在类和或一个方法上 |
method | RequestMethod[] | 可选属性,用于指定该方法用于处理那种类型的请求方式,其请求方式包括get、post、head、options、put、patch、delete和trace,例如method=RequestMethod.GET表示只支持get请求,如果需要支持多个请求方式则需要通过{}写成数组的形式,并且多个请求之间用英文逗号分隔 |
params | String[] | 可选属性,用于指定Reques中必须包含某些参数的值,才可以通过其标注的方法处理 |
headers | String[] | 可选属性,用于指定Reques中必须包含某些指定的header的值,才可以通过其标注的方法处理 |
consumes | String[] | 可选属性,用于指定处理请求的提交内容类型(Content-type),例如application/json、text/html等 |
produces | String[] | 可选属性,用于指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型 |
4.组合注解
@GetMapping:匹配get方式的请求
@PostMapping:匹配post方式的请求
@PutMapping:匹配put方式的请求
@DeleteMapping:匹配Delete方式的请求
@PatchMapping:匹配Patch方式的请求
get和post的区别:
最直接的区别,GET请求的参数是放在URL里的,POST请求参数是放在请求body里的;
GET请求的URL传参有长度限制,而POST请求没有长度限制;
GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制
详情参见:https://www.cnblogs.com/logsharing/p/8448446.html
5.请求处理方法的参数类型和返回类型
请求处理方法的参数类型比较多,这里主要说返回类型
请求处理的返回类型主要有:
ModelAndView,Model,Map,View,String,void,HttpEntity<?>
或者ResponseEntity<?>,Callable<?>,DeferredResult<?>
最常见的就是ModelAndView,String,void了
其中ModelAndView类型中可以添加Model数据,并指定视图;
String类型的返回值可以跳转视图但是不能携带数据,要与Model参数一起搭配使用才行;
而void类型主要在异步请求时使用,它只返回数据,不会跳转视图。
String类型除此之外还可以(redirect)重定向和(forward)请求转发。
重定向写法为 return "redirect:queryUser";请求转发写法为 return "forward:editUser";
6.视图解析器
<!--定义视图解析器-->
<bean id="ViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
可以设置前缀和后缀,将路径简化。
7.@RequestBody注解
用于将请求体中的数据绑定到方法的形参中。该注解用在方法的形参上面。
也就是将json格式数据映射绑定到形参上。
8.@ResponseBody注解
用于直接返回return对象。该注解用在方法上。也就是直接返回json格式数据。
9.@PathVariable注解
用于获取url路径中的参数。用在方法的形参上面,也就是形参名和url路径上的参数名对应起来。