一直以来都在用spring mvc做mvc框架,我使用的不是基于注解的,还是使用的基于xml的,在controller里一般都会加上一个异常捕捉,能分析出来的异常,提示出具体信息,不能预料的异常,返回一个统一的异常提示信息,未封装前的代码为:
public ModelAndView addBigDeal(HttpServletRequest request, HttpServletResponse response) throws Exception { JSONObject jsonObject = new JSONObject(); try { String sessionId = WebUtils.getStringValue(request, "sessionId", true); String pl_id = WebUtils.getStringValue(request, "pl_id", true); String vsr_id = WebUtils.getStringValue(request, "vsr_id", true); String cmnts = WebUtils.getStringValue(request, "cmnts", false); if (!StringUtils.isBlank(cmnts)) { cmnts = new String(Base64Utils.decode(cmnts), "UTF-8"); } JSONObject result = new JSONObject(); result.put("dataId", this.storeVsrService.addBigDeal(pl_id, vsr_id, cmnts)); jsonObject.put("data", result); jsonObject.put("status", CommonUtils.getSubStatus(" add bigDeal successfully!")); } catch (GenericException e) { jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg())); jsonObject.put("data", ""); logger.error("error !", e); } catch (Exception e) { jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", "网络或其他错误,请联系管理员!")); jsonObject.put("data", ""); logger.error("error !", e); } response.getWriter().write(jsonObject.toString()); return null; }
GenericException为自定义异常的父类,自定义的异常都要继承该类
上面代码的缺点:每写一个方法时,都要重复的写这一段:
try { } catch (GenericException e) { jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg())); jsonObject.put("data", ""); logger.error("error !", e); } catch (Exception e) { jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", "网络或其他错误,请联系管理员!")); jsonObject.put("data", ""); logger.error("error !", e); }
因为每一个controller都会继承MultiActionController,现在在每一个controller和自己定义的controller里抽象一层,因为所有controller里的方法入口
都是MultiActionController里的handleRequestInternal方法,所以重写该方法,把异常捕捉放到这个统一的入口和出口里,
新增加的类为BaseController,封装后的代码如下:
package com.intel.store.controller; import com.intel.store.common.CommonUtils; import com.intel.store.exception.GenericException; import org.codehaus.jettison.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * mvc controller类的基类,用于一般controller的继承, * 把异常控制模块提取到基类, * 使开发更加简洁,快速 * Created with IntelliJ IDEA. * User: malone * Date: 14-3-17 * Time: 上午10:21 * To change this template use File | Settings | File Templates. */ public class BaseController<T extends BaseController<T>> extends MultiActionController { private Class<T> subclass; private Logger logger = LoggerFactory.getLogger(subclass); BaseController() { subclass = ((Class)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]); logger = LoggerFactory.getLogger(subclass); } @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { JSONObject jsonObject = new JSONObject(); try { String methodName = this.getMethodNameResolver().getHandlerMethodName(request); Object obj = invokeNamedMethod(methodName, request, response); System.out.println(obj.getClass()); return invokeNamedMethod(methodName, request, response); } catch (NoSuchRequestHandlingMethodException ex) { return handleNoSuchRequestHandlingMethod(ex, request, response); } catch (GenericException e) { jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", e.getMsg())); jsonObject.put("data", ""); logger.error(e.getMsg(), e); response.getWriter().write(jsonObject.toString()); return null; } catch (Exception e) { jsonObject.put("status", CommonUtils.getSubStatus(false, "000001", "网络或其他错误,请联系管理员!")); jsonObject.put("data", ""); logger.error("error !", e); response.getWriter().write(jsonObject.toString()); return null; } } }
这样以来所有的自定义Controller只需要继承BaseController, 然后在每个方法里就需要些try catch异常捕捉模块了,如下所示
public ModelAndView addBigDeal(HttpServletRequest request, HttpServletResponse response) throws Exception { JSONObject jsonObject = new JSONObject(); String sessionId = WebUtils.getStringValue(request, "sessionId", true); String pl_id = WebUtils.getStringValue(request, "pl_id", true); String vsr_id = WebUtils.getStringValue(request, "vsr_id", true); String cmnts = WebUtils.getStringValue(request, "cmnts", false); if (!StringUtils.isBlank(cmnts)) { cmnts = new String(Base64Utils.decode(cmnts), "UTF-8"); } JSONObject result = new JSONObject(); result.put("dataId", this.storeVsrService.addBigDeal(pl_id, vsr_id, cmnts)); jsonObject.put("data", result); jsonObject.put("status", CommonUtils.getSubStatus(" add bigDeal successfully!")); response.getWriter().write(jsonObject.toString()); return null; }
这是我的一些想法和做法,欢迎大家指正!
相关推荐
4. **ModelAndView对象**: 这是Spring MVC中用于封装模型数据和视图名的对象。在Controller方法中,可以返回一个ModelAndView对象,指定返回的视图和传递给视图的数据。 5. **视图解析**: Spring MVC支持多种视图...
在本实例中,我们有一个名为"spring-MVC.zip"的压缩包,里面包含了一个关于Spring MVC的开发教程,特别适合初学者进行学习。 Spring MVC的核心概念包括DispatcherServlet、Controller、Model、View和ViewModel。...
- 在Spring MVC的Controller中通过@Autowired注解注入Service,然后调用Service中的方法执行数据库操作。 4. **封装**:封装主要体现在以下几个方面: - **Service层**:创建Service接口,包含业务逻辑方法,这些...
在Spring MVC中,Model代表业务对象,View负责展示,Controller处理用户请求并协调Model和View。 2. **DispatcherServlet**:Spring MVC的入口点,它是一个前端控制器,接收所有HTTP请求,并根据配置的...
3. `org.springframework.web.servlet-3.0.2.RELEASE.jar`:这是 Spring MVC 的核心模块,提供了控制器(Controller)、模型视图(ModelAndView)以及调度器Servlet(DispatcherServlet)等关键组件。...
在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...
8. **异常处理**: Spring MVC 提供了 `@ExceptionHandler` 注解,允许在 Controller 中直接处理异常,提高异常处理的灵活性。 9. **JSON 支持**: 通过集成 Jackson 或者 Gson,Spring MVC 可以方便地进行 JSON 数据...
在Spring MVC中,Controller处理请求,Model代表业务对象,View负责渲染视图。 2. **DispatcherServlet**:Spring MVC的核心组件,作为前端控制器,负责接收HTTP请求,调度请求到相应的处理器。 3. **@Controller*...
10. **异常处理**:Spring MVC 提供了统一的异常处理机制,通过 @ExceptionHandler 或配置 ExceptionResolver,可以优雅地处理应用中的异常。 11. **RESTful 支持**:Spring MVC 通过 @RequestMapping 注解支持 ...
查询结果被封装为Java对象,然后传递给Spring MVC的Controller。Controller再将这些对象传给Velocity模板,Velocity根据模板和数据生成响应的HTML页面。 例如,一个典型的流程可能如下:用户发起一个请求,...
- **异常处理**:Spring MVC提供了强大的异常处理机制,可以通过@ExceptionHandler注解来处理控制器方法中抛出的异常。 - **国际化支持**:通过资源文件支持多语言,可以方便地实现应用程序的多语言支持。 #### 九...
SqlSessionTemplate 是 Spring 中对 SqlSession 的封装,提供了事务管理。 4. **创建 DAO 接口**:在 MyBatis 中,业务逻辑通常通过 Mapper 接口实现,接口的方法对应 SQL 语句。定义一个 DAO 接口,例如 `...
在实际开发中,Spring MVC 还支持许多高级特性,如国际化、数据绑定、异常处理、RESTful 风格的 API 设计等,这些都是构建高效、灵活的 Web 应用程序的关键工具。了解并熟练掌握 Spring MVC 的使用,将有助于提升 ...
在上述描述中,我们看到一个开发者为了应对一个紧迫的项目,快速学习并理解了Spring MVC的核心概念。Spring MVC不仅在Java Web开发中广泛应用,而且因其灵活性和可扩展性而备受青睐。 首先,Spring MVC的设计理念是...
在本教程中,我们将深入探讨Spring MVC的核心概念,特别是关于注解的使用以及简单的控制器实现。 首先,Spring MVC的核心组件包括DispatcherServlet、Controller、ModelAndView、ViewResolver等。DispatcherServlet...
在Spring MVC 应用中,我们需要配置 `web.xml` 以注册 DispatcherServlet,同时创建一个或多个 Spring 配置文件来定义 MVC 组件。配置包括配置视图解析器、处理器映射器、拦截器等。 4. **注解驱动开发** Spring ...
在Spring MVC框架中,文件上传和下载是常见的功能需求,特别是在构建Web应用程序时。这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于...
3. **@Controller和@RequestMapping**: 这两个注解是Spring MVC中控制器层的核心。@Controller标识一个类作为控制器,而@RequestMapping则用来映射HTTP请求到特定的方法。 4. **ModelAndView**: 这个类用于封装模型...
在本项目中,我们利用了Java技术栈中的四个核心组件:Spring MVC、Spring、Hibernate以及Bootstrap,构建了一个全面的图书管理系统。这个系统旨在提供高效、用户友好的图书管理功能,涵盖了从图书入库、检索到借阅、...