Spring MVC 常用注解 和session界面渲染取值
@RequestParams
name 修饰当前形参的属性
value 和name属性一样 也是修饰当前属性
defaultValue 给属性设置一个默认值
默认属性 required 必备属性
1. value:请求参数中的名称
2. required:请求参数中是否必须提供此参数,默认值是true,必须提供
前端:
<a href="/params/params?name=老王"> params获取信息</a>
controller
@RequestMapping(value = "/params") public String params( String username){ // 如果我们现在设置的形参和前端传递来的 参数名不同就会接受不到就会显示null System.out.println(username); // null return "success"; }
上面就是传递来的参数和形参不同所以就会报错
我们可以使用指定的一个参数名之后 你传递任意的参数先用它来接受再传递给形参
@RequestParam(value = "name")
controller : 这就是你所有的传递来的信息都会先被value接受然后再传递给username 这样就不会出现信息不同 并且 value和name对应的是你的传递来的属性的名字
@RequestMapping(value = "/params") public String params( @RequestParam(value = "name",required=false) String username){ // 如果我们现在设置的形参和前端传递来的 参数名不同就会接受不到就会显示null System.out.println(username); return "success"; }
defaultValue给传递来的属性设置一个默认值
public String def(@RequestParam(defaultValue ="隔壁老王") String username){ //给username设置一个默认值:隔壁老王
@RequestBody 获取请求体中的key:value
因为是获取请求体中的信息所有 对于get请求不适用
既然是获取请求体重的数据那么只能是非get请求了
前端:
<form action="/params/body" method="post"> User名字:<input name="username" /><br/> User密码:<input name="u_password"/><br/> User日期:<input name="date"/><br/> <input type="submit" value="提交"/> </form>
controller
@RequestMapping(value = "body") public String body(@RequestBody String body){ //获取请求体中的信息 System.out.println(body); return "success"; }
输出是:
username=zy&u_password=321&date=2132
PathVariable
拥有绑定url中的占位符 url中有/delete/{id},{id}就是占位符
1. value:指定url中的占位符名称
1. 请求路径一样,可以根据不同的请求方式去执行后台的不同方法 2. restful风格的URL优点
1. 结构清晰 2. 符合标准 3. 易于理解 4. 扩展方便
前端: 前端传值就是直接/值 而不是值=信息
<a href="/params/pathvariable/3">pathvariable</a>
controller:
/** * @PathVariable注解 * @param id * @return */ @RequestMapping("/pathvariable/{id}") public String testPathVariable(@PathVariable(value = "id") String id){ System.out.println(id); return "success"; }
输出的是就是你传递来的id的值
RequestHeader 获取请求头中的信息
因为是获取请求头中的信息那么参数只能是用Accept来接收
前端:
<a href="/params/header">RequestHeader</a>
controller:
/** * RequestHeader注解 获取请求头中的信息 * @param header * @return */ @RequestMapping("/header") public String header(@RequestHeader(value = "Accept") String header){ //请求头必选要Accept的信息来获取 System.out.println(header); return "success"; }
CookieValue注解 获取指定cookie名称的值
因为你发送的cookie服务端的session一定会传递回来一个cookie对应的值 JESSIONID那么我们必须定义JESSIONID来接收 不然也会报错
前端:
<a href="/params/cookie">CookieValue</a>
controller:
/** * 获取指定的cookie信息 * @param cookie * @return */ @RequestMapping("/cookie") public String cookie(@CookieValue(value = "JSESSIONID") String cookie){ System.out.println(cookie); return "success"; }
-
出现在方法上:表示当前方法会在控制器方法执行前线执行。
-
出现在参数上:获取指定的数据给参数赋值。
2. 应用场景
1. 当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。
如果出现在方法上 加了ModelAttrbute注解的方法会优先其他的方法来执行的
前端:
<form action="/params/model" method="post"> User名字:<input name="username" /><br/> User密码:<input name="u_password"/><br/> User日期:<input name="date"/><br/> <input type="submit" value="提交"/> </form>
controller:
@RequestMapping("/model") public String model(){ System.out.println("我是model方法"); return "success"; } @ModelAttribute public void modelattribute(){ System.out.println("我是modelattribute"); }
输出:
可以看出 使用在方法中 ModelAttribute注解会优先其他的方法先执行 我们可以在这一层中进行数据的过滤
修饰的方法有返回值:
@RequestMapping("/model") public String model(User user){ System.out.println(user); return "success"; } @ModelAttribute public User modelattribute(String username ){ User user = new User(); user.setUsername(username); user.setU_password("123"); user.setDate(new Date()); return user; }
输入:
输出:
User{username='zy', u_password='123232', date=Mon Mar 04 00:00:00 CST 2019}
修饰的方法没有返回值就是要在第二次执行的方法中也要设置其接收值,在方法中先对接收的值进行设置 再对下面要执行的方法中进行值得设置
@ModelAttribute public void modelattribute(String username, Map<String,User>map){ User user = new User(); user.setUsername(username); user.setU_password("123"); user.setDate(new Date()); map.put("abc",user); //把信息放在abc中 } @RequestMapping("/model") public String model(@ModelAttribute(value = "abc") User user){ //通过ModelAttribute来接收其中map的值 System.out.println(user); return "success"; }
SessionAttributes 注解
1. 作用:用于多次执行控制器方法间的参数共享
2. 属性
1. value:指定存入属性的名称
这个方法是作用在类上的 所以我们要在进入的类上进行引用
我们之前再界面上获取后端传递来的值都是通过model来获取的 那么我们现在也可以通过session来获取信息
界面取值除了通过model.addAttribute渲染过来的一个一个取值之外还可以通过requestScope来同意进行取值
eg:
后端传来三个值
model.addAttribute("username","root"); model.addAttribute("password","123"); model.addAttribute("age",20);
我可以通过requestScope来统一取值
${requestScope.username}
这是request的取值 那么我们想要从session中取值就用sessionScope来取值
但是sessionScope必须要通过@SessionAttributes 注解来进行搭配使用不然是没有值得
SessionAttributes就是把你方法中定义的参数给放到session中
类: @Controller @RequestMapping(path = "/params") @SessionAttributes(value = {"username","password","age"}) //这是把方法中的定义的参数给放在了 session中 前端就可以通过session取值了 public class ParamsController { 方法: @RequestMapping("/session") public String session(Model model){ //通过model向界面传递数据 model.addAttribute("username","root"); model.addAttribute("password","123"); model.addAttribute("age",20); return "out"; }
既然我们可以通过session传递到界面值 那么我们也可以通过SessionAttributes来获取session中的信息
获取信息就要通过ModelMap 来进行信息获取了
@RequestMapping("/find") public String find(ModelMap modelMap){ // 通过modelMap去上面类设定的session中获取数据 String name = (String)modelMap.get("username"); // 从session中获取数据 String password = (String) modelMap.get("password"); Integer age = (Integer) modelMap.get("age"); System.out.println("username:"+name+":"+"passowrd"+password+":"+"age"+age); return "out"; }
我们不仅仅可以获取数据还可以删除数据
SessionStatus 来设置setComplate来清空信息
清除信息:
@RequestMapping("/delete") public String delete(SessionStatus status){ status.setComplete(); //对所有的属性进行 清空 return "success"; }
.