All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.j2mvc.framework.dispatcher.reader.BaseReader Maven / Gradle / Ivy

Go to download

强烈建议使用J2mvc 2.1以后的版本。 version 2.1.01 1.优化路径跳转,Servlet和Filter方式的路径设置 2.优化内存销毁 3.更换JSON依赖包 4.优化接收方法RequestMethod,封装不同ContentType格式提交 封装JSON,XML数据提交模块 JSON请求示例 { "id":"JSON134851", "title":"JSON提交的标题", "price":65.1, "stock":100 } XML请求示例 <!DOCTYPE root [ <!ELEMENT root ANY> <!ATTLIST Product SSN ID #REQUIRED>]> <root> <Product SSN='id'>XMLID12354</Product> <Product SSN='title'>XML提交的标题 </Product> <Product SSN='price'>55 </Product> <Product SSN='stock'>32 </Product> </root> version 2.1.02 1.解决URL无后缀情况无法加载静态资源,解决无法渲染CSS文件。 version 2.1.03 1.移除com.j2mvc.StringUtils.getUtf8()方法调用 更改为getCharset() version 2.1.04 1.去除Servlet和Filter的全局变量销毁,只交给Listener处理。 version 2.1.05,2.1.06,2.1.07 1.完善POST提交的JSON数据 支持接收基础数据类型、任意对象类型、任意数组类型。 不支持接收参数为集合类型或Map类型,但可以定义为接收对象类型的元素。 version 2.1.05,2.1.06,2.1.07 1.修改连接池变量 version 2.1.09 增加上传功能,修改RequestMethod,ContentType设置方式 version 2.1.10,2.1.11 更改上传文件名格式为UUID格式,移除JSON映射类,更改接收多文件上传。 version 2.1.12 删除文件列有的空对象 version 2.1.13 增加配置文件目录/conf,加载上传功能配置/conf/upload.properties version 2.1.18 拦截器也能获取ActionBean version 2.1.20 添加上传文件只读权限 version 2.1.21 支持同时接收文件和文本数据 version 2.1.22 增加文件接收类型media version 2.1.23 删除upload类printJson方法

The newest version!
package com.j2mvc.framework.dispatcher.reader;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;

import com.alibaba.fastjson.JSONObject;
import com.j2mvc.framework.Session;
import com.j2mvc.framework.dao.DaoSupport;
import com.j2mvc.framework.mapping.Column;
import com.j2mvc.framework.mapping.Foreign;
import com.j2mvc.framework.mapping.PrimaryKey;
import com.j2mvc.framework.mapping.Sql;
import com.j2mvc.framework.util.FieldUtil;

import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.NotFoundException;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;

/**
 *  读取请求数据
 * 
 * @author 杨朔
 *
 */
public abstract  class BaseReader {
	static final Logger  log = Logger.getLogger(BaseReader.class);
	
	protected HttpServletRequest request;
	// 当前返回Action对象
	protected Object object;
	// 当前方法
	protected Method method;
	// 当前class泛型对象
	protected Class clazz ;
	// 参数类型数组
	protected Class[] types;
	// 参数名称数组
	protected String[] names;
	// 参数值数组
	protected Object[] values;
	// 数据流字符串
	protected String requestBody;
	// JSON数据
	protected JSONObject jsonData;
	// XML数据
	protected Document xmlData;

	public BaseReader(HttpServletRequest request, Method method, Object object) {
		super();
		this.request = request;
		this.method = method;
		this.object = object;
	}
	/**
	 * 返回反射对象
	 * @return
	 */
	public abstract Object result();
	/**
	 * 	获取参数值
	 * @param type
	 * @param name
	 */
	protected abstract Object getParameterValue(Class type,String name);
	
	public JSONObject getJsonData() {
		return jsonData;
	}
	public Document getXmlData() {
		return xmlData;
	}
	public String getRequestBody() {
		return requestBody;
	}
	/**
	 * 获取参数名
	 * @param methodName
	 * @param length
	 * 
	 * @throws NotFoundException
	 */
	protected  String[] getParameterNames(Class clazz,String methodName,int length){
        ClassPool pool = ClassPool.getDefault(); 
        CtClass cc;
		try {
			// web下必须注册类路径,否则找不到类文件
			pool.insertClassPath(new ClassClassPath(clazz)); 
			cc = pool.getCtClass(clazz.getName());
	        CtMethod cm = cc.getDeclaredMethod(methodName);
	        // 使用javaassist的反射方法获取方法的参数名  
	        MethodInfo methodInfo = cm.getMethodInfo();  
	        CodeAttribute codeAttribute = methodInfo.getCodeAttribute();  
	        LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);  
			if (attr != null) {
				// exception
				String[] paramNames = new String[length];
				int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
				for (int i = 0; i < length; i++) {
					paramNames[i] = attr.variableName(i + pos);
				}
				return paramNames;
			}    
		} catch (NotFoundException e) {
			log.error(e.getMessage());
		}  
        return null;
	}

	/**
	 * 查询指定主键实体对象
	 * @param fields
	 * @param clazz
	 * 
	 */
	protected Object getObjectByPrimaryKey(List fields,Class clazz){
		/* 主键 */
		PrimaryKey primaryKey = clazz.getAnnotation(PrimaryKey.class);
		int size = fields.size();
		for(int i=0;i fields,Object obj){
		int size = fields.size();
		for(int i=0;i type,String name);
	/**
	 * 写入字段值
	 * @param field
	 * @param obj
	 * @param rs
	 */	
	protected void invoke(Field field,Object obj) {
		/* 注释字段,对应数据表字段 */
		Column column = field.getAnnotation(Column.class);
		
		/* 注释字段,对应关联对象字段 */
		Foreign foreign =  field.getAnnotation(Foreign.class);

		/* 注释字段,根据SQL语句查询值,仅返回基础数据类型 */
		Sql sql =  field.getAnnotation(Sql.class);

		if(column == null){
			return;
		}
		String name = field.getName();
		/* 数据表数据类型 */		
		Class type = field.getType();	
		try {
			Object value = null;
			if(foreign!=null){
				// 外键对象之主键属性数据类型
				type = FieldUtil.getForeignKey(type).getType();
			}
			value = getValue(type,name);
			if(foreign!=null){
				// 外键,字段为对象,获取类主键,并实例
				try {
					DaoSupport daoSupport = new DaoSupport(field.getType());
					value = daoSupport.get(value);
				} catch (Exception e) {
					log.error(e.getMessage());
				}
			}else if(sql!=null){
				// 根据SQL语句查询值
				try {
					DaoSupport daoSupport = new DaoSupport(field.getType());
					value = daoSupport.get(sql.value());
				} catch (Exception e) {
					log.error(e.getMessage());
				}
			}
			// 执行写入操作
			PropertyDescriptor pd = new PropertyDescriptor(name, obj.getClass());
			Method wm = pd.getWriteMethod();
			if(value!=null && !value.equals(""))
				wm.invoke(obj, value);			
		} catch (IntrospectionException e) {
			log.error(e.getMessage());		
		}catch (IllegalArgumentException e) {
			log.error(e.getMessage());
		}catch (IllegalAccessException e) {
			log.error(e.getMessage());
		}catch (InvocationTargetException e) {
			log.error(e.getMessage());
		}
	}

	/**
	 * 获取UTF8格式
	 * @param value
	 * 
	 */
	protected String getCharset(String value){
		if(value == null)
			return null;
		try {
			if(java.nio.charset.Charset.forName("ISO-8859-1").newEncoder().canEncode(value)){
				value = new String(value.getBytes("ISO-8859-1"),Session.encoding);
			}else if(java.nio.charset.Charset.forName("UTF-8").newEncoder().canEncode(value)){
			}else if(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(value)){
				value = new String(value.getBytes("GBK"),"UTF-8");
			}else  if(java.nio.charset.Charset.forName("GB2312").newEncoder().canEncode(value)){
				value = new String(value.getBytes("GB2312"),"UTF-8");
			}
		} catch (UnsupportedEncodingException e) {
		}
		return value;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy