SpringMVC简单总结-day02

一、处理模型数据
如果跳转时需要带数据:V、M,则可以使用以下方式:
MOdelAndView、ModelMap、Map、Model -数据放在了request作用域
put put m.addAttribute();

@SessionAttributes:将数据放到session中,如果要在request中存放student对象,则同时将该对象放入session域中
@ModelAttribute:经常在更新中使用,通过@ModelAttribute修饰的方法,会在每次请求前先执行;并且该方法的参数map.put()可以将对象放入即将查询的参数中
map.put(k,v),其中的k,必须时即将查询的方法参数的首字母小写
注意:@ModelAttribute会在该类的每个方法执行前均被执行一次,因为使用时需要注意。


exa:
@SessionAttributes(value="user")
@SessionAttributes(types = {User.class,Student.class})


二、
视图、视图解析器

视图的顶级接口:View
视图解析器:ViewResolver

常见的视图和解析器:
InternalResourceView、InternalResourceViewResolver

public class JstlView extends InternalResourceView:
springMVC解析jsp时,会默认使用InternalResourceView,如果发现Jsp中包含jstl语言,则自动转为JstlView

JstlView 可以解析jstl实现国际化操作

国际化:针对不同不同地区、不同国家,进行不同的显示

具体实现国际化步骤:
a.创建资源文件
基名_语言_地区.properties

三、
InternalResourceViewResolver其他功能
index.jsp --> Controller(@RequestMapping("a")) -->success.jsp

要用springMVC实现:index.jsp --> success.jsp
<mvc:view-controller path="userHeadler/testMMVContro.html" view-name="success"/>

以上注解,会让所有的请求转入<mvc:view...>中匹配地址,而会忽略@RequestMapping();
如果想让@RequestMapping("a")和<mvc:view...>共存,则需要加一个注解
<mvc:annotation-driven></mvc:annotation-driven>

指定跳转方式:return "forward:/jsp/success.jsp";
forward: redirect: 需要注意,此种方式不会被视图解析器加上前缀(/jsp/)、后缀(.jsp)

解决静态资源方法:要让springmvc访问静态资源,只需要加入以下2个注解
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>

四、
类型转换器:
a.Spring自带一些 常见的类型转换器:
public String testDelete(@PathVariable("id") String id)
既可以接受int类型数据id,也可以接受String类型数据id

b.可以自定义类型转换器
i.编写自定义类型转换的类(实现Converter接口)
public class MyConverter implements Converter<String,User>{

@Override
public User convert(String source) { //source:2-zs-123
String[] userStrArr = source.split("-");
User user = new User();
user.setId(Integer.parseInt(userStrArr[0]));
user.setUsername(userStrArr[1]);
user.setPassword(userStrArr[2]);
return user;
}
}

2.配置:将MyConverter加入springmvc中
<!-- 1.将自定义转换器纳入SpringIOC容器 -->
<bean id="myConverter" class="com.jh.headlers.MyConverter"></bean>

<!-- 2.将myConverter在纳入SpingMVC提供的转换器Bean -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myConverter"/>
</set>
</property>
</bean>

<!-- 将onversionService注册到mvc:annotation-driven中 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

index.jsp:
<form action="${pageContext.request.contextPath }/userHeadler/testConverter.html">
学生信息:<input type="text" name="studentInfo">
<input type="submit" value="转换">
</form>

UserHeadler.java:
@RequestMapping("testConverter")
public String testConverter(@RequestParam("studentInfo") User user) {
System.out.println(user);
return "success";
}

其中,@RequestParam("studentInfo")是触发转换器的桥梁
@RequestParam("studentInfo")接受的数据,是前端传递过来的:2-zs-23,但是需要将该数据复制给修饰的目的对象User,因此SpringMVC可以发现接受的数据和目标数据不一致,并且这两种数据分别是String、Student,正好符合public User convert(String source)转换器。

五、
数据格式化
SpringMVC提供了很多注解,方便我们数据格式化
实现步骤:
a.配置
<!-- 配置数据格式化 注解 所依赖的bean-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
</bean>

b.通过注解来使用
@DateTimeFormat(pattern = "yyyy-MM-dd")//格式化前台传递来的数据
private Date birthday;

@NumberFormat(pattern = "###,#")
private int id;

userHeadler.java
@RequestMapping("testFormatters")
public String testFormatters(User user,BindingResult result,Model model) {
System.out.println(user);
model.addAttribute("User", user);
if (result.getErrorCount()>0) {
for (FieldError fieldError : result.getFieldErrors()) {
System.out.println(fieldError.getDefaultMessage());
}
}
return "success";
}

六、
错误消息处理
@RequestMapping("testFormatters")
public String testFormatters(User user,BindingResult result,Map<String, Object> map,Model model) {
需要验证的数据是User中的birthday,SpringMVC要求,如果校验失败,则将错误信息自动放入,该对象之后紧挨着的BindingResult
即User user,BindingResult result之间,不能有其他参数。

如果要将控制台的错误信息,传到jsp中显示,则可以将错误信息对象放入request域中,然后在jsp中从request域中获取。

七、数据校验
JSR303
Hibernate Validator

使用Hibernate Validator步骤:
a.jar
hiberanter-validator.jar
classmate.jar
jboss-logging.jar
validatetion-api.jar
hibernate-validator-annotation-processor

b.配置
<mvc:annotation-driven></mvc:annotation-driven>
此时mvc:annotation-driven的作用:要实现Hibernate Validator/JSR303校验(或者其他各种校验),必须实现springMVC提供的一个接口:ValidatorFactory。
LocalValidatorFactoryBean是ValidatorFactory的一个实现类。
<mvc:annotation-driven></mvc:annotation-driven>会在spring容器中,自动加载一个LocalValidatorFactoryBean类,因此可以直接实现数据校验。

c.直接使用注解

@Past
@DateTimeFormat(pattern = "yyyy-MM-dd")//格式化前台传递来的数据
private Date birthday;

在校验的Controller中,给校验的对象前增加@Valid
@RequestMapping("testFormatters")
public String testFormatters(@Valid User user,BindingResult result,Map<String, Object> map,Model model) {
System.out.println(user);
model.addAttribute("User", user);
if (result.getErrorCount()>0) {
for (FieldError fieldError : result.getFieldErrors()) {
System.out.println(fieldError.getDefaultMessage());
map.put("errors", result.getFieldErrors());//将错误信息传到request域中
}
}
return "success";
}

八、Ajax请求SpringMVC,并且JSON格式的数据
a.
jackson-annotations.jar
jackson-core.jar
jackson-databin.jar

b.
@ResponseBody修饰的方法,会将该方法的返回值,以一个json数组的形式返回给前台

@ResponseBody
告诉SpringMVC,此时的返回,不是一个View页面,而是一个ajax调用的返回值(json数组)

前台:
$(document).ready(function(){
  $("#testJson").click(function() {
    //通过ajax请求springMVC
    $.post(
      "${pageContext.request.contextPath }/userHeadler/testJson.html",//服务器地址
      //{"name":"zs"},
      function(result){//服务端处理完毕后的回调函数 List<Student> students,加上@ResponseBody后,students实质是一个json数组的格式
        for (var i = 0; i < result.length; i++) {
          alert(result[i].id+"-"+result[i].username+"-"+result[i].password+"-"+result[i].email+"-"+result[i].birthday);
        }
      }
    );
  });
})

原文地址:https://www.cnblogs.com/LEPENGYANG/p/14754453.html