?? gdinfoinandout.java
字號(hào):
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中設(shè)定的voId
private List voClass = new ArrayList();//獲取Xml中設(shè)定的voClass
private List voType = new ArrayList();//獲取Xml中設(shè)定的voType
private List voValidate = new ArrayList();//獲取Xml中設(shè)定的voValidate
/**
* 構(gòu)造函數(shù)
* @throws Exception
*/
public GdInfoInAndOut() throws Exception {
}
/**
* 構(gòu)造函數(shù)
* @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);
}
/**
* 構(gòu)造函數(shù)
* @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);//根據(jù)名稱獲取對(duì)應(yīng)的值
if (values == null) {//假如沒有值
infoIn.put(strName, "");
} else if (values.length == 1) {//假如只有一個(gè)值
infoIn.put(strName, values[0]);
} else {//假如有多個(gè)值
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 返回頁面中所有元素名稱的所有值,以數(shù)組的方式存放。
*/
public String[] getParameterValues(String fieldName) {
return req.getParameterValues(fieldName);
}
/**
* 同HttpServletRequest的getQueryString()方法
* @return 請(qǐng)求網(wǎng)址的QueryString
*/
public String getQueryString() {
return req.getQueryString();
}
/**
* 根據(jù)xml中path中指定的valueObject的id,將頁面上所有以
* valueObject的id的結(jié)尾的元素的值轉(zhuǎn)換成為VO.如在Xml配置了多個(gè)valueObject,則只取第一個(gè)
* @return Object
*/
public Object getVO() throws Exception {
Object objVo = null;
int i = 0;
for (i = 0; voType.size() > i; i++) {
//判斷是否為單筆VO,如在Xml配置了多個(gè)valueObject,則只取第一個(gè)
if (((String)voType.get(i)).equals("single")) {
break;
}
}
//通過帶參數(shù)的getVO獲取值
objVo = this.getVO((String)voId.get(i), i);
return objVo;
}
/**
* 根據(jù)xml中path中指定的valueObject的id,將頁面上所有以
* valueObject的id的結(jié)尾的元素的值轉(zhuǎn)換成為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;
}
/**
* 根據(jù)xml中path中指定的valueObject的id,和設(shè)定valueObject的數(shù)量,將頁面上所有以
* valueObject的id的結(jié)尾的元素的值轉(zhuǎn)換成為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("進(jìn)行單筆轉(zhuǎn)換時(shí),type必須設(shè)定為single");
}
if(!id.equals((String)voId.get(i))) {
throw new VOGdException("進(jìn)行單筆轉(zhuǎn)換時(shí),請(qǐng)確認(rèn)輸入的id是否和single對(duì)應(yīng),id=" + id);
}
Class classVo = Class.forName((String)voClass.get(i));
objVo = (Object)classVo.newInstance();//獲取該id對(duì)應(yīng)Class的實(shí)例
String strName = "";
String propName = "";
for (Enumeration e = req.getParameterNames(); e.hasMoreElements();) {//獲取頁面中所有的元素名
strName = (String)e.nextElement();
if(strName.endsWith("_" + (String)voId.get(i))) {//假如元素名的后綴為_+XMl中設(shè)定的id
propName = strName.substring(0,1).toUpperCase() + strName.substring(1, strName.lastIndexOf("_"));//將名稱轉(zhuǎn)換為set+首字母大寫的方法名
Method mtdVo = classVo.getMethod("set" + propName, new Class[]{String.class});
try {
mtdVo.invoke(objVo, req.getParameterValues(strName));//將該對(duì)應(yīng)的值注入VO對(duì)應(yīng)的set方法里
} catch (IllegalArgumentException ex) {
throw ex;
}
}
}
//假如Xml中設(shè)定了驗(yàn)證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中設(shè)定了validate方法
Method mtdVo = classVo.getMethod("validate", null);
String msg = (String)mtdVo.invoke(objVo, null);//則執(zhí)行validate方法,并返回驗(yàn)證信息
if (!"".equals(msg)) {
throw new VODataValidate(msg);//如果驗(yàn)證結(jié)果有問題,則拋VODataValidate。
}
break;
}
}
} catch (IllegalArgumentException ex) {
throw ex;
}
}
} else {
throw new VOGdException("配置文檔Xml中必須設(shè)定valueObject");
}
return objVo;
}
/**
* 根據(jù)指定的復(fù)選框名稱checkFieldName,將選中的元素的值轉(zhuǎn)換成為VO,存入List中返回,VO中的屬性值不能以數(shù)字結(jié)尾
* @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配置了多個(gè)valueObject,則只取第一個(gè)
if (((String)voType.get(i)).equals("many")) {
break;
}
}
//通過帶參數(shù)的getVOs來獲取List
list = this.getVOs((String)voId.get(i), checkFieldName, i);
return list;
}
/**
* 根據(jù)指定的復(fù)選框名稱checkFieldName,將選中的元素的值轉(zhuǎn)換成為VO,存入List中返回,VO中的屬性值不能以數(shù)字結(jié)尾
* @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;
}
/**
* 根據(jù)指定的復(fù)選框名稱checkFieldName,將選中的元素的值轉(zhuǎn)換成為VO,存入List中返回,VO中的屬性值不能以數(shù)字結(jié)尾
* @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("進(jìn)行多筆轉(zhuǎn)換時(shí),type必須設(shè)定為many");
}
if(!id.equals((String)voId.get(j))) {
throw new VOGdException("進(jìn)行多筆轉(zhuǎn)換時(shí),請(qǐng)確認(rèn)輸入的id是否和many對(duì)應(yīng),id=" + id);
}
String[] chk = req.getParameterValues(checkFieldName);//獲取所有被選中的名稱為checkFieldName的值
Class classVo = Class.forName((String)voClass.get(j));
Object objVo = null;//獲取該id對(duì)應(yīng)Class的實(shí)例
String strName = "";
String propName = "";
String index = "";
for(int i = 0; chk != null && i < chk.length; i++) {//對(duì)選中的值進(jìn)行循環(huán)
objVo = (Object)classVo.newInstance();//獲取該id對(duì)應(yīng)Class的實(shí)例
index = chk[i];//選中的check的值為流水號(hào)
for (Enumeration e = req.getParameterNames(); e.hasMoreElements() ;) {
strName = (String)e.nextElement();
if(strName.endsWith(index + "_" + (String)voId.get(j))) {//假如元素名的后綴為_+XMl中設(shè)定的id
String temp = strName.split(index + "_" + (String)voId.get(j))[0];
//判斷元素名稱除去流水號(hào)外的最后一個(gè)字母是否為數(shù)字,如果是數(shù)字,則不合法
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));//將該對(duì)應(yīng)的值注入VO對(duì)應(yīng)的set方法里
}
}
//假如Xml中設(shè)定了驗(yàn)證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中設(shè)定了validate方法
Method mtdVo = classVo.getMethod("validate", null);
String msg = (String)mtdVo.invoke(objVo, null);//則執(zhí)行validate方法,并返回驗(yàn)證信息
if (!"".equals(msg)) {
throw new VODataValidate(msg);//如果驗(yàn)證結(jié)果有問題,則拋VODataValidate。
}
break;
}
}
} catch (IllegalArgumentException ex) {
throw ex;
}
}
list.add(objVo);
}
} else {
throw new VOGdException("配置文檔Xml中必須設(shè)定valueObject");
}
return list;
}
/**
* 得到HttpServletRequest對(duì)象
* @return HttpServletRequest對(duì)象
* @throws Exception
*/
public HttpServletRequest getHttpServletRequest() throws Exception {
return this.req;
}
/**
* 得到HttpServletResponse對(duì)象
* @return HttpServletResponse對(duì)象
* @throws Exception
*/
public HttpServletResponse getHttpServletReponse() throws Exception {
return this.res;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -