场景:
SpringMVC Controller类中不同的方法对应不同的Rest请求地址和逻辑视图返回地址,但是为了模块化,各个方法的Rest地址前缀和返回逻辑视图的地址前缀都应该相同。其中请求Rest地址的前缀可以在类上用@RequestMapping声明,而返回视图的逻辑地址前缀仍需要手动写。本文通过使用Spring MVC拦截器为Controller类方法返回的逻辑视图动态添加了模块Rest地址前缀,因此,在Controller类的方法只需要返回逻辑视图名称。
拦截器代码:
package com; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class ViewInterceptor extends HandlerInterceptorAdapter { //Controller类名称 <-> Controller类映射地址 private Map<String, String> ControllerRestPathMap = new HashMap<String, String>() ; /** * 拦截返回的逻辑视图,并在逻辑视图上加上Controller映射地址 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { String requestRest = (String)request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE) ; //获取spring web容器 WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext()) ; //获取声明类在spring容器中的名称 String[] beanNames = webApplicationContext.getBeanNamesForType(((HandlerMethod) handler).getMethod().getDeclaringClass()) ; for (String beanName : beanNames) { if(!StringUtils.hasLength(beanName)){ continue ; } //映射当前类的Rest地址 if(ControllerRestPathMap.get(beanName)==null){ //获取类的映射Rest地址 RequestMapping requestMapping = webApplicationContext.findAnnotationOnBean(beanName, RequestMapping.class) ; if(requestMapping!=null&&!ObjectUtils.isEmpty(requestMapping.value())){ String basePath = requestMapping.value()[0] ; //去掉类请求地址后缀“/” if(basePath.lastIndexOf("/")==basePath.length()-1){ basePath = basePath.substring(0, basePath.length()-1) ; } ControllerRestPathMap.put(beanName, basePath) ; } } //根据请求Rest地址前缀匹配处理的类 if(ControllerRestPathMap.get(beanName)!=null&&requestRest.startsWith(ControllerRestPathMap.get(beanName))){ modelAndView.setViewName(ControllerRestPathMap.get(beanName)+"/"+modelAndView.getViewName()); break ; } } // System.out.println("映射地址 -> "+modelAndView.getViewName()); } }
注:
1.Controller类中每个方法对应的Rest地址,以属性的型式存放在Request中。可以通过如下方式获取: request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)
2.拦截Rest地址匹配策略:根据Rest地址的匹配方式,查找处理它的Controller类。找到Controller类之后,将Controller类的逻辑视图地址加到方法返回逻辑地址前面,构成完整的逻辑视图地址。
在Spring MVC配置文件中装载拦截器:
<mvc:interceptors> <bean class="com.ViewInterceptor"></bean> </mvc:interceptors>
相关推荐
在Spring MVC框架中,"自定义多视图"是一个关键概念,它允许开发者根据不同的请求或业务逻辑返回多种格式的视图,如HTML、JSON、XML等。这在构建Web应用时尤其有用,因为现代应用通常需要支持多种交互方式,如浏览器...
同时,SpringMVC的ModelAndView或Model接口用于在控制器和视图之间传递数据。 MyBatis是SQL映射框架,它允许开发者编写XML或注解形式的SQL语句,与Java对象进行映射,简化了DAO层的开发。在分页场景下,你需要使用...
5. **视图解析器(ViewResolver)**:解析视图名称并返回具体的视图对象。 6. **渲染视图**:将模型数据填充到视图中并响应给用户。 #### 五、核心组件介绍 1. **DispatcherServlet**:SpringMVC的核心组件之一,...
控制器返回ModelAndView对象,包含处理结果和视图信息。视图解析器将ModelAndView中的视图名转换为实际的视图,如JSP页面。SpringMVC还支持数据绑定、验证、本地化等功能,极大地提高了开发效率。 MyBatis则是...
首先,SpringMvc是Spring框架的一部分,专门用于构建Web应用程序的MVC(模型-视图-控制器)架构。它提供了一种组织和解耦应用组件的方法,使得测试变得更加简单。通过声明式配置,开发者可以将业务逻辑与表示层分离...
SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。而MongoDB则是一种流行的NoSQL数据库,以其灵活性、高性能和易扩展性著称。将两者整合在一起,可以为现代Web应用提供强大...
1. **SpringMVC 4**:SpringMVC是Spring框架的一部分,提供了一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。它简化了处理HTTP请求、渲染视图和管理业务逻辑的过程。 2. **JPA**:Java Persistence API 是...
5. **ViewResolver**:这个组件负责解析逻辑视图名到实际视图。我们可以设计一个解析器,根据逻辑视图名找到对应的视图模板。 实现这些组件时,我们需要注意以下几点: - **线程模型**:Netty的事件驱动模型与...
SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。在现代Web开发中,JSON(JavaScript Object Notation)已成为数据交换的主要格式,尤其是在前后端分离的架构中。SpringMVC...
EasyUI遵循MVC原则,与SpringMVC的结合可以方便地创建前后端分离的应用,前端使用EasyUI来展示数据,后端利用SpringMVC处理业务逻辑和数据操作。 **整合示例** "SpringMVC+Spring Data JPA+Shiro+EasyUI 简单demo...
- **视图解析器**:如`InternalResourceViewResolver`,负责将逻辑视图名转换为实际的视图资源。 项目中可能还涉及到其他技术,如使用Maven或Gradle进行依赖管理,使用JUnit进行单元测试,以及可能的前端技术如HTML...
压缩包文件名称`springmvc_fileupload_demo`可能代表一个完整的项目结构,其中包括了配置文件、控制器类、视图文件以及可能的测试用例等。这些文件可以帮助开发者快速理解和搭建多图片上传的环境。 通过上述步骤,...
它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者将业务逻辑、数据展示和用户交互分离,提高了代码的可维护性和可测试性。在SpringMVC中,Controller处理HTTP请求,Model管理业务对象,View负责渲染视图...
在SpringMVC中,我们可以使用Spring Data JPA或自定义分页逻辑来实现。在这个程序中,分页可能通过以下步骤实现: 1. **创建Pageable接口实例**:在Controller层,创建一个Pageable对象,设置页码和每页大小。 2. *...
7. **@ModelAndView**:在传统的基于视图名的方式中,控制器方法可能返回一个 `ModelAndView` 对象,它包含模型数据和视图名称。 8. **@Autowired**:Spring 自动装配注解,用于注入依赖。Spring 会自动寻找类型...
Spring MVC是Spring框架的一个模块,专门用于构建基于模型-视图-控制器(MVC)模式的Web应用程序。它提供了一个灵活的架构,允许开发者以解耦的方式处理HTTP请求和响应。 **AJAX**(异步JavaScript和XML)技术允许...
3. **控制器**:控制器接收请求,调用业务逻辑,然后返回一个模型和视图的组合。 4. **依赖注入**:SpringMVC支持依赖注入,使得组件之间的耦合度降低,提高代码的可测试性和可维护性。 **Mybatis框架** Mybatis是...
SpringMVC是Spring框架的一部分,专门用于构建Web应用程序,它提供了模型-视图-控制器(MVC)架构模式,简化了Java Web应用的开发。 **SpringMVC** SpringMVC作为Spring框架的核心模块,主要负责处理HTTP请求和返回...
它遵循模型-视图-控制器(Model-View-Controller, MVC)设计模式,将业务逻辑、数据处理和用户界面分离,从而提高代码的可维护性和可测试性。Spring MVC通过DispatcherServlet作为入口点,处理HTTP请求,并将请求...