解决RequestMapping注解的全局唯一性

本文深入探讨了SpringMVC框架中注解的使用方法,包括@Controller和@RequestMapping的作用及其实现原理,阐述了如何通过注解配置处理器,实现请求映射和视图返回。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 使用 springMVC 注解
 * @author DELL
 *
 */
@Controller//该注解,表示 这个类是一个 controller类

@RequestMapping("/index") 

/*在类上定义的mapping目的,是为了在 该类的方法上的mapping外面,在加一层mapping
 *  因为RequestMapping 的参数,必须是全局唯一的。 所以。 如果A类下,由 indexMV. 
 *  B类下,也有indexMV。
 *  这样就会报错。
 * 解决方法: 就是在 A、B类上,再加一层RequestMapping("/A"),RequestMapping("/B"),
 * 这样spring  就会用
 * 类 映射 拼接 方法映射。 如: /A/indexMV   /B/indexMV。
 * 这样,问题就解决了
 * 
 *
 */
public class IndexController_Annotation {

	/**
	 * 使用注解的方式 配置 处理器。类似 springMVC-servlet.xml 的如下配置
	 * <bean name="/indexMV.html" class="cn.paile.controller.IndexController"/>
	 * @return
	 */
	@RequestMapping("/indexMV")
	public ModelAndView indexForModelAndView() {
		// TODO 自动生成的方法存根
		System.out.println("使用springMVC注解的方式,进入到 Controller方法中处理。"
				+ "返回ModelAndView对象");
		return new ModelAndView("dataIndex");
	}
	
	/**
	 * 如果 处理器只是返回一个 逻辑视图名,并没有其他数据。可以直接返回 逻辑视图名 字符串
	 * 该方法和上面的方法,结果是一样的
	 * @return
	 */
	@RequestMapping("/indexStr")
	public String indexForString() {
		// TODO 自动生成的方法存根
		System.out.println("使用springMVC注解的方式,进入到 Controller方法中处理。"
				+ "返回视图名称字符串");
		return "dataIndex";
	}

}

/*在类上定义的mapping目的,是为了在 该类的方法上的mapping外面,在加一层mapping
 *  因为RequestMapping 的参数,必须是全局唯一的。 所以。 如果A类下,由 indexMV.
 *  B类下,也有indexMV。
 *  这样就会报错。
 * 解决方法: 就是在 A、B类上,再加一层RequestMapping("/A"),RequestMapping("/B"),
 * 这样spring  就会用
 * 类 映射 拼接 方法映射。 如: /A/indexMV   /B/indexMV。
 * 这样,问题就解决了
 */


 注: 查看RequestMapping  类后,发现,RequestMapping ("/indexMV") 这里的参数,是一个数组类型。也就说,可以指定多个形式的url格式。 RequestMapping ({"/indexMV","MV","index"}), 这样表示。这三种方式的 url,都可以进入这个处理方法

### 苍穹外卖项目中使用的 Java 注解或 Spring 相关注解 #### 一、常见注解及其作用 在苍穹外卖项目的开发过程中,使用了许多常见的 Java 和 Spring 注解来简化代码逻辑和增强功能扩展性。以下是具体说明: 1. **编译期注解** - `@Override` 是一种典型的编译期注解,在方法定义时用于表明此方法覆盖了父类中的同名方法。如果未正确实现继承关系,则会在编译阶段报错[^1]。 2. **运行期注解** - 在运行期间通过反射机制处理的注解主要用于依赖注入和其他动态行为控制。 - `@Autowired`: 属于 Spring 的核心注解之一,用来自动装配 Bean 实例到指定字段或者方法参数中。 - `@Resource(name="beanName")`: 虽然不是 Spring 提供的标准注解,但它被广泛应用于 DI(Dependency Injection)。它来自 javax.annotation 包下,需单独引入相关库文件才能正常使用。 3. **缓存管理相关注解** - 对于性能优化方面,该项目可能也涉及到了一些关于数据缓存的操作。例如: - `@EnableCaching`: 开启基于声明式的缓存支持,通常放置在整个应用程序入口处即主程序启动类之上[^2]; - `@Cacheable(value = "cacheKey", key="#id")`: 表明某函数的结果可以存储在一个特定名称的空间里,并可通过唯一键值快速检索出来而无需再次执行实际业务逻辑; - `@CachePut`: 更新已存在的记录而不影响其他部分的行为模式; - `@CacheEvict(allEntries=true): 手动清除整个命名空间内的所有条目. 4. **Web控制器相关的注解** - 针对RESTful API设计风格下的接口定义和服务暴露环节,会频繁运用如下几项标签形式表达意图: - `@RestController`: 将类标记成专门负责返回JSON/XML格式响应体而非视图页面渲染结果类型的Controller组件[^3]. - `@RequestMapping(path="/api/v1/resource/{id}", method=RequestMethod.GET)` : 定义URL路径映射规则以及允许访问的方式(GET/POST etc.) . 5. **安全性和事务管理方面的注解** - 当涉及到多表联查或者其他复杂数据库交互场景时, 可能还会借助下面这些工具提升系统的稳定性和一致性水平: - `@Transactional(readOnly=false)`: 确保一系列SQL语句要么全部提交成功要么回滚失败状态保持一致. - `@PreAuthorize("hasRole('ROLE_ADMIN')")`: 授权检查前置条件判断用户角色权限是否满足要求才可继续往下走流程. 6. **登出功能的具体实现细节** - 登录注销过程相对简单粗暴直接销毁Http Session对象实例即可完成相应清理工作:`request.getSession().removeAttribute("employee");` 此外配合PostMapping标注限定请求方式为HTTP POST类型从而形成完整的CRUD操作链路结构[^4]. --- ### 示例代码片段展示如何应用上述提到的部分注解: ```java // 启用全局缓存配置开关 @SpringBootApplication @EnableCaching public class SkyTakeOutApplication { public static void main(String[] args){ SpringApplication.run(SkyTakeOutApplication.class,args); } } // 控制器样例演示Restful服务构建思路 @RestController @RequestMapping("/employees") public class EmployeeController { private final EmployeeService employeeService; @Autowired // 自动绑定service对象引用 public EmployeeController(EmployeeService service){ this.employeeService = service; } @GetMapping("/{id}") @Cacheable(value="employees",key="#id") // 结合Redis等中间件加速查询效率减少DB压力 public ResponseEntity<Employee> getEmployeeById(@PathVariable Long id){ Optional<Employee> empOpt = employeeService.findById(id); return empOpt.map(ResponseEntity::ok).orElseGet(() ->ResponseEntity.notFound().build()); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值