`
lp895876294
  • 浏览: 285364 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

SpringMVC构造返回的逻辑视图地址

    博客分类:
  • JAVA
 
阅读更多

场景:

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>
分享到:
评论

相关推荐

    SpringMVC自定义多视图

    在Spring MVC框架中,"自定义多视图"是一个关键概念,它允许开发者根据不同的请求或业务逻辑返回多种格式的视图,如HTML、JSON、XML等。这在构建Web应用时尤其有用,因为现代应用通常需要支持多种交互方式,如浏览器...

    SpringMVC+MyBatis+EasyUI简单分页Demo

    同时,SpringMVC的ModelAndView或Model接口用于在控制器和视图之间传递数据。 MyBatis是SQL映射框架,它允许开发者编写XML或注解形式的SQL语句,与Java对象进行映射,简化了DAO层的开发。在分页场景下,你需要使用...

    SpringMVC中文教程

    5. **视图解析器(ViewResolver)**:解析视图名称并返回具体的视图对象。 6. **渲染视图**:将模型数据填充到视图中并响应给用户。 #### 五、核心组件介绍 1. **DispatcherServlet**:SpringMVC的核心组件之一,...

    Spring3+springmvc+mybatis三大整合

    控制器返回ModelAndView对象,包含处理结果和视图信息。视图解析器将ModelAndView中的视图名转换为实际的视图,如JSP页面。SpringMVC还支持数据绑定、验证、本地化等功能,极大地提高了开发效率。 MyBatis则是...

    SpringMvc单元测试Junit

    首先,SpringMvc是Spring框架的一部分,专门用于构建Web应用程序的MVC(模型-视图-控制器)架构。它提供了一种组织和解耦应用组件的方法,使得测试变得更加简单。通过声明式配置,开发者可以将业务逻辑与表示层分离...

    SpringMVC和MongoDB整合Demo+文档

    SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。而MongoDB则是一种流行的NoSQL数据库,以其灵活性、高性能和易扩展性著称。将两者整合在一起,可以为现代Web应用提供强大...

    SpringMVC4+JPA Demo

    1. **SpringMVC 4**:SpringMVC是Spring框架的一部分,提供了一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。它简化了处理HTTP请求、渲染视图和管理业务逻辑的过程。 2. **JPA**:Java Persistence API 是...

    基于Netty手工实现springMVC框架

    5. **ViewResolver**:这个组件负责解析逻辑视图名到实际视图。我们可以设计一个解析器,根据逻辑视图名找到对应的视图模板。 实现这些组件时,我们需要注意以下几点: - **线程模型**:Netty的事件驱动模型与...

    SpringMVC的json依赖jar包

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。在现代Web开发中,JSON(JavaScript Object Notation)已成为数据交换的主要格式,尤其是在前后端分离的架构中。SpringMVC...

    SpringMVC+Spring Data JPA+Shiro+EasyUI 简单demo

    EasyUI遵循MVC原则,与SpringMVC的结合可以方便地创建前后端分离的应用,前端使用EasyUI来展示数据,后端利用SpringMVC处理业务逻辑和数据操作。 **整合示例** "SpringMVC+Spring Data JPA+Shiro+EasyUI 简单demo...

    SpringMVC+MySQL实现的分页小项目

    - **视图解析器**:如`InternalResourceViewResolver`,负责将逻辑视图名转换为实际的视图资源。 项目中可能还涉及到其他技术,如使用Maven或Gradle进行依赖管理,使用JUnit进行单元测试,以及可能的前端技术如HTML...

    springMVC多图片上传示例

    压缩包文件名称`springmvc_fileupload_demo`可能代表一个完整的项目结构,其中包括了配置文件、控制器类、视图文件以及可能的测试用例等。这些文件可以帮助开发者快速理解和搭建多图片上传的环境。 通过上述步骤,...

    SpringMvc+JdbcTemplate+oracle的小项目实例

    它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者将业务逻辑、数据展示和用户交互分离,提高了代码的可维护性和可测试性。在SpringMVC中,Controller处理HTTP请求,Model管理业务对象,View负责渲染视图...

    springmvc3分页程序

    在SpringMVC中,我们可以使用Spring Data JPA或自定义分页逻辑来实现。在这个程序中,分页可能通过以下步骤实现: 1. **创建Pageable接口实例**:在Controller层,创建一个Pageable对象,设置页码和每页大小。 2. *...

    SPRINGMVC 注解范例程序

    7. **@ModelAndView**:在传统的基于视图名的方式中,控制器方法可能返回一个 `ModelAndView` 对象,它包含模型数据和视图名称。 8. **@Autowired**:Spring 自动装配注解,用于注入依赖。Spring 会自动寻找类型...

    springmvc ajax 文件上传

    Spring MVC是Spring框架的一个模块,专门用于构建基于模型-视图-控制器(MVC)模式的Web应用程序。它提供了一个灵活的架构,允许开发者以解耦的方式处理HTTP请求和响应。 **AJAX**(异步JavaScript和XML)技术允许...

    springmvc mybatis项目案例

    3. **控制器**:控制器接收请求,调用业务逻辑,然后返回一个模型和视图的组合。 4. **依赖注入**:SpringMVC支持依赖注入,使得组件之间的耦合度降低,提高代码的可测试性和可维护性。 **Mybatis框架** Mybatis是...

    springmvc postman工具,

    SpringMVC是Spring框架的一部分,专门用于构建Web应用程序,它提供了模型-视图-控制器(MVC)架构模式,简化了Java Web应用的开发。 **SpringMVC** SpringMVC作为Spring框架的核心模块,主要负责处理HTTP请求和返回...

    spring-springMvc-jdbctemplate.rar

    它遵循模型-视图-控制器(Model-View-Controller, MVC)设计模式,将业务逻辑、数据处理和用户界面分离,从而提高代码的可维护性和可测试性。Spring MVC通过DispatcherServlet作为入口点,处理HTTP请求,并将请求...

Global site tag (gtag.js) - Google Analytics