📄 gdinfoinandout.java
字号:
package com.gd.mvc.io.impl;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.gd.mvc.exception.VODataValidate;
import com.gd.mvc.exception.VOGdException;
import com.gd.mvc.io.InfoInAndOut;
public class GdInfoInAndOut implements InfoInAndOut{
private HttpServletRequest req = null;
private HttpServletResponse res = null;
private Map infoIn = new HashMap();
private List voId = new ArrayList();//获取Xml中设定的voId
private List voClass = new ArrayList();//获取Xml中设定的voClass
private List voType = new ArrayList();//获取Xml中设定的voType
private List voValidate = new ArrayList();//获取Xml中设定的voValidate
/**
* 构造函数
* @throws Exception
*/
public GdInfoInAndOut() throws Exception {
}
/**
* 构造函数
* @param req
* @param res
* @throws Exception
*/
public GdInfoInAndOut(HttpServletRequest req, HttpServletResponse res) throws Exception {
this.req = req;
this.res = res;
this.infoIn = this.getRequestToMap(req);
}
/**
* 构造函数
* @param req
* @param res
* @param voId
* @param voClass
* @param voType
* @param voValidate
* @throws Exception
*/
public GdInfoInAndOut(HttpServletRequest req, HttpServletResponse res, List voId, List voClass, List voType, List voValidate) throws Exception {
this.req = req;
this.res = res;
this.voId = voId;
this.voClass = voClass;
this.voType = voType;
this.voValidate = voValidate;
this.infoIn = this.getRequestToMap(req);
}
/**
* 将页面中所有元素放在HashMap中
* @param req
* @return HashMap
* @throws Exception
*/
private HashMap getRequestToMap(HttpServletRequest req) throws Exception {
req.setCharacterEncoding("GBK");
HashMap infoIn = new HashMap();
for (Enumeration e = req.getParameterNames(); e.hasMoreElements();) {//获取页面中所有元素名
String strName = (String)e.nextElement();
String[] values = (String[]) req.getParameterValues(strName);//根据名称获取对应的值
if (values == null) {//假如没有值
infoIn.put(strName, "");
} else if (values.length == 1) {//假如只有一个值
infoIn.put(strName, values[0]);
} else {//假如有多个值
infoIn.put(strName, values);
}
}
return infoIn;
}
/**
* 同Map的get(Object obj)用法
* @param obj Object
* @return Object
*/
public Object get(Object obj) {
return this.infoIn.get(obj);
}
/**
* 同Map的put(Object key, Object value)用法
* 将value存入key的map中
* @param Object key
* @param Object value
*
*/
public void put(Object key, Object value) {
this.infoIn.put(key, value);
}
/**
* 同HttpServletRequest的getParameter(String fieldName)方法
* @param fieldName 页面中元素名称
* @return 返回页面中元素名称的value
*/
public String getParameter(String fieldName) {
return req.getParameter(fieldName);
}
/**
* 同HttpServletRequest的getParameterNames方法
* @return 返回页面中所有元素的名称
*/
public Enumeration getParameterNames() {
return req.getParameterNames();
}
/**
* 同HttpServletRequest的getParameterValues(String fieldName)方法
* @param fieldName 页面中元素名称
* @return 返回页面中所有元素名称的所有值,以数组的方式存放。
*/
public String[] getParameterValues(String fieldName) {
return req.getParameterValues(fieldName);
}
/**
* 同HttpServletRequest的getQueryString()方法
* @return 请求网址的QueryString
*/
public String getQueryString() {
return req.getQueryString();
}
/**
* 根据xml中path中指定的valueObject的id,将页面上所有以
* valueObject的id的结尾的元素的值转换成为VO.如在Xml配置了多个valueObject,则只取第一个
* @return Object
*/
public Object getVO() throws Exception {
Object objVo = null;
int i = 0;
for (i = 0; voType.size() > i; i++) {
//判断是否为单笔VO,如在Xml配置了多个valueObject,则只取第一个
if (((String)voType.get(i)).equals("single")) {
break;
}
}
//通过带参数的getVO获取值
objVo = this.getVO((String)voId.get(i), i);
return objVo;
}
/**
* 根据xml中path中指定的valueObject的id,将页面上所有以
* valueObject的id的结尾的元素的值转换成为VO.
* @return Object
*/
public Object getVO(String id) throws Exception {
Object objVo = null;
int i = 0;
for (i = 0; voId.size() > i; i++) {
//判断是否为单笔VO,且传来的id是否和XMl中的Id一致
if (((String)voId.get(i)).equals(id) && ((String)voType.get(i)).equals("single")) {
break;
}
}
objVo = this.getVO(id, i);
return objVo;
}
/**
* 根据xml中path中指定的valueObject的id,和设定valueObject的数量,将页面上所有以
* valueObject的id的结尾的元素的值转换成为VO.
* @return Object
*/
private Object getVO(String id, int i) throws Exception{
Object objVo = null;
//如果Xml中配置的id不为空
if (voId.size() != 0) {
if(!"single".equals((String)voType.get(i))) {
throw new VOGdException("进行单笔转换时,type必须设定为single");
}
if(!id.equals((String)voId.get(i))) {
throw new VOGdException("进行单笔转换时,请确认输入的id是否和single对应,id=" + id);
}
Class classVo = Class.forName((String)voClass.get(i));
objVo = (Object)classVo.newInstance();//获取该id对应Class的实例
String strName = "";
String propName = "";
for (Enumeration e = req.getParameterNames(); e.hasMoreElements();) {//获取页面中所有的元素名
strName = (String)e.nextElement();
if(strName.endsWith("_" + (String)voId.get(i))) {//假如元素名的后缀为_+XMl中设定的id
propName = strName.substring(0,1).toUpperCase() + strName.substring(1, strName.lastIndexOf("_"));//将名称转换为set+首字母大写的方法名
Method mtdVo = classVo.getMethod("set" + propName, new Class[]{String.class});
try {
mtdVo.invoke(objVo, req.getParameterValues(strName));//将该对应的值注入VO对应的set方法里
} catch (IllegalArgumentException ex) {
throw ex;
}
}
}
//假如Xml中设定了验证VO
String action = infoIn.get("action") == null ? "" : (String)infoIn.get("action");
if (!"".equals(action) && voValidate.get(i) != null && "Y".equals(((String)voValidate.get(i)).toUpperCase())) {
try {
Method[] mtdVos = classVo.getMethods();//获取该VO的所有方法
for (int m = 0; mtdVos.length > m; m++) {
if ("validate".equals(mtdVos[m].getName())) {//假如VO中设定了validate方法
Method mtdVo = classVo.getMethod("validate", null);
String msg = (String)mtdVo.invoke(objVo, null);//则执行validate方法,并返回验证信息
if (!"".equals(msg)) {
throw new VODataValidate(msg);//如果验证结果有问题,则抛VODataValidate。
}
break;
}
}
} catch (IllegalArgumentException ex) {
throw ex;
}
}
} else {
throw new VOGdException("配置文档Xml中必须设定valueObject");
}
return objVo;
}
/**
* 根据指定的复选框名称checkFieldName,将选中的元素的值转换成为VO,存入List中返回,VO中的属性值不能以数字结尾
* @return Object
*/
public List getVOs(String checkFieldName) throws Exception {
List list = new ArrayList();
int i = 0;
for (i = 0; voType.size() > i; i++) {
//判断是否为多笔VO,如在Xml配置了多个valueObject,则只取第一个
if (((String)voType.get(i)).equals("many")) {
break;
}
}
//通过带参数的getVOs来获取List
list = this.getVOs((String)voId.get(i), checkFieldName, i);
return list;
}
/**
* 根据指定的复选框名称checkFieldName,将选中的元素的值转换成为VO,存入List中返回,VO中的属性值不能以数字结尾
* @return Object
*/
public List getVOs(String id, String checkFieldName) throws Exception {
List list = new ArrayList();
int i = 0;
for (i = 0; voId.size() > i; i++) {
//判断是否为多笔VO,且传来的id是否和XMl中的Id一致
if (((String)voId.get(i)).equals(id) && ((String)voType.get(i)).equals("many")) {
break;
}
}
list = this.getVOs(id, checkFieldName, i);
return list;
}
/**
* 根据指定的复选框名称checkFieldName,将选中的元素的值转换成为VO,存入List中返回,VO中的属性值不能以数字结尾
* @return Object
*/
private List getVOs(String id, String checkFieldName, int j) throws Exception {
List list = null;
//如果Xml中配置的id不为空
if (voId.size() != 0) {
list = new ArrayList();
if(!"many".equals((String)voType.get(j))) {
throw new VOGdException("进行多笔转换时,type必须设定为many");
}
if(!id.equals((String)voId.get(j))) {
throw new VOGdException("进行多笔转换时,请确认输入的id是否和many对应,id=" + id);
}
String[] chk = req.getParameterValues(checkFieldName);//获取所有被选中的名称为checkFieldName的值
Class classVo = Class.forName((String)voClass.get(j));
Object objVo = null;//获取该id对应Class的实例
String strName = "";
String propName = "";
String index = "";
for(int i = 0; chk != null && i < chk.length; i++) {//对选中的值进行循环
objVo = (Object)classVo.newInstance();//获取该id对应Class的实例
index = chk[i];//选中的check的值为流水号
for (Enumeration e = req.getParameterNames(); e.hasMoreElements() ;) {
strName = (String)e.nextElement();
if(strName.endsWith(index + "_" + (String)voId.get(j))) {//假如元素名的后缀为_+XMl中设定的id
String temp = strName.split(index + "_" + (String)voId.get(j))[0];
//判断元素名称除去流水号外的最后一个字母是否为数字,如果是数字,则不合法
if(temp.substring(temp.length()-1).compareTo("0") >= 0 && temp.substring(temp.length()-1).compareTo("9") <= 0)
continue;
propName = strName.substring(0,1).toUpperCase() + strName.substring(1,strName.lastIndexOf(index + "_"));;
Method mtdVo = classVo.getMethod("set" + propName, new Class[]{String.class});
mtdVo.invoke(objVo, req.getParameterValues(strName));//将该对应的值注入VO对应的set方法里
}
}
//假如Xml中设定了验证VO
String action = infoIn.get("action") == null ? "" : (String)infoIn.get("action");
if (!"".equals(action) && voValidate.get(i) != null && "Y".equals(((String)voValidate.get(i)).toUpperCase())) {
try {
Method[] mtdVos = classVo.getMethods();//获取该VO的所有方法
for (int m = 0; mtdVos.length > m; m++) {
if ("validate".equals(mtdVos[m].getName())) {//假如VO中设定了validate方法
Method mtdVo = classVo.getMethod("validate", null);
String msg = (String)mtdVo.invoke(objVo, null);//则执行validate方法,并返回验证信息
if (!"".equals(msg)) {
throw new VODataValidate(msg);//如果验证结果有问题,则抛VODataValidate。
}
break;
}
}
} catch (IllegalArgumentException ex) {
throw ex;
}
}
list.add(objVo);
}
} else {
throw new VOGdException("配置文档Xml中必须设定valueObject");
}
return list;
}
/**
* 得到HttpServletRequest对象
* @return HttpServletRequest对象
* @throws Exception
*/
public HttpServletRequest getHttpServletRequest() throws Exception {
return this.req;
}
/**
* 得到HttpServletResponse对象
* @return HttpServletResponse对象
* @throws Exception
*/
public HttpServletResponse getHttpServletReponse() throws Exception {
return this.res;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -