SpringMVC是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB模块,通过注解让一个简单的java类成为处理请求的控制器。它主要分为model(数据模型)、view(JSP、HTML请求)、Controller(接收用户请求)。那它在三层架构的位置是什么呢,一张图代表一下:
SpringMVC的优点很多,这里不一一概述,介绍几个主要的:
 可能很多的开发人员没有用Struts2,但是在面试中问道了SpringMVC,然后一般与Struts2的对比也是无可难免的,所以这里大概介绍一下;
共同点
不同点
在优势中我已经介绍了,SpringMVC角色划分清晰,然后对于前端请求页面,他们是如何工作的呢。下面一张图表示了
用户请求到达前端控制器,它就相当于 mvc 模式中的 c, dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求, dispatcherServlet 的存在降低了组件之间的耦合性。
HandlerMapping 负责根据用户请求找到 Handler 即处理器, SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。在这里我们我们可以类比我们的插排;
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
View Resolver 负责将处理结果生成 View 视图, View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
视图模型进行渲染,将模型数据填充到视图中,最常用的是JSP,然后通过页面标签或页面摸板技术将模型数据通过页面展示给用户。
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使 用 mvc:annotation-driven 自 动 加 载 RequestMappingHandlerMapping ( 处 理 映 射 器 ) 和
RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用mvc:annotation-driven替代注解处理器和适配器的配置。
我们在tomcat中部署SpringMVC中的启动流程,如下图:
它的作用就是把请求中指定名称的参数给控制器中的形参赋值。
jsp中url传参
requestParam 注解
Controller接收
/**
* requestParams 注解的使用
* @param username
* @return
*/
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,
@RequestParam(value="age",required=false)Integer age){
System.out.println(username+","+age);
return "success";
}
作用主要是用于绑定 url 中的占位符。 例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。它也是restful的一种风格。可以跟RequestParam对比着学习,他们两个都是对于单独的参数的传值形式,但是url后面的格式不同。
jsp中url传参
pathVariable 注解
Controller接收
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
它的作用用来获取请求体内容,直接使用得到的是key=value&key=value…结构的数据。而且需要注意:请求方式需要时post方式。
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
 出现在参数上,获取指定的数据给参数赋值。
场景
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
获取到请求头,用的地方比较到,这里作为了解。
主要是用来把指定 cookie 名称的值传入控制器方法参数。
@Controller("sessionAttributeController")
@RequestMapping("/springmvc")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
/**
* 把数据存入 SessionAttribute
* @param model
* @return
* Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
* 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
*/
@RequestMapping("/testPut")
public String testPut(Model model){
model.addAttribute("username", "泰斯特");
model.addAttribute("password","123456");
model.addAttribute("age", 31);
//跳转之前将数据保存到 username、 password 和 age 中,因为注解@SessionAttribute 中有
这几个参数
return "success";
}
@RequestMapping("/testGet")
public String testGet(ModelMap model){
System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
ge"));
return "success";
}
@RequestMapping("/testClean")
public String complete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
}