一、pojo

Spring mvc 会按请求参数名和pojo属性名进行自动匹配,自动为该对象填充属性值,并且支持级联属性

表单:

<form action="springmvc/testPojo" method="post">
username: <input type="text" name="username"/>
<br>
password: <input type="password" name="password"/>
<br>
email: <input type="text" name="email"/>
<br>
age: <input type="text" name="age"/>
<br>
city: <input type="text" name="address.city"/>
<br>
province: <input type="text" name="address.province"/>
<br>
<input type="submit" value="Submit"/>
</form>

pojo:

User类

private Integer id;

private String username;
private String password;

private String email;
private int age;

private Address address;

Address类

private String province;
private String city;

@RequestMapping("/testPojo")
public String testPojo(User user) {
System.out.println("testPojo: " + user);
return SUCCESS;
}

二、servlet API

Spring mvc 还支持原生的servlet API

可以使用servlet原生的API作为目标方法的参数 具体支持以下类型

HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale InputStream
OutputStream
Reader
Writer

@RequestMapping("/testServletAPI")
public void testServletAPI(HttpServletRequest request,
HttpServletResponse response) throws IOException {
System.out.println("testServletAPI, " + request + ", " + response);
return "success";
}

三、spring mvc 处理模型数据之ModelAndView

目标方法的返回值可以使ModelAndView类型。

其中可以包含视图和模型信息

spring mvc会把ModelAndView的model中数据放到request域对象中

@RequestMapping(value="/testModelAndView")
public ModelAndView testModelAndView(){
String viewName= "success";
ModelAndView modelAndView = new ModelAndView(viewName);
modelAndView.addObject("time",new Date());
return modelAndView;

}

jsp页面取值:time:${requestScope.time}

四、spring mvc处理模型数据之Model

目标方法可以添加Map类型(实际上也可以是Model类型或者ModelMap类型的)的参数

@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
System.out.println(map.getClass().getName());
map.put("names", Arrays.asList("Tom", "Jerry", "Mike"));
return SUCCESS;
}

取值:names: ${requestScope.names }

与ModelAndView的关系是,Map类型也会转化成ModelAndView类型,其中Map中的值存放到ModelAndView的modelMap中,而方法的返回值放在了ModelAndView的viewName中

五、SessionAttributes注解

除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值),还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值)

@SessionAttributes(value={"user"}, types={String.class})

注意: 该注解只能放在类的上面. 而不能修饰方法.

六、ModelAttribute注解(笔记)

/**
* 运行流程:
* 1. 执行 @ModelAttribute 注解修饰的方法: 从数据库中取出对象, 把对象放入到了 Map 中. 键为: user
* 2. SpringMVC 从 Map 中取出 User 对象, 并把表单的请求参数赋给该 User 对象的对应属性.
* 3. SpringMVC 把上述对象传入目标方法的参数.
*
* 注意: 在 @ModelAttribute 修饰的方法中, 放入到 Map 时的键需要和目标方法入参类型的第一个字母小写的字符串一致!
*
* SpringMVC 确定目标方法 POJO 类型入参的过程
* 1. 确定一个 key:
* 1). 若目标方法的 POJO 类型的参数木有使用 @ModelAttribute 作为修饰, 则 key 为 POJO 类名第一个字母的小写
* 2). 若使用了 @ModelAttribute 来修饰, 则 key 为 @ModelAttribute 注解的 value 属性值.
* 2. 在 implicitModel 中查找 key 对应的对象, 若存在, 则作为入参传入
* 1). 若在 @ModelAttribute 标记的方法中在 Map 中保存过, 且 key 和 1 确定的 key 一致, 则会获取到.
* 3. 若 implicitModel 中不存在 key 对应的对象, 则检查当前的 Handler 是否使用 @SessionAttributes 注解修饰,
* 若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所
* 对应的 value 值, 若存在则直接传入到目标方法的入参中. 若不存在则将抛出异常.
* 4. 若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 则
* 会通过反射来创建 POJO 类型的参数, 传入为目标方法的参数
* 5. SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中, 进而会保存到 request 中.
*
* 源代码分析的流程
* 1. 调用 @ModelAttribute 注解修饰的方法. 实际上把 @ModelAttribute 方法中 Map 中的数据放在了 implicitModel 中.
* 2. 解析请求处理器的目标参数, 实际上该目标参数来自于 WebDataBinder 对象的 target 属性
* 1). 创建 WebDataBinder 对象:
* ①. 确定 objectName 属性: 若传入的 attrName 属性值为 "", 则 objectName 为类名第一个字母小写.
* *注意: attrName. 若目标方法的 POJO 属性使用了 @ModelAttribute 来修饰, 则 attrName 值即为 @ModelAttribute
* 的 value 属性值
*
* ②. 确定 target 属性:
* > 在 implicitModel 中查找 attrName 对应的属性值. 若存在, ok
* > *若不存在: 则验证当前 Handler 是否使用了 @SessionAttributes 进行修饰, 若使用了, 则尝试从 Session 中
* 获取 attrName 所对应的属性值. 若 session 中没有对应的属性值, 则抛出了异常.
* > 若 Handler 没有使用 @SessionAttributes 进行修饰, 或 @SessionAttributes 中没有使用 value 值指定的 key
* 和 attrName 相匹配, 则通过反射创建了 POJO 对象
*
* 2). SpringMVC 把表单的请求参数赋给了 WebDataBinder 的 target 对应的属性.
* 3). *SpringMVC 会把 WebDataBinder 的 attrName 和 target 给到 implicitModel.
* 近而传到 request 域对象中.
* 4). 把 WebDataBinder 的 target 作为参数传递给目标方法的入参.
*/

/**
* 1. 有 @ModelAttribute 标记的方法, 会在每个目标方法执行之前被 SpringMVC 调用!
* 2. @ModelAttribute 注解也可以来修饰目标方法 POJO 类型的入参, 其 value 属性值有如下的作用:
* 1). SpringMVC 会使用 value 属性值在 implicitModel 中查找对应的对象, 若存在则会直接传入到目标方法的入参中.
* 2). SpringMVC 会一 value 为 key, POJO 类型的对象为 value, 存入到 request 中.
*/

@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,
Map<String, Object> map){
System.out.println("modelAttribute method");
if(id != null){
//模拟从数据库中获取对象
User user = new User(1, "Tom", "123456", "tom@atguigu.com", 12);
System.out.println("从数据库中获取一个对象: " + user);

map.put("user", user);
}
}

@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改: " + user);
return SUCCESS;
}

七、视图和视图解析器

执行流程:请求方法执行完成之后,不管返回的是一个String、Model或ModelMap类型的,Spring mvc会在内部将他们装配成一个ModelAndView对象,Spring mvc借助于视图解析器,得到真正的物理视图,一个view对象,最终调用view render方法得到相应结果。常用的视图InternalResourceView,视图解析器InternalResourceViewResolver,InternalResourceView用来创建jsp,InternalResourceViewResolver是支持InternalResourceView的解析器,InternalResourceView是用来创建在同一个web应用下用来转发的结果

八、JSTL

若项目中导入了

jstl.jar
standard.jar

两个jar包,则spring mvc会自动把视图由InternalResourceView 转为 JstlView

若使用JSTL的fmt标签,则需要在Spring MVC的配置文件中配置国际化资源文件

<!-- 配置国际化资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>

使用方法:①导入jar包②编写国际化文件i18n.properties③在Spring MVC的配置文件中配置国际化资源文件

④在jsp中导入ftm标签:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

⑤使用ftm标签:<fmt:message key="i18n.username"></fmt:message>

九、<mvc:view-controller/>的使用

<!-- 配置直接转发的页面 -->
<!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. -->
<mvc:view-controller path="/success" view-name="success"/>

<!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签 -->
<mvc:annotation-driven></mvc:annotation-driven>

十、BeanNameViewResolver解析器

①自定义一个视图,实现view接口

@Component
public class HelloView implements View {

@Override
public String getContentType() {
// TODO Auto-generated method stub
return "text/html";
}

@Override
public void render(Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
response.getWriter().print("hello view , time:"+new Date());

}

将此视图交给IOC容器管理

②在spring mvc 的配置文件中配置解析器

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>

注意优先级

<!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高 -->

<!--InternalResourceViewResolver解析器的order值最大-->

③方法

<!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 -->

@RequestMapping(value="/testView")
public String testView(){
System.out.println("testView");
return "helloView";
}

④调用

<a href=springmvc/testView>testView</a>

十一、重定向

只需要在返回的名字前面加上redirect:就可以了

最新文章

  1. 命令行用sublime打开当前目录
  2. c++共享内存(转载)
  3. HTML&lt;marquee&gt;标签
  4. hdu 5288 OO’s Sequence 枚举+二分
  5. PSI在windows server2008服务器上的安装方法
  6. git学习一
  7. DLL中导出STL模板类的问题
  8. UVA 6199 不定根最小树形图
  9. jquery的选项卡事件
  10. 同步Flex Chart的数据提示
  11. 各浏览器的cookie的name个数/最大容量限制测试
  12. 《Machine Learning》系列学习笔记之第四周
  13. Linux核心命令
  14. mysql 各种关系代数的使用
  15. hello2 源码解析
  16. double转换为二进制
  17. Flatpak 1.1.0发布:可终止运行Flatpak实例
  18. 将替代ListView的RecyclerView 的使用(一)
  19. CF1096G Lucky Tickets
  20. POJ 1386 Play on Words (有向图欧拉路径判定)

热门文章

  1. UBUNTU下Y86模拟器的安装和使用
  2. android 蓝牙串口通讯使用简介
  3. mfc通过消息传递参数进行程序间通信
  4. EntityFramework Core 学习笔记 —— 包含与排除属性
  5. linux 循环处理文件夹下所有文件脚本
  6. jquery简单动画
  7. INSTALLMENT of QValue
  8. storm-kafka组件中KafkaOffsetMetric相关统计指标说明
  9. 《BI那点儿事》数据流转换——透视
  10. Java:描述反射机制的作用?举几个反射的应用?