springmvc 响应封装_Web端封装 - Spring+SpringMVC企业快速开发架构搭建_Linux编程_Linux公社-Linux系统门户网站...

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

1、代码量少

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

3、能够支持多种视图

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

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

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

1、JSONReqest类

Jsonrequest代码

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;

/**

*

 
 

* 功能: 用于封装用户的请求,将请求转换为相应的VO、VOList对象

*

* @author mrh

* 2015年1月22日

*/

public class JSONRequest extends LinkedHashMap{

/**

* 序列号

*/

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 getVO(Class 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 map = (Map) 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 List getVOList(Class clazz, String listName) {

if (!JLAssertUtil.hasValue(this.values())) {

LOGGER.debug("the val is null");

return null;

}

List> list = (List>)this.get(listName);

if (!JLAssertUtil.hasValue(list)) {

return null;

}

List result = new ArrayList();

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

* 返回一个包含 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

* @return T

* @throws IllegalAccessException

* @throws InstantiationException

* @throws Exception

*/

protected T getVOFormMap(Class clazz, Map 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类

Jsonresponse 代码

package com.jl.net.framework.web;

import java.util.LinkedHashMap;

import java.util.Map;

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

/**

*

 
 

* 返回结结果集 包含的信息(用于返回json的数据对象):

* 1、操作是否成功(默认为true)

* 2、是否需要登陆(默认为false, 除特殊场景外不需要开发人员设定)

* 3、返回结果集 Map

*

* @author mrh2015年1月22日

*

*/

public class JSONResponse {

private boolean success = true;

private boolean relogin = false;

private Map values = new LinkedHashMap();;

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 getValues() {

return values;

}

/**

* @param the value Object

*/

@SuppressWarnings("unchecked")

public 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

Init代码

@Override

public JSONResponse init(JSONResponse response) {

try {

List 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 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

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代码

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 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 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代码时就更简单了。

Spring 的详细介绍:请点这里

Spring 的下载地址:请点这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. `web.xml`: `web.xml` 是 Java Web 应用程序的配置文件,用于配置 Servlet、Filter、Listener 等 Web 组件。主要功能如下: - 配置 Servlet 和 Servlet 映射。 - 配置 Filter 和 Filter 映射。 - 配置 Listener。 - 配置错误页面。 - 配置 Session 超时时间。 - 配置上下文参数等。 示例代码: ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>MyWebApp</display-name> <servlet> <servlet-name>myServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/myservlet/*</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> </web-app> ``` 2. `springmvc-config.xml`: `springmvc-config.xml` 是 Spring MVC 框架的配置文件,用于配置 Spring MVC 相关的组件,如视图解析器、拦截器等。主要功能如下: - 配置 Spring MVC 的 HandlerMapping 和 HandlerAdapter。 - 配置视图解析器。 - 配置拦截器。 - 配置文件上传解析器等。 示例代码: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <mvc:annotation-driven/> <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <mvc:interceptors> <bean class="com.example.MyInterceptor"/> </mvc:interceptors> </beans> ``` 3. `spring-mybatis.xml`: `spring-mybatis.xml` 是 Spring 整合 MyBatis 框架的配置文件,用于配置 MyBatis 相关的组件,如数据源、SqlSessionFactory、MapperScannerConfigurer 等。主要功能如下: - 配置数据源。 - 配置 SqlSessionFactory。 - 配置 MapperScannerConfigurer。 - 配置事务管理器等。 示例代码: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <context:component-scan base-package="com.example"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb"/> <property name="user" value="root"/> <property name="password" value="123456"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven/> </beans> ``` 4. `applicationContext.xml`: `applicationContext.xml` 是 Spring 的核心配置文件,用于配置 Spring 容器中的 Bean。主要功能如下: - 配置数据源、事务管理器等基础组件。 - 配置 Service、DAO 等业务组件。 - 配置 AOP、声明式事务等。 - 配置定时任务等。 示例代码: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <context:component-scan base-package="com.example"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb"/> <property name="user" value="root"/> <property name="password" value="123456"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven/> <bean id="userService" class="com.example.UserService"> <property name="userDao" ref="userDao"/> </bean> <bean id="userDao" class="com.example.UserDao"> <property name="dataSource" ref="dataSource"/> </bean> </beans> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值