`

Spring+SpringMVC企业快速开发架构搭建2-web端封装

阅读更多

使用SpringMVC进行开发,主要优势很多;我们主要看中的有以下几点:

1、代码量少

2、学习简单,与我们之前使用的框架风格相似

3、能够支持多种视图

为了将以上几点发挥的更好,我选择将web层的Controller进行封装,目的也很明确:为了让我们的开发人员使用起来更简单,封装工作分为三部分

1、请求参数处理、响应值处理

我们默认支持的视图是html,选择json作为前台到后台的数据传输格式,因此我们选择将请求参数封装为JSONRequest类,该类可以完成多参数、javaBean的转换;将返回值封装成JSONResponse类,该类包含返回值(可以是多个)、操作消息、是否操作成功等信息

1、JSONReqest类

package com.jl.net.framework.web;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.jdom.IllegalTargetException;

import com.alibaba.fastjson.JSONObject;
import com.jl.net.framework.util.DateUtils;
import com.jl.net.framework.util.JLAssertUtil;
import com.jl.net.framework.util.PageBean;

/**
 * <pre>
 * 功能: 用于封装用户的请求,将请求转换为相应的VO、VOList对象
 * </pre>
 * @author mrh
 * 2015年1月22日
 */
public class JSONRequest extends LinkedHashMap<String, Object>{
	/**
	 * 序列号
	 */
	private static final long serialVersionUID = -9005858241290023408L;

	/**
	 * LOGGER - log4j
	 */
	private static final Logger LOGGER = Logger.getLogger(JSONRequest .class);
	
	
	/**
	 * 根据Class获取对应的VO对象
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public <T> T getVO(Class<T> clazz, String voName) {
		if (!JLAssertUtil.hasValue(this.values())) {
			LOGGER.debug("the val is null");
			return null;
		}
		Object obj =  this.get(voName);
		if (obj instanceof Map) {
			Map<String, Object> map = (Map<String, Object>) this.get(voName);
			return this.getVOFormMap(clazz, map);
		} else {
			throw new IllegalTargetException(voName + "的目标值的数据类型不是" + clazz.getName() + ",请确认数据类型!");
		}
	}
	
	/**
	 * 根据Class获取对应的VO对象
	 * @param clazz
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getVOList(Class<T> clazz, String listName) {
		if (!JLAssertUtil.hasValue(this.values())) {
			LOGGER.debug("the val is null");
			return null;
		}
		List<Map<String, Object>> list = (List<Map<String, Object>>)this.get(listName);
		if (!JLAssertUtil.hasValue(list)) {
			return null;
		}
		List<T> result = new ArrayList<T>();
		for (int index = 0; index < list.size(); index++) {
			result.add(this.getVOFormMap(clazz, list.get(index)));
		}
		return result;
	}
	
	/**
	 * 返回String类型的请求参数 
	 * @param parameter
	 * @return
	 */
	public String getString(String parameter) {
		if (!JLAssertUtil.hasValue(this.values())) {
			return null;
		}
		Object obj = this.get(parameter);
		if (!JLAssertUtil.hasValue(obj)) {
			return null;
		}
		if (!(obj instanceof String)) {
			throw new IllegalTargetException("目标值的数据类型不是String,请确认目标值的数据类型!");
		}
		return obj.toString(); 
	}
	
	/**
	 * 返回String类型的请求参数 
	 * @param parameter
	 * @return
	 */
	public int getInt(String parameter) {
		if (!JLAssertUtil.hasValue(this.values())) {
			return 0;
		}
		Object obj = this.get(parameter);
		if (!JLAssertUtil.hasValue(obj)) {
			return 0;
		}
		if (obj instanceof String) {
			return Integer.parseInt(obj.toString()); 
		}
		if (obj instanceof Integer) {
			return ((Integer)obj).intValue(); 
		} 
		return Integer.parseInt(obj.toString()); 
	}
	/**
	 * 获取前台的 BigDecimal 类型的参数
	 * @param parameter String
	 * @return BigDecimal
	 */
	public BigDecimal getBigDecimal(String parameter) {
		if (!JLAssertUtil.hasValue(this.values())) {
			LOGGER.debug("the val is null");
			return null;
		}
		Object obj = this.get(parameter);
		if (!JLAssertUtil.hasValue(obj)) {
			return null;
		}
		if (obj instanceof String) {
			return new BigDecimal(this.getString(parameter));
		}
		if (obj instanceof BigDecimal) {
			return (BigDecimal)obj;
		}
		throw new IllegalTargetException("目标值的数据类型不是BigDecimal,请确认目标值的数据类型!");
	}
	
	/**
	 * 获取前台的 Timestamp 类型的参数
	 * @param parameter
	 * @return
	 */
	public Timestamp getTimestamp(String parameter) {
		if (!JLAssertUtil.hasValue(this.values())) {
			LOGGER.debug("the val is null");
			return null;
		}
		Object obj = this.get(parameter);
		if (!JLAssertUtil.hasValue(obj)) {
			return null;
		}
		if (obj instanceof String) {
			return DateUtils.parseDate(this.getString(parameter));
		}
		if (obj instanceof Timestamp) {
			return (Timestamp)obj;
		}
		throw new IllegalTargetException("目标值的数据类型不是Timestamp,请确认目标值的数据类型!");
	}
	
	/**
	 * 分页组件使用的javaBean<br/>
	 * 返回一个包含 draw、  start、 length值的对象
	 * @return PageBean
	 */
	public PageBean getPageBean() {
		int draw = this.getInt("draw");
		int start = this.getInt("start");
		int length = this.getInt("length");
		PageBean bean = new PageBean(draw, start, length);
		return bean;
	}
	/**
	 * 从Map集合中获取javaBean对象
	 * @param clazz Class
	 * @param map Map<String, Object> 
	 * @return T
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws Exception
	 */
	protected <T> T getVOFormMap(Class<T> clazz, Map<String, Object> map) {
		if (!JLAssertUtil.hasValue(map)) {
			LOGGER.debug("the map is null");
			return null;
		}
		JSONObject json = new JSONObject();
		json.putAll(map);
		return JSONObject.toJavaObject(json, clazz);
	}
}

 2、JSONResponse类

package com.jl.net.framework.web;

import java.util.LinkedHashMap;
import java.util.Map;

import com.jl.net.framework.util.PageBean;

/**
 * <pre>
 * 返回结结果集 包含的信息(用于返回json的数据对象):
 * 1、操作是否成功(默认为true)
 * 2、是否需要登陆(默认为false, 除特殊场景外不需要开发人员设定)
 * 3、返回结果集 Map
 * </pre>
 * @author mrh2015年1月22日
 *
 */
public class JSONResponse {
	
	private boolean success = true;
	
	private boolean relogin = false;
	
	private Map<String, Object> values = new LinkedHashMap<String, Object>();;
	
	private String message;

	
	public JSONResponse () {
		super();
	}

	/**
	 * 构造方法-用于框架权限、资源验证不通过时,拒绝用户请求时使用
	 * @param relogin
	 */
	public JLJsonResponse(boolean relogin) {
		super();
		this.relogin = relogin;
	}

	/**
	 * @return the success
	 */
	public boolean isSuccess() {
		return success;
	}

	/**
	 * @param success the success to set
	 */
	public void setSuccess(boolean success) {
		this.success = success;
	}

	/**
	 * @return the relogin
	 */
	public boolean isRelogin() {
		return relogin;
	}

	/**
	 * @return the value
	 */
	public Map<String, Object> getValues() {
		return values;
	}

	/**
	 * @param the value Object
	 */
	@SuppressWarnings("unchecked")
	public <T> T get(String key) {
		return (T)this.values.get(key);
	}
	
	public void setPageBean(PageBean page) {
		this.values.put(PageBean.PAGE_BEAN_KEY, page);
	}
	
	/**
	 * @param value the value to set
	 */
	public void put(String key, Object value) {
		this.values.put(key, value);
	}

	/**
	 * @return the message
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * @param message the message to set
	 */
	public void setMessage(String message) {
		this.message = message;
	}
}

 

 

2、方法风格规范

方法分类两种,框架提供的页面初始化方法以及开发人员根据业务需求自定义的方法

具体规范如下

1、初始化方法,有抽象类定义抽象方法,指定默认的urlMapping为"/init",无请求参数,返回值为JSONResponse

@Override
	public JSONResponse init(JSONResponse response) {
		try {
			List<Acjc001VO> list = this.service.getAcjc001List();
			response.put("ac001", list);
		} catch (Exception e){
			response.setSuccess(false);
			response.setMessage("初始化失败!");
			LOGGER.error(e.getMessage(), e);
		}
		response.setMessage("操作成功!");
		return response;
	}

  方法参数中的Response对象是为了用于返回到前台,这样做的摸底就是为了让开发人员减少实例化的过程,同时避免使用全局变量

2、自定义方法

 

/**
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value="/ac001", method=RequestMethod.POST)
	@ResponseBody
	public JSONResponse getAc001s(@RequestBody JSONRequest request, JSONResponse response) {
		try {
			System.out.println(request);
			PageBean page = new PageBean(1,2,3);
			List<Acjc001VO> list = this.service.getAcjc001List();
			page.setList(list);
			response.setPageBean(page);
			response.setMessage("查询成功!");
		} catch (CheckException e){
			System.out.println(e);
			response.setSuccess(false);
			response.setMessage(e.getMessage());
			LOGGER.error(e.getMessage(), e);
		} catch (Exception e){
			System.out.println(e);
			response.setSuccess(false);
			response.setMessage("系统异常!");
			LOGGER.error(e.getMessage(), e);
		}
		return response;
	}

 自定义方法全部使用POST方式,需要开发人员指定urlMapping

 

3、自定义方法的参数列表规范,自定义方法规定方法参数为

@RequestBody JSONRequest request, JSONResponse response

 

下面看一下Controller的抽象类以及按照规范创建的Controller

1、AbstractController

package com.jl.net.framework.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public abstract class AbstractController {
	
	/**
	 * 抽象方法,由子类实现,用于实现页面的初始化操作
	 * @param request JLAbstractRequest 用户的请求方法
	 * @return
	 */
	@RequestMapping(value="/init", method=RequestMethod.GET)
	public abstract @ResponseBody JLJsonResponse init(JLJsonResponse response);
}

 

 2、 Demo2Controller代码

package com.jl.net.demo.web.controller;

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jl.net.demo.dao.Acjc001VO;
import com.jl.net.demo.service.IAc001Servcie;
import com.jl.net.framework.exception.CheckException;
import com.jl.net.framework.util.PageBean;
import com.jl.net.framework.web.AbstractController;
import com.jl.net.framework.web.JSONRequest;
import com.jl.net.framework.web.JSONResponse;

/**
 * Controller示例代码
 * @author 100807
 */
@Controller
@RequestMapping(value="/demo2")
public class Demo2Controller extends AbstractController {
	/**
	 * LOGGER
	 */
	private static final Logger LOGGER = Logger.getLogger(Demo2Controller.class);
	private IAc001Servcie service;
	public void setService(IAc001Servcie service) {
		this.service = service;
	}
	@Override
	public JSONResponse init(JSONResponse response) {
		try {
			List<Acjc001VO> list = this.service.getAcjc001List();
			response.put("ac001", list);
		} catch (Exception e){
			response.setSuccess(false);
			response.setMessage("初始化失败!");
			LOGGER.error(e.getMessage(), e);
		}
		response.setMessage("操作成功!");
		return response;
	}
	/**
	 * 成本中心
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value="/ac001", method=RequestMethod.POST)
	@ResponseBody
	public JSONResponse getAc001s(@RequestBody JSONRequest request, JSONResponse response) {
		try {
			System.out.println(request);
			PageBean page = new PageBean(1,2,3);
			List<Acjc001VO> list = this.service.getAcjc001List();
			page.setList(list);
			response.setPageBean(page);
			response.setMessage("查询成功!");
		} catch (CheckException e){
			System.out.println(e);
			response.setSuccess(false);
			response.setMessage(e.getMessage());
			LOGGER.error(e.getMessage(), e);
		} catch (Exception e){
			System.out.println(e);
			response.setSuccess(false);
			response.setMessage("系统异常!");
			LOGGER.error(e.getMessage(), e);
		}
		return response;
	}
	
}

 

 由此完成web端的封装,这样减少的前台formBean的开发,并且还能固定方法参数,开发人员在编写Controller代码时就更简单了

分享到:
评论

相关推荐

    spring4+springMVC+Mybatis项目搭建以及测试demo

    在本文中,我们将深入探讨如何搭建一个基于Spring4、SpringMVC和Mybatis的项目,以及如何进行测试。这个项目组合通常被称为“SSM”框架,是Java Web开发中的主流选择,提供了强大的依赖注入、MVC架构和持久层管理...

    利用IDEA搭建的hibernate+Spring+SpringMVC架构实现增删改查等功能

    总结起来,通过IDEA搭建Hibernate+Spring+SpringMVC架构,主要涉及配置项目、设置依赖、设计模型、实现DAO和服务层、构建Controller和视图,以及进行测试。这个架构提供了灵活、高效且易于维护的Web应用开发方案。

    spring+springMVC+mybatis简单实例

    2. **SpringMVC**:SpringMVC是Spring框架的一个模块,专门用于处理Web请求。它是一个Model-View-Controller(MVC)架构的实现,负责接收用户请求,调用业务逻辑,然后将结果返回给前端。SpringMVC通过...

    spring+springmvc+mybatis搭建的一个房地产交易管理系统附带mysql数据库

    在本项目中,我们利用Spring、SpringMVC和...综上所述,这个房地产交易管理系统是一个典型的Java Web应用实例,展示了Spring全家桶和MySQL数据库在实际项目中的应用,对于学习和理解企业级开发流程具有很高的参考价值。

    权限管理系统,基于Spring+SpringMvc+MiniJdbc+Shiro为架构的权限管理系统

    SpringMvc是Spring的Web MVC框架,它提供了模型-视图-控制器的模式,简化了Web应用的开发。通过DispatcherServlet接收请求并分发到相应的处理器,再由ModelAndView封装数据和视图,最后将结果呈现给用户。SpringMvc...

    spring+springmvc+mybatis搭建的一个酒店管理系统附带mysql数据库

    【标题】"spring+springmvc+mybatis搭建的一个酒店管理系统附带mysql数据库"涉及的核心技术栈包括Spring框架、SpringMVC以及MyBatis,这些是Java Web开发中的关键组件,常用于构建高效、灵活的企业级应用程序。...

    使用spring+springmvc+mybatis搭建项目,带页面

    总的来说,使用Spring+SpringMVC+MyBatis的SSM架构能有效地组织和管理项目,提供高效、灵活的开发环境。这个电商项目不仅涵盖了基础的CRUD操作,还涉及到了用户管理、商品展示和订单处理等多个业务场景,是学习和...

    spring+springMVC+mybatis

    【标题】"spring+springMVC+mybatis"是一个经典的Java Web开发技术栈,整合了Spring框架、Spring MVC以及MyBatis三个核心组件。这个项目是个人搭建并能正常运行的,提供了完整的环境配置和数据库建表语句,用户只...

    基于Spring + SpringMvc + MyBatis搭建的学生信息管理系统.zip

    【标题】"基于Spring + SpringMvc + MyBatis搭建的学生信息管理系统"是一个综合性的IT项目,它涵盖了现代Web开发中的核心框架和技术。Spring是Java领域广泛使用的轻量级框架,它提供了一种全面的编程和配置模型,...

    spring+springMVC全量jar包

    Spring 是一个全面的后端开发框架,提供了一整套服务管理、依赖注入、AOP(面向切面编程)等功能,而 SpringMVC 是 Spring 框架的一部分,专门用于构建 Web 应用的 MVC(模型-视图-控制器)架构。 **Spring 框架** ...

    spring+springMVC+mybatis基本包

    SSM框架,即Spring、SpringMVC和MyBatis,是Java开发中常见的Web应用程序集成框架。这个"spring+springMVC+mybatis基本包"压缩文件提供了这三大框架的基础库,便于开发者快速搭建和运行基于SSM的项目。下面将详细...

    spring+MyBatis+SpringMVC项目搭建及其所需架包

    在Java Web开发领域,Spring框架、MyBatis和SpringMVC是三个非常重要的组件,它们协同工作可以构建出高效、可维护的Web应用程序。本文将详细介绍如何利用这三大技术搭建一个完整的项目,并提供所需的框架包。 首先...

    整合maven+spring+springmvc+mybatis实现ssm通用增删查改API

    "整合maven+spring+springmvc+mybatis实现ssm通用增删查改API"项目旨在通过搭建SSM框架,利用Maven管理依赖,借助Spring的IoC和AOP特性,结合SpringMVC处理Web请求,以及MyBatis简化数据库操作,最终封装出一套可...

    spring+springMVC+mysql+JSON的jar包整合

    总的来说,这个压缩包提供了搭建一个基于Spring、SpringMVC、MySQL和JSON的Java Web应用的基础,开发者只需要按照上述步骤进行配置和编程,就可以快速构建起一个功能完善的后端系统。这样的整合不仅有利于提高开发...

    Spring+SpringMVC+Mybatis+easyUI实现简单的后台管理系统.zip

    《构建基于Spring、SpringMVC、Mybatis与EasyUI的后台管理系统详解》 在现代Web开发中,构建高效、易维护的后台管理系统是一项基础且重要的任务。本项目以"Spring+SpringMVC+Mybatis+easyUI实现简单的后台管理系统...

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    通过以上步骤,我们可以成功地将 Spring、SpringMVC 和 MyBatis 这三个框架整合在一起,搭建起一个功能完善、扩展性强的 Web 开发平台。 #### 四、总结 SSM 框架的整合并不难,关键是理解各框架的基本原理和技术...

    SpringMVC+Spring+mybatis项目搭建详细过程

    在本文中,我们将深入探讨如何搭建一个基于SpringMVC、Spring和MyBatis的Java Web项目。这是一个常见的技术栈,广泛应用于企业级应用开发。首先,让我们了解这三个框架的核心功能。 1. SpringMVC:SpringMVC是...

    spring+springmvc+mybatis搭建的一个医院管理系统附带mysql数据库

    SpringMVC作为Spring框架的一部分,是一个用于构建Web应用的模型-视图-控制器(MVC)架构。它处理HTTP请求,将请求分发到相应的处理器,然后将结果返回给客户端。SpringMVC通过DispatcherServlet进行请求路由,...

Global site tag (gtag.js) - Google Analytics