SpringMVC 学习笔记心得(四)常用注解详解

在springmvc中,许多注解能够帮助我们大大提高开发效率,这里小编讲述一下最常见的七种注解

1. RequestParam注解

  1. 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
  2. 属性
    1. value:请求参数中的名称
    2. required:请求参数中是否必须提供此参数,默认值是true,必须提供

概念引导:

/* 接收请求  @return */ 
@RequestMapping(path="/testParam")
 public String testParam(@RequestParam(value="username",required=false)String name)  {
   System.out.println(name); 
   return "success";
   }

注意:传值要与注解中的参数对应,否则将不会被自动封装上,则会变成null值,2.当添加了注解required=false,如果不参入参数也不会抛出400请求错误,如果不添加,默认需要传入参数,否则会报400错误


2. RequestBody注解

  1. 作用:用于获取请求体的内容(注意:get方法不可以)
  2. 属性
    required:是否必须有请求体,默认值是true

2.1 引导案例:

  @RequestMapping(value = "/testBody")
    public String testBody(@RequestBody String body){
        System.out.println("testBody Method ... ");
        System.out.println(body);
        return "success";
    }

2.2 表单内容如下:

<form action="/test/testBody" method="post">

    姓名:<input type="text" name="username" />
    密码:<input type="text" name="password" />
    金额:<input type="text" name="money" />
    <input type="submit" value="提交" />

</form>

2.3 提交页面:
在这里插入图片描述

输出结果:
testBody Method …
username=%C3%A7%C2%BD%C2%97%C3%A4%C2%B8%C2%BD%C3%A4%C2%B8%C2%9D%C3%A5%C2%A1%C2%94&password=1024&money=200.5

2.4 注意:解决乱码的问题:在web.xml中配置

<!-- 配置过滤器  -->

  <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>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

deploy服务器,输出结果:
testBody Method …
username=罗丽丝塔&password=1024&money=200.5

3. PathVariable注解

  1. 作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
  2. 属性
    1. value:指定url中的占位符名称
  3. Restful风格的URL
    1. 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
    2. restful风格的URL优点
      1. 结构清晰
      2. 符合标准
      3. 易于理解
      4. 扩展方便

3.1 引导案例:

@RequestMapping("/testVaripoty/{id}")
    public String testVaripoty(@PathVariable(name = "id") String id){
        System.out.println("testVaripoty Method ... ");
        System.out.println(id);
        return "success";
    }

3.2 传值测试:

<a href="testVaripoty/100">测试PathVariable</a>

3.3 结果输出:

testVaripoty Method ... 
100

这里注意:这里的写法格式是/路径/{参数名},在传值的时候也是“路径/值”,在传参数的时候不要习惯性的把 ‘ / ’ 写成 ’?‘

4. RequestHeader注解

  1. 作用:获取指定请求头的值
  2. 属性
    value:请求头的名称

4.1 引导案例:

@RequestMapping(path="/testHeader") 
		public String testHeader(@RequestHeader(value="Accept") String header) { 
		System.out.println(header);
		 return "success"; 
 }

5. CookieValue注解

  1. 作用:用于获取指定cookie的名称的值
  2. 属性
    value:cookie的名称

5.1 引导案例:

@RequestMapping(path="/testCookie") 
public String testCookie(@CookieValue(value="JSESSIONID") String cookieValue) { 
System.out.println(cookieValue); 
return "success"; 
}

5.2 注意:JSESSIONID是固定写法,在浏览器中可以看到的,这里写错了也是获取不到的

6. ModelAttribute注解

  1. 作用
    1. 出现在方法上:表示当前方法会在控制器方法执行前线执行。
  2. 出现在参数上:获取指定的数据给参数赋值。
  3. 两种实现方式:@ModelAttribute中设置返回对象 ; 使用map集合 + @ModelAttribute ( value = key) 的形式 完成

6.1 引导案例:(返回对象方式)

 @ModelAttribute
    public UserAccount firModol(String username){
        System.out.println("welcome ..." + username);
        //模拟查询数据库操作
        UserAccount userAccount = new UserAccount();
        userAccount.setUsername(username);
        userAccount.setPassword("1234465");
        return userAccount;
    }

    @RequestMapping("/testModolAttribute")
    public String testModolAttribute(UserAccount userAccount){
        System.out.println(userAccount);
        return "success";
    }

6.2 表单填写:

在这里插入图片描述

输出结果:
welcome …罗丽丝塔
UserAccount{username=‘罗丽丝塔’, password=‘33333’, money=null}

这里小编对为什么密码是33333做一个解释,@ModelAttribute表示最先被执行,小编在里面设置了密码,模拟查询数据库,但是此时小编提交的新的数据过来,于是将原来的数据覆盖了,就变成了表格中填写的数据,有点类似于修改个人资料的操作

6.3 引导案例(MAP+@ModelAttribute)

@ModelAttribute
    public void firModol(String username , Map<String , UserAccount> map){
        System.out.println("welcome ..." + username);
        UserAccount userAccount = new UserAccount();
        userAccount.setUsername(username);
        userAccount.setPassword("1234465");
        map.put("userAccounts",userAccount);
    }

    @RequestMapping("/testModolAttribute")
    public String testModolAttribute(@ModelAttribute(value = "userAccounts") UserAccount userAccount){
        System.out.println(userAccount);
        return "success";
    }

6.4 form表单填写:
在这里插入图片描述
6.5 输出结果:

welcome ...奥尼斯汀
UserAccount{username='奥尼斯汀', password='1024', money=null}

7. SessionAttributes注解

  1. 作用:用于多次执行控制器方法间的参数共享
  2. 属性
    value:指定存入属性的名称

7.1 引导案例:创建TestSessionAttributes类

@Controller
@SessionAttributes(value = "msg")//将msg存入Session域中
public class TestSessionAttributes {

    @RequestMapping("/setSessionAttribute")
    //Model底层实现就是存入request域中
    public String setSessionAttribute(Model model){
        System.out.println("setSessionAttribute  ...");
         model.addAttribute("msg","美美");
        return "success";
    }
}

7.2 获取session

@RequestMapping("/getSessionAttribute")
    public String getSessionAttribute(ModelMap modelmap){
        System.out.println("getSessionAttribute  ...");
        String msg = (String) modelmap.get("msg");
        System.out.println("msg : " + msg);
        return "success";
    }

7.3 删除Session域

@RequestMapping("/delSessionAttribute")
    public String delSessionAttribute(SessionStatus sessionStatus){
        System.out.println("delSessionAttribute  ...");
        sessionStatus.setComplete();
        return "success";
    }

7.4 jsp页面编写

<a href="setSessionAttribute">setSessionAttribute</a>
<a href="getSessionAttribute">getSessionAttribute</a>
<a href="delSessionAttribute">delSessionAttribute</a>

7.5 success界面编写(注意不要忽略isELIgnored=false)

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Success</h1>

${msg}

${sessionScope}

</body>
</html>

7.6 页面测试

7.6.1 点击setSessionAttribute

在这里插入图片描述

7.6.2 点击getSessionAttribute

在这里插入图片描述

7.6.3 点击delSessionAttribute

在这里插入图片描述
这里还有个美美是因为request域中没有被清除,但是session域中已经被清楚了

这里就是常用的七大注解了,如有讲错的地方欢迎大家指正

猜你喜欢

转载自blog.csdn.net/weixin_43409994/article/details/105900984