组件分析
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由
它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等
Handler:处理器
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由
Handler 对具体的用户请求进行处理。
HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
View Resolver:视图解析器
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名
即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
View:视图
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView
等。我们最常用的视图就是 jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
<mvc:annotation-driven >说明
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使 用 <mvc:annotation-driven > 自动加载 RequestMappingHandlerMapping (处理映射器) 和
RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用
<mvc:annotation-driven >替代注解处理器和适配器的配置。
RequestMapping注解
RequestMapping:
属性: value
path: 用于指定请求的URL 两个一模一样的
例如:path = "/RequestMapping"
method: 用于指定请求的方式
例如:method={RequestMethod.POST} 表示请求方式必须为post
params: 用于指定限定请求参数的条件,要求请求参数的key和value必须和配置一模一样
例如:params={"user"} 表示请求参数必须有user
params={"user=123"} 表示请求参数必须有user=123
params={"user ! 123"}
headers: 用于指定限制类请求消息头的条件
例如:headers={"Accept"} 表示请求头必须有Accept
请求参数的绑定
1. 绑定机制
1. 表单提交的数据都是k=v格式的 username=haha&password=123
2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
3. 要求:提交表单的name和参数的名称是相同的
2. 支持的数据类型
1. 基本数据类型和字符串类型
2. 实体类型(JavaBean) 3. 集合数据类型(List、map集合等)
3. 基本数据类型和字符串类型
1. 提交表单的name和参数的名称是相同的
2. 区分大小写
4. 实体类型(JavaBean)
1. 提交表单的name和JavaBean中的属性名称需要一致
2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:
address.name
5. 给集合属性数据封装
1. JSP页面编写方式:list[0].属性
例如
基本数据类型和字符串类型
<a href="param/paramTest?username=熊大&password=123456">请求参数绑定</a>
JavaBean类中包含其他的引用类型user
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="userName"/><br>
密码:<input type="text" name="password"/><br>
金额:<input type="text" name="money"/><br>
用户姓名:<input type="text" name="user.name"/><br>
用户年龄:<input type="text" name="user.age"/><br>
<input type="submit" value="提交">
</form>
集合数据类型(List、map集合等)下面是 list和map
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="userName"/><br>
密码:<input type="text" name="password"/><br>
金额:<input type="text" name="money"/><br>
用户姓名:<input type="text" name="users[0].name"/><br>
用户年龄:<input type="text" name="users[0].age"/><br>
用户姓名:<input type="text" name="userMap['one'].name"/><br>
用户年龄:<input type="text" name="userMap['one'].age"/><br>
<input type="submit" value="提交">
</form>
常用的注解
RequestParam
作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam("name") String username){
System.out.println("执行了。。。");
System.out.println(username);
return "success";
}
RequestBody
作用:
用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。
get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值
为 false,get 请求得到是 null。
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了。。。");
System.out.println(body);
return "success";
}
PathVaribale
作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
属性
1. value:指定url中的占位符名称
Restful风格的URL
1. 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
restful风格的URL优点
1. 结构清晰
2. 符合标准
3. 易于理解
4. 扩展方便
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable("sid") String id){
System.out.println(id); //520
return "success";
}
<%--PathVariable--%>
<a href="anno/testPathVariable/520">testPathVariable测试</a>
RequestHeader
作用:用于获取请求消息头。
属性: value:提供消息头名称
@RequestMapping("/testRequestHeader")
public String testRequestMapping(@RequestHeader("Accept") String header){
System.out.println(header);
return "success";
}
CookieValue
作用:用于获取指定cookie的名称的值
属性: value:cookie的名称
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
System.out.println(cookieValue);
return "success";
}
ModelAttribute
作用:
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数
据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
System.out.println(cookieValue);
return "success";
}
有返回值
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("执行了。。。");
System.out.println(user);
return "success";
}
@ModelAttribute //返回user传给上面
public User findUser(String name){
System.out.println("findUser执行了。。。。");
//模拟查询
User user = new User();
user.setName(name);
user.setAge(11);
user.setDate(new Date());
return user;
}
没有返回值
@RequestMapping("/testModelAtt
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("u") User user){
System.out.println("执行了。。。");
System.out.println(user);
return "success";
}
//返回user传给上面
@ModelAttribute
public void findUser(String name, Map<String,User> map){
System.out.println("findUser执行了。。。。");
//模拟查询
User user = new User();
user.setName(name);
user.setAge(11);
user.setDate(new Date());
map.put("u",user);
}
SessionAttribute
作用:
用于多次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。
@Controller
@RequestMapping("/anno")
@SessionAttributes("xxx") //把xxx=熊大存到session域对象中
public class AnnoController {
//存入
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("执行了。。。testSessionAttributes");
//底层会存到request域对象中
model.addAttribute("xxx","熊大");
return "success";
}
//获取
@RequestMapping("/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
System.out.println("执行了。。。getSessionAttributes");
//从session域中取
String xxx = (String) modelMap.getAttribute("xxx");
//从session域中取
String xxx1 = (String) modelMap.get("xxx");
System.out.println(xxx);
System.out.println(xxx1);
return "success";
}
//删除
@RequestMapping("/deleteSessionAttributes")
public String deleteSessionAttributes(SessionStatus status){
System.out.println("执行了。。。deleteSessionAttributes");
//清除session
status.setComplete();
return "success";
}