四、SpringMVC之常用注解及restFull连接风格
四、SpringMVC之常用注解
一.注解
[email protected] : 用于方法形参与前台传递参数不一致时的转换, 当配置类该注解时,传递参数必须和该注解中的value一致
[email protected] 从Cookie中获取指定的属性值 ,配置到方法参数上
[email protected] * 配置到方法参数上 从请求中获取指定的头信息
[email protected] : 从占位符中获取数据的 value : 占位符中的属性名
[email protected] 在前置方法中获取请求参数,绑定到request作用域,供控制器方法使用
[email protected] 需要配合Mode对象一起使用 ,将model对象中的数据存入到session域中 names:
[email protected] 配置在控制器方法形参上,用于接收ajax发送来的json请求,并封装到形参对象中
[email protected] 配置在控制器方法返回值中,用于响应ajax请求,可以将方法返回值对象转换为json字符串响应给浏览器
9.SessionStatus:控制器方法形参,可以用于清空session
二、 restFull :url的连接风格
1.通过不同的请求方式get、post、delete、put定位同模块儿的增删改查
2.配合@PathVariable从参数的站位符中获取请求参数
使得url变得更简洁明了
HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE,它们分别对应四种基本的操作,GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。
示例:
—— /order/1 HTTP GET:得到id=1的order
—— /order/1 HTTP DELETE:删除id=1的order
—— /order/1 HTTP PUT:更新id=1的order
—— /order HTTP POST:新增order
package cn.it.demo.controller;
import cn.it.demo.domain.User;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
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.bind.support.SessionStatus;
/**
* [email protected] 需要配合Mode对象一起使用
* 1)将model对象中的数据存入到session域中 names:
* 2)接收string类型数组
* 3)取值:从model对象中获取 model对象中的key
*/
@Controller
@SessionAttributes(names= {"user","user1"})
public class userController {
@RequestMapping(value = "/testSessionAttributes")
public String testSessionAttributes(Model model) {
User userDB = getUserFormDB();
model.addAttribute("user", userDB);
model.addAttribute("user1", userDB);
return "redirect:viewShow.jsp";
}
/**
* [email protected] : 用于方法形参与前台传递参数不一致时的转换,
* 当配置类该注解时,传递参数必须和该注解中的value一致
* 1).value :input表单传递的参数名称 name (需要和value一样)
* 2).required : 配置当前参数是否必须 true:请求必须要携带name属性 false:有没有都可以
* 3).defaultValue : 指定默认值 当参数没有传递值的时候,使用此默认值
* 4).name: 和value的功能一样,可以混用
*/
@RequestMapping("/RequestParam")
public String testRequestMapping(@RequestParam(defaultValue = "cting", value = "name") String username) {
System.out.println(username);
return "success";
}
/**
* [email protected] 从Cookie中获取指定的属性值 ,配置到方法参数上
* 1).value :value : cookie的名称
* 2).required : 配置当前参数是否必须 true:请求必须要携带name属性 false:有没有都可以
* 3).defaultValue : 指定默认值 当参数没有传递值的时候,使用此默认值
*/
@RequestMapping("/servletCookie")
public String testCookieValue(@CookieValue( "JSESSIONID") String cookie) {
System.out.println(cookie);
return "success";
}
/**
* [email protected] * 配置到方法参数上 从请求中获取指定的头信息
* 1).value :value : header中头信息的名称
* 2).required : 配置当前参数是否必须 true:请求必须要携带name属性 false:有没有都可以
* 3).defaultValue : 指定默认值 当参数没有传递值的时候,使用此默认值
*/
@RequestMapping(value = "/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Host") String sessionId) {
System.out.println(sessionId);
return "success";
}
/**
* 使用占位符的形式描述id:{id}
*
* [email protected] : 从占位符中获取数据的 value : 占位符中的属性名
* 1).value :从占位符中获取数据的 value : 占位符中的属性名
* 2).required : 配置当前参数是否必须 true:请求必须要携带name属性
* false:有没有都可以
*/
@RequestMapping(method = RequestMethod.POST, value = "/user/{id}")
public String delUser(@PathVariable("id") String uid) {
System.out.println("del:" + uid);
return "success";
}
/*
* @RequestMapping(method=RequestMethod.GET,value="/user/{id}") public String
* findUser(@PathVariable("id")String uid,String username) {
* System.out.println("find"+uid); System.out.println(username); return
* "success"; }
*/
/**
* 5.
* 第一步:@ModelAttribute 需要配置到方法上
* 此方法,在执行控制器方法之前执行
* 第二步:@ModelAttribute 需要配置到控制器方法形参上,
* 从前置方法封装的model对象中获取数据
* 1)Model(spring提供的对象) 和 request 代表含义类似
* model中数据最终存入到request域中
* 2)Model配置到方法参数中,在方法体中直接使用
* addAttribute("key","value");
* 3)@ModelAttribute :
* 中这些方法的执行顺序
* modelAttributeTest -- updateUser(控制器方法)
* * 全部绑定到一次请求中
*/
//第一、modelMap
@ModelAttribute
public void modelAttributeTest(User user,Model model) {
//查询数据库
System.out.println("也发发起请求参数 : " + user);
User dbUser = this.getUserFormDB();
model.addAttribute("dbUser", dbUser);
//request.setAttribute("dbUser", dbUser);//也可以直接放入request中
}
//第二、@ModelAttribute 配置到方法参数中,从前置方法封装的model对象中获取数据
@RequestMapping("/updateUser")
public String updateUser(@ModelAttribute(value="dbUser") User dbUser) {
// username = 张三 ,修改 age = 1;
System.out.println("从数据库查询的user对象:" + dbUser);
//1.修改用户属性
//2.更新数据库
return "success";
}
/**
*7.SessionStatus:控制器方法形参,可以用于清空session
*/
@RequestMapping(value = "/clearSession")
public String clearSession(SessionStatus sessionStatus) {
sessionStatus.setComplete();
return "loginSuccess";
}
/**
*通过session模拟登录
*/
@RequestMapping(value = "/login")
public String login(User user, HttpSession session) {
User userDB = findUser(user.getUsername());
session.setAttribute("user", userDB);
User u = (User)session.getAttribute("user");
System.out.println(u.getAge());
System.out.println(userDB);
return "loginSuccess";
}
/**
*通过@SessionAttributes配合model模拟登录
*/
@RequestMapping(value = "/login1")
public String login1(User user, Model model) {
User userDB = findUser(user.getUsername());
System.out.println(userDB);
model.addAttribute("user", userDB);
model.addAttribute("user1", userDB);
return "loginSuccess";
}
// 模拟登录获取用户信息
private User findUser(String username) {
User user = new User();
user.setUsername(username);
user.setAge(28);
return user;
}
//从数据库中查询用户
private User getUserFormDB() {
User user = new User();
user.setUsername("张三");
user.setPassword("123456");
user.setAge(121);
return user;
}
}
上一篇: CVE-2017-8464复现
下一篇: CVE-2017-15715 复现