四、常用注解

1 RequestParam

1.1 使用说明

  1. 作用:把请求中指定名称的参数给控制器中的形参赋值。
  2. 属性:
    1. value :请求参数中的名称;
    2. required :请求参数中是否必须提供此参数。默认值为 true,表示必须提供,如果不提供将报错。

1.2 使用示例

  1. jsp中的代码:

    <!-- requestParams注解的使用 -->
    <a href="springmvc/useRequestParam?name=test">requestParam注解</a>
    
  2. 控制器中的代码:

    /**
     * requestParams注解的使用
     * @param username
     * @return
     */
    @RequestMapping("/useRequestParam")
    public String useRequestParam(@RequestParam("name")String username,
                                  @RequestParam(value="age", required=false)Integer age) {
        System.out.println(username + "," + age);
        return "success";
    }
    
  3. 运行结果:
    在这里插入图片描述

2 RequestBody

2.1 使用说明

  1. 作用:用于获取请求体内容。直接使用得到是 key=value&key=value... 结构的数据。GET请求方式不适用
  2. 属性:required 是否必须有请求体。默认值是true。
    1. 当取值为true时,GET请求方式会报错;
    2. 当取值为false时,GET请求得到是null。

2.2 使用示例

  1. POST请求jsp代码:

    <!-- request body注解 -->
    <form action="springmvc/useRequestBody" method="post">
    	用户名称:<input type="text" name="username"><br/>
    	用户密码:<input type="password" name="password"><br/>
    	用户年龄:<input type="text" name="age"><br/>
    	<input type="submit" value="保存">
    </form>
    
  2. GET请求jsp代码:

    <a href="springmvc/useRequestBody?body=test">requestBody注解GET请求</a>
    
  3. 控制器代码:

    /**
     * RequestBody注解
     * @param user
     * @return
     */
    @RequestMapping("/useRequestBody")
    public String useRequestBody(@RequestBody(required = false) String body) {
    	System.out.println(body);
    	return"success";
    }
    
  4. 运行结果:

    1. POST请求运行结果:
      在这里插入图片描述
    2. GET请求运行结果:
      在这里插入图片描述

3 PathVaribale

3.1 使用说明

  1. 作用:用于绑定url中的占位符。
    例如,请求url中 /delete/{id} ,这个 {id} 就是url占位符。url支持占位符是Spring 3.0之后加入的。是Spring MVC支持REST风格url的一个重要标志;
  2. 属性:
    1. value :用于指定url中占位符名称;
    2. required :是否必须提供占位符。

3.2 使用示例

  1. jsp代码:

    <!-- PathVariable注解 -->
    <a href="springmvc/usePathVariable/100">pathVariable注解</a>
    
  2. 控制器代码:

    /**
     * PathVariable注解
     * @param user
     * @return
     */
    @RequestMapping("/usePathVariable/{id}")
    public String usePathVariable(@PathVariable("id") Integer id) {
    	System.out.println(id);
    	return "success";
    }
    
  3. 运行结果:
    在这里插入图片描述

3.3 REST风格URL

3.3.1 REST和RESTful

  1. REST(Representational State Transfer,表现层状态转化):一种软件架构风格,它首次出现在2000年Roy Fielding的博士论文中,他是HTTP规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。
    值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。它本身并没有什么实用性,其核心价值在于如何设计出符合REST风格的网络接口。
  2. RESTful(REST风格式):符合REST约束风格和原则的应用程序或设计。
    优点:结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

3.3.2 RESTful特性

  1. 资源(Resources):网络上的一个实体或具体信息。可以是一段文本、一张图片、一首歌曲、一种服务等。可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI,访问URI就可以获取这个资源,因此URI即为每一个资源独一无二的识别符;
  2. 表现层(Representation):把资源具体呈现出来的形式。如,文本可以用TXT格式表现,也可以用HTML、XML、JSON格式,甚至可以用二进制格式表现;
  3. 状态转化(State Transfer):每发出一个请求,就代表客户端和服务器的一次交互过程。
    HTTP协议是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。
    具体说,就是HTTP协议里面四个表示操作方式的动词:GET、POST、PUT、DELETE,它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。

3.3.3 RESTful示例

  1. /account/1 HTTP GET得到 id = 1account
  2. /account/1 HTTP DELETE删除 id = 1account
  3. /account/1 HTTP PUT更新 id = 1account
  4. /account HTTP POST新增 account

3.4 基于HiddentHttpMethodFilter的示例

  1. 作用:由于浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,Spring 3.0添加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持GET、POST、PUT与DELETE请求。

  2. 使用方法:

    1. 在web.xml中配置该过滤器;
    2. 请求方式必须使用POST请求;
    3. 按照要求提供 _method 请求参数,该参数的取值就是我们需要的请求方式。
  3. 源码分析:
    在这里插入图片描述

  4. jsp中示例代码:

    <!-- 保存 -->
    <form action="springmvc/testRestPOST" method="post">
    	用户名称:<input type="text" name="username"><br/>
        <!-- <input type="hidden" name="_method" value="POST"> --> 
        <input type="submit" value="保存">
    </form>
    <hr/>
    <!-- 更新 -->
    <form action="springmvc/testRestPUT/1" method="post">
    	用户名称:<input type="text" name="username"><br/>
    	<input type="hidden" name="_method" value="PUT">
        <input type="submit" value="更新">
    </form>
    <hr/>
    <!-- 删除 -->
    <form action="springmvc/testRestDELETE/1" method="post">
    	<input type="hidden" name="_method" value="DELETE">
    	<input
            type="submit" value="删除"></form>
    <hr/>
    <!-- 查询一个 -->
    <form action="springmvc/testRestGET/1" method="post">
    	<input type="hidden" name="_method" value="GET">
    	<input type="submit" value="查询">
    </form> 
    
  5. 控制器中示例代码:

    /**
     * POST请求:保存
     * @param username
     * @return
     */
    @RequestMapping(value = "/testRestPOST", method = RequestMethod.POST)
    public String testRestfulURLPOST(User user) {
    	System.out.println("rest post" + user);
        return "success";
    }
    /**
     * PUT请求:更新
     * @param username
     * @return
     */
    @RequestMapping(value = "/testRestPUT/{id}", method = RequestMethod.PUT)
    public String testRestfulURLPUT(@PathVariable("id")Integer id,User user) {
    	System.out.println("rest put " + id + "," + user);
        return "success";
    }
    /**
     * POST请求:删除
     * @param username
     * @return
     */
    @RequestMapping(value = "/testRestDELETE/{id}", method = RequestMethod.DELETE)
    public String testRestfulURLDELETE(@PathVariable("id")Integer id) {
        System.out.println("rest delete " + id);
        return "success";
    }
    /**
     * POST请求:查询
     * @param username
     * @return
     */
    @RequestMapping(value = "/testRestGET/{id}", method = RequestMethod.GET)
    public String testRestfulURLGET(@PathVariable("id")Integer id) {
    	System.out.println("rest get " + id);
        return "success";
    }
    
  6. 运行结果:
    在这里插入图片描述

4 RequestHeader

4.1 使用说明

  1. 作用:用于获取请求消息头;
  2. 属性:
    1. value :提供消息头名称;
    2. required :是否必须有此消息头。

注意:在实际开发中一般不怎么用。

4.2 使用示例

  1. jsp中代码:

    <!-- RequestHeader注解 -->
    <a href="springmvc/useRequestHeader">获取请求消息头</a>
    
  2. 控制器中代码:

    /**
     * RequestHeader注解
     * @param user
     * @return
     */
    @RequestMapping("/useRequestHeader")
    public String useRequestHeader(@RequestHeader(value="Accept-Language", required=false)String requestHeader) {
    	System.out.println(requestHeader);
    	return "success";
    }
    
  3. 运行结果:
    在这里插入图片描述

5 CookieValue

5.1 使用说明

  1. 作用:用于把指定cookie名称的值传入控制器方法参数;
  2. 属性:
    1. value :指定cookie的名称;
    2. required :是否必须有此cookie。

5.2 使用示例

  1. jsp中的代码:

    <!-- CookieValue注解 -->
    <a href="springmvc/useCookieValue">绑定cookie的值</a>
    
  2. 控制器中的代码:

    /**
     * Cookie注解注解
     * @param user
     * @return
     */
    @RequestMapping("/useCookieValue")
    public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue) {
    	System.out.println(cookieValue);
    	return "success";
    }
    
  3. 运行结果:
    在这里插入图片描述

6 ModelAttribute

6.1 使用说明

  1. 作用:修饰方法和参数,是Spring MVC 4.3版本以后新加入的。
    1. 出现在方法上:表示当前方法会在控制器的方法执行之前先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法;
    2. 出现在参数上:表示用指定的数据给参数赋值。
  2. 属性:value 用于获取数据的key。
    key可以是POJO的属性名称,也可以是map结构的key。
  3. 应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
    例如,我们在编辑一个用户时,用户有一个隐藏字段,该字段的值是不可修改,在提交表单数据时肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。

6.2 使用示例

6.2.1 基于POJO属性的基本使用

  1. jps代码:

    <!-- ModelAttribute注解的基本使用 -->
    <a href="springmvc/testModelAttribute?username=test">测试modelattribute</a>
    
  2. 控制器代码:

    /**
     * 被ModelAttribute修饰的方法
     * @param user
     */
    @ModelAttribute
    public void showModel(User user) {
    	System.out.println("执行了showModel方法" + user.getUsername());
    }
    /**
     * 接收请求的方法
     * @param user
     * @return
     */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user) {
    	System.out.println("执行了控制器的方法" + user.getUsername());
    	return "success";
    }
    
  3. 运行结果:
    在这里插入图片描述

6.2.2 基于Map的应用场景示例1:ModelAttribute修饰方法带返回值

  1. 需求:修改用户信息,要求用户的密码不能修改。

  2. jsp的代码:

    <!-- 修改用户信息 -->
    <form action="springmvc/updateUser" method="post">
    	用户名称:<input type="text" name="username"><br/>
    	用户年龄:<input type="text" name="age"><br/>
    	<input type="submit" value="保存">
    </form>
    
  3. 控制的代码:

    /**
     * 查询数据库中用户信息
     * @param user
     */
    @ModelAttribute
    public User showModel(String username) {
    	//模拟去数据库查询
    	User user = findUserByName(username);
    	System.out.println("执行了showModel方法" + user);
    	return user;
    }
    /**
     * 模拟修改用户方法
     * @param user
     * @return
     */
    @RequestMapping("/updateUser")
    public String testModelAttribute(User user) {
    	System.out.println("控制器中处理请求的方法:修改用户:" + user);
    	return "success";
    }
    /**
     * 模拟去数据库查询
     * @param username
     * @return
     */
    private User findUserByName(String username) {
    	User user = new User();
    	user.setUsername(username);
    	user.setAge(19);
    	user.setPassword("123456");
    	return user;
    }
    
  4. 运行结果:
    在这里插入图片描述

6.2.3 基于Map的应用场景示例2:ModelAttribute修饰方法不带返回值

  1. 需求:修改用户信息,要求用户的密码不能修改。

  2. jsp中的代码:

    <!-- 修改用户信息 -->
    <form action="springmvc/updateUser" method="post">
    	用户名称:<input type="text" name="username" ><br/>
    	用户年龄:<input type="text" name="age" ><br/>
    	<input type="submit" value="保存">
    </form>
    
  3. 控制器中的代码:

    /**
     * 查询数据库中用户信息
     * @param user
     */
    @ModelAttribute
    public void showModel(String username,Map<String,User> map) {
    	//模拟去数据库查询
    	User user = findUserByName(username);
    	System.out.println("执行了showModel方法" + user);
    	map.put("abc", user);
    }
    /**
     * 模拟修改用户方法
     * @param user
     * @return
     */
    @RequestMapping("/updateUser")
    public String testModelAttribute(@ModelAttribute("abc")User user) {
    	System.out.println("控制器中处理请求的方法:修改用户:"+user);
    	return "success";
    }
    /**
     * 模拟去数据库查询
     * @param username
     * @return
     */
    private User findUserByName(String username) {
    	User user = new User();
    	user.setUsername(username);
    	user.setAge(19);
    	user.setPassword("123456");
    	return user;
    }
    
  4. 运行结果:
    在这里插入图片描述

7 SessionAttribute

7.1 使用说明

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

7.2 使用示例

  1. jsp中的代码:

    <!-- SessionAttribute注解的使用 -->
    <a href="springmvc/testPut">存入SessionAttribute</a>
    <hr/>
    <a href="springmvc/testGet">取出SessionAttribute</a>
    <hr/>
    <a href="springmvc/testClean">清除SessionAttribute</a>
    
  2. 控制器中的代码:

    /**
     * SessionAttribute注解的使用
     */
    @Controller("sessionAttributeController")
    @RequestMapping("/springmvc")
    @SessionAttributes(value ={"username","password"}, types={Integer.class})
    public class SessionAttributeController {
    	/**
    	 * 把数据存入SessionAttribute
    	 * @param model
    	 * @return 
    	 */
    	@RequestMapping("/testPut")
    	// Model是Spring提供的一个接口,该接口有一个实现类ExtendedModelMap 
    	// 该类继承了ModelMap,而ModelMap就是LinkedHashMap子类
    	public String testPut(Model model){
    		model.addAttribute("username", "泰斯特");
    		model.addAttribute("password", "123456");
    		model.addAttribute("age", 31);
    		// 跳转之前将数据保存到username、password和age中
    		// 因为注解@SessionAttribute中有这几个参数
    		return "success";
    	}
    	@RequestMapping("/testGet")
    	public String testGet(ModelMap model) {
    		System.out.println(model.get("username") + ";" + model.get("password") + ";" + model.get("age"));
    		return "success";
    	}
    	@RequestMapping("/testClean")
    	public String complete(SessionStatus sessionStatus){
    		sessionStatus.setComplete();
    		return "success";
    	}
    }
    
  3. 运行结果:
    在这里插入图片描述

### 常用注解列表及应用场景 #### 1. **Spring 框架中的常用注解** Spring 提供了许多注解来简化开发过程并增强代码的灵活性。以下是部分常见注解及其用途: - `@Component` 这是一个通用组件定义注解用于标记类作为 Spring 容器管理的一个 Bean[^3]。 - `@Service` 特定于服务层组件,通常用于业务逻辑处理的服务类中。 - `@Controller` 主要应用于控制器层,负责接收 HTTP 请求并将请求映射到相应的处理器方法。 - `@RestController` 结合了 `@Controller` 和 `@ResponseBody` 注解的功能,适用于 RESTful 风格的 Web 应用程序开发。 - `@Autowired` 自动装配依赖项,通过类型匹配或名称匹配的方式注入所需的对象实例。 - `@Qualifier` 当存在多个相同类型的 Bean 时,可以通过该注解指定具体的 Bean 名称进行注入。 - `@Value` 从配置文件或其他资源加载属性值,并将其赋给字段、构造函数参数或方法参数。 - `@PostConstruct` / `@PreDestroy` 分别标注初始化和销毁生命周期的方法,在 Bean 创建完成后执行特定操作或者在 Bean 销毁前清理资源。 --- #### 2. **Spring AOP 中的相关注解** 面向切面编程(AOP)允许开发者分离横切关注点,例如日志记录、事务管理和安全性控制等功能。以下是一些常见的 AOP 注解: - `@Aspect` 标记一个类为切面类,表示它包含了切入点和通知逻辑[^1]。 - `@Before` 在目标方法调用之前执行的通知逻辑。 - `@AfterReturning` 在目标方法成功返回之后执行的操作。 - `@Around` 包裹目标方法的执行流程,可以在方法前后自定义行为。 - `@Pointcut` 定义切入点表达式,描述哪些连接点会被拦截。 --- #### 3. **Java 函数式接口相关注解** 随着 Java 对 Lambda 表达式的引入,函数式接口成为一种重要的设计模式。下面介绍了一个典型例子以及其作用场景: - `@FunctionalInterface` 标识某个接口为函数式接口,即只包含单一抽象方法的接口。这有助于编译器验证接口是否符合函数式接口的要求,并支持更简洁的语法形式——Lambda 表达式[^4]。 ```java @FunctionalInterface public interface MyFunctionalInterface { void doSomething(); } ``` 上述代码片段展示了如何声明一个简单的函数式接口,并可通过如下方式使用 Lambda 实现具体功能: ```java MyFunctionalInterface myFunc = () -> System.out.println("Doing something..."); myFunc.doSomething(); ``` --- #### 4. **Web 开发领域内的注解** 对于现代 Web 应用而言,HTTP 协议交互频繁发生,因此掌握与之相关的注解尤为重要: - `@RequestMapping` 映射 URL 路径至对应的 Controller 方法上,支持多种 HTTP 动词如 GET, POST 等[^5]。 - `@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping` 更加语义化的替代方案分别对应不同的 HTTP 请求动作。 - `@RequestParam` 绑定查询字符串参数或表单数据到方法参数上。 - `@PathVariable` 抽取路径变量绑定到方法参数中,常用REST API 设计。 - `@RequestBody` 将传入 JSON/XML 数据反序列化成 Java 对象传递给方法参数。 - `@ResponseBody` 返回的数据会自动转换为响应体内容发送回客户端。 --- #### 5. **其他重要注解** 除了以上分类外还有一些跨框架适用的基础注解值得提及: - `@Override` 显示表明当前方法重写了父类同名方法,帮助提高代码可读性和减少错误风险[^2]。 - `@Deprecated` 标明某些过时特性不再推荐继续使用,可能在未来版本被移除。 - `@SuppressWarnings` 关闭特定警告提示信息以便保持源码整洁无冗余提醒。 --- ### 示例代码展示 以下给出一段综合运用若干前述提到过的注解的实际案例演示: ```java import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; @Service public class UserService { private final UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public User findUserById(@RequestParam Long id) { return userRepository.findById(id).orElse(null); } } ``` 在此段代码里可以看到 `@Service`、`@Autowired` 及 `@RequestParam` 的实际应用情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值