zoukankan      html  css  js  c++  java
  • 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);
            }
          }
        );
      });
    })

  • 相关阅读:
    用js完成毫秒格式数据的日期格式化任务
    廖雪峰js教程笔记3
    事务在 更新和 插入中的用法(转自他人)
    左连接 用于 列转行的一个想法
    MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
    python中的内方法
    波非那切数列
    python修改最大递归数
    odoo开发微信小程序需要的三个包:xmltodict、pycrypto、itsdangerous
    解决json dumps不能序列化datatime数据类型的问题,通过重写JSONEncoder
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/14754453.html
Copyright © 2011-2022 走看看