@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";
}
}