【SpringMVC学习笔记】2.常用注解Ⅲ

@ModelAttribute

如果某些对象从头到尾每次请求当中都要存在,不消失,就适合这么用

使用方式一:

使用方式二:

使用方式三:

如果没有传递这个模型过来,那么方法上加了@ModelAttribute的为你提供,如果你从前台传了就用你的

 

@SessionAttribute

要求当前这次访问中的会话里必须要有某个对象

 

@SessionAttributes

这个用在类上面。它会将模型自动填充到会话中去

package com.cyk.controller;

import com.cyk.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@RequestMapping("/user3")
@SessionAttributes("user")
public class User3Controller {

    @ModelAttribute("user")
    public void init(Model model){
        System.out.println("init...........");
        User user = new User();
        model.addAttribute("user",user);
    }

    @RequestMapping("/login")
    public String login(@ModelAttribute User user){
        System.out.println(user.getName());
        return "redirect:/jsp/user.jsp";
    }
}

 

@RestController

Controller + RequestBody

 

@RequestParam

 

@RequestBody

返回json数据,可以将@RestController放在类上,代替掉@Controller,可使该类中的方法都不必加@RequestBody,避免遗漏了某一方法的@RequestBody

 

@InitBinder

 

关于Post请求中文乱码问题解决(控制台乱码)

添加一个过滤器即可,springmvc提供了非常好的字符编码过滤器,所以注册一个即可

<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <!--  指定字符编码-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceRequestEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
</filter>

  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

<!--  注册一个支持所有http请求类型的过滤器-->
  <filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 

关于form表单提交数据的方式

@ResponseBody

用于返回数据的,一般情况下返回json格式

方式一:通过属性名字绑定

通过属性名称进行绑定,可以完成数据传递。页面当中表单元素的name值要和后台的形参的名字保持一致。

方式二:利用@RequestParam

jsp页面不变

方式三:直接使用pojo形式传递

User.java(String name //getter and setter)

 

关于form表单提交日期格式数据的处理

(这部分的put方法使用PostMapping一直不成功,改成RequestMapping才可以,暂时不知道为什么PostMapping会出问题)

1.处理日期

package com.cyk.controller;

import com.cyk.pojo.User;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
@RequestMapping("/user")
public class UserController {

    @InitBinder("user")
    public void init(WebDataBinder dataBinder){
//        这里指定什么格式,前台就只能传什么格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setLenient(false);
        dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sdf,false));
    }

    @PostMapping("/put")
    //需要额外的json包的支持
    @ResponseBody
    public String put(@ModelAttribute("user") User user){
        System.out.println(user.getName());
        System.out.println(user.getBirth());
        return "ok";
    }
}

通过InitBinder指定了user名字和ModelAttribute里面的user绑定

2.不指定名字,根据数据类型一样可以解析转换成功

@Controller
@RequestMapping("/user")
public class UserController {

    @InitBinder
    public void init(WebDataBinder dataBinder){
//        这里指定什么格式,前台就只能传什么格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setLenient(false);
        dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sdf,false));
    }

    @PostMapping("/put")
    //需要额外的json包的支持
    @ResponseBody
    public String put(@ModelAttribute User user){
        System.out.println(user.getName());
        System.out.println(user.getBirth());
        return "ok";
    }
}

3.时间+日期

@Controller
@RequestMapping("/user")
public class UserController {

    @InitBinder
    public void init(WebDataBinder dataBinder){
//        这里指定什么格式,前台就只能传什么格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setLenient(false);
        dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sdf,false));
    }

    @PostMapping("/put")
    //需要额外的json包的支持
    @ResponseBody
    public String put(@ModelAttribute User user){
        System.out.println(user.getName());
        System.out.println(user.getBirth());
        return "ok";
    }
}

4.在属性上面添加额外注解(不需要InitBinder和ModelAttribute)

//    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birth;

@CookieValue

package com.cyk.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/cookie")
public class CookieController {

    @RequestMapping("/c")
    public String c(@CookieValue("JSESSIONID") String jsessionid){
        System.out.println(jsessionid);
        return "msg";
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值