本文详细描述了SpringMVC的常用注解及从前台取值的各种方式,如有不到之处,请指正,如果不明白之处,欢迎留言。
package com.test.controller;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import com.test.entity.User;
@Controller
@SessionAttributes("user")
public class HelloWorldController {
private static final String SUCCESS = "success";
@RequestMapping(value="index")
public String goIndex() {
System.out.println("————————进入首页————————");
return "index";
}
/*
* 使用method来限定请求方式
* @Author chengjunyu
* @date 2019-09-29 22:26:24
*/
@RequestMapping(value="/hello",method=RequestMethod.POST)
public String hello() {
System.out.println("Hello World");
return SUCCESS;
}
/*
* 了解:可以使用params和headers来更加精确的映射请求,params和headers支持简单的表达式
* @Author chengjunyu
* @date 2019-09-29 22:25:35
*/
@RequestMapping(value="testParamsAndHeaders",params= {"name","age"},headers= {"Accept-Language=zh-CN,zh;q=0.9"})
public String testParamsAndHeaders() {
System.out.println("testParamsAndHeaders");
return SUCCESS;
}
/*
* @RequestMapping支持ant风格的URL
* ?:匹配文件名中的一个字符
* *:匹配文件名中的任意字符
* **:匹配多层路径
* @Author chengjunyu
* @date 2019-09-29 22:25:35
*/
@RequestMapping("/testAntPath/**/abc??")
public String testAntPath() {
System.out.println("testAntPath");
return SUCCESS;
}
/*
* @PathVairable 可以将URL中占位符参数绑定到控制器处理方法的入参中,只有一个参数时直接@PathVairable
* @PathVairable 使URL请求路径具有Restful风格
* @Author chengjunyu
* @date 2019-09-29 22:48:17
*/
@RequestMapping("/testPathVariable/{id}/{name}")
public String testPathVariable(@PathVariable("id") Integer id,@PathVariable("name") String name) {
System.out.println("testPathVariable---id:" + id);
System.out.println("testPathVariable---name:" + name);
return SUCCESS;
}
/*
* Rest: 即Representational State Transfer,资源表现层状态转化,是目前最流行的一种互联网软件架构。
* 它结构清晰,符合标准,易于理解,扩展方便。
*
* GET:获取资源
* POST:新增资源
* PUT:更新资源
* DELETE:删除资源
* @Author chengjunyu
* @date 2019-09-29 23:06:52
*/
@GetMapping(value="/testRestful/{id}")
public String testRestful(@PathVariable("id") Integer id) {
System.out.println("testRest Get---id: " + id);
return SUCCESS;
}
@PostMapping(value="/testRestful")
public String testRestful() {
System.out.println("testRest Post");
return SUCCESS;
}
@RequestMapping(value="/testRestful/{id}", method=RequestMethod.PUT)
public String testRestfulPut(@PathVariable("id") Integer id) {
System.out.println("testRest Put---id: " + id);
return SUCCESS;
}
@RequestMapping(value="/testRestful/{id}", method=RequestMethod.DELETE)
public String testRestfulDelete(@PathVariable("id") Integer id) {
System.out.println("testRest Delete---id: " + id);
return SUCCESS;
}
/*
* @RequestParam 映射请求参数
* value:请求参数的参数名
* required:请求参数是否必须,默认为true
* defaultValue:请求参数的默认值
* @Author chengjunyu
* @date 2019-09-29 23:55:13
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(value="id",required=false,defaultValue="10") Integer id, @RequestParam(value="name") String name) {
System.out.println("testRequestParam---id: " + id);
System.out.println("testRequestParam---name: " + name);
return SUCCESS;
}
@RequestMapping("/testRequestNoParam")
public String testRequestNoParam(Integer id, String name) {
System.out.println("testRequestParam---id: " + id);
System.out.println("testRequestParam---name: " + name);
return SUCCESS;
}
/*
* @RequestParam 映射请求头信息
* value:请求头的名称
* @Author chengjunyu
* @date 2019-09-29 23:55:13
*/
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String accpet) {
System.out.println("testRequestParam---Accept: " + accpet);
return SUCCESS;
}
/*
* @CookieValue 可以让处理方法入参绑定请求中的cookie值
* @Author chengjunyu
* @date 2019-09-30 00:09:37
*/
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
System.out.println("testCookieValue---cookId: " + sessionId);
return SUCCESS;
}
/*
* 使用Pojo对象作为参数,支持及联属性
* @Author chengjunyu
* @date 2019-09-30 00:30:37
*/
@RequestMapping(value="/testPojo", method=RequestMethod.POST)
public String testPojo(User user) {
System.out.println("testPojo: " + user);
return SUCCESS;
}
/*
* SpringMVC 提供了以下几种方式输出模型数据:
* 1、ModelView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据
* 2、Map及Model:入参为Model、ModelMap、Map时,处理方法返回时,Map中的数据会自动添加到模型中
* 3、@SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求可以共享该属性
* 4、@NodelAttributes:方法入参标注该注解后,入参的对象就会放到数据模型中
* @Author chengjunyu
* @date 2019-09-30 00:32:53
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
ModelAndView modelAndView = new ModelAndView(SUCCESS);
modelAndView.addObject("name", "cheng");
modelAndView.addObject("age", "22");
Map<String, Object> name = modelAndView.getModel();
System.out.println(name);
return modelAndView;
}
/*
* 目标方法可以添加Map类型,实际也可以是Model或者ModelMap类型
* @Author chengjunyu
* @date 2019-09-30 00:58:12
*/
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map) {
map.put("name", Arrays.asList("cheng","jun","yu"));
map.put("age", "22");
System.out.println("map: " + map);
return SUCCESS;
}
@RequestMapping("/testModelMap")
public String testModel(ModelMap modelMap) {
modelMap.put("name", Arrays.asList("cheng","jun","yu"));
modelMap.put("age", "22");
System.out.println("modelMap: " + modelMap);
return SUCCESS;
}
/*
* @SessionAttributes: 将查出来的数据存放在session中,可以在多个请求中共享,可通过@SessionAttributes()注解进行保存或
* 根据request.getSession.setAttribute()进行保存操作,如果直接保存对象,前台通过${对象.属性}获取属性值,
* 如果直接保存属性,前台直接通过${属性}获取属性值
* @Author chengjunyu
* @date 2019-09-30 01:20:10
*/
@RequestMapping("/testSessionAttribute")
public String testSessionAttribute(HttpServletRequest request) {
User user = new User();
user.setName("cheng");
user.setAge(25);
request.getSession().setAttribute("user", user);
request.getSession().setAttribute("name", user.getName());
request.getSession().setAttribute("age", user.getAge());
return SUCCESS;
}
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(HttpServletRequest request) {
User user = new User();
user.setName("cheng");
user.setAge(25);
return SUCCESS;
}
/*
* @ModelAttribute先将数据从数据库中取出,再进行更新操作
* @Author chengjunyu
* @date 2019-09-30 01:54:02
*/
@RequestMapping("/testWithOutModelAttribute")
public String testWithOutModelAttribute(User user) {
System.out.println("修改后的用户信息为:" + user);
return SUCCESS;
}
@ModelAttribute
public void testModelAttribute(Integer id, Map<String, Object> map) {
if(id != null) {
User user = new User(1, "cheng", "123456", 15);
System.out.println("数据库中的User信息:" + user);
//注意,此处map的key值要和上面方法中的入参一样
map.put("user", user);
}
}
}