2019独角兽企业重金招聘Python工程师标准>>>

我在项目中也写了一个模仿Struct的Action类,目前还不成熟,先拿出来讨论讨论。
mfaction.xml
<?xml version="1.0" encoding="GBK"?>
<thinkwide><include file="user.xml"/> <constant name="MFSys.Debug" value="true"/><constant name="MFSys.encoding" value="GB2312"/><package name="test" namespace="test/">    <action name="user" class="weaver.test.testuser" method="test">    <result name="success">testExcel.jsp</result> <result name="test">/login.jsp</result>   </action>  </package>
</thinkwide>/***************************************************************** <strong>MFActionManager动作管理类</strong>* * <p>* MFActionManager动作管理类* </p>* * @author  AndyZhang 2011* @version 0.1 * ToDo:2011-12-29***************************************************************/package weaver.action;import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import weaver.core.MFPath;
import weaver.core.MFString;
import weaver.debug.MFDebug;
import weaver.ormapping.MFDbTypeTransfer;
import weaver.ormapping.MFReflect;public class MFActionManager {private List<String> includeFiles;private Map<String,String> configs;private MFActionItems items;private HttpServletRequest request;private HttpServletResponse response;private static String ext=".tw";private static String execute="execute";public MFActionManager(){includeFiles=new ArrayList<String>();configs=new HashMap<String, String>();//loadMain();items=new MFActionItems();}public MFActionManager(HttpServletRequest request,HttpServletResponse response){this();updateState(request,response); }public void updateState(HttpServletRequest request,HttpServletResponse response){this.request=request;this.response=response;}public boolean prepareProperty(Class<?> classType,Object obj) throws Throwable{if (obj instanceof IMFRequestAware){((IMFRequestAware) obj).setRequest(request);((IMFRequestAware) obj).setResponse(response);}Enumeration params=request.getParameterNames();while(params.hasMoreElements()){String name=(String)params.nextElement();String value=request.getParameter(name);if (MFString.NotNullOrEmpty(name) && MFReflect.IsHaveProperty(obj,name)){Class<?> type=MFReflect.GetPropertyType(obj, name);Object typedValue = MFDbTypeTransfer.toJavaType(type, value);MFReflect.SetProperty(obj, name, typedValue);}}return true;}public boolean runAction(MFActionItem item) throws Throwable{if (item!=null){Class<?> c=Class.forName(item.getClassName());Object obj=c.newInstance();prepareProperty(c,obj);String methodName =MFString.NullToString(item.getMethod(),execute);Method method=c.getDeclaredMethod(methodName, null);Object value=method.invoke(obj, null);if (value!=null){String url=item.getResults().get(value);if (MFString.NotNullOrEmpty(url)){//String path=MFString.NullToString(item.getNamespace())+url;response.sendRedirect(url);}             }}return false;}public boolean runAction(String url) throws Throwable{MFActionItem item=findAction(url);return runAction(item);}public String CheckPath(String url){if (MFString.NotNullOrEmpty(url)  && !url.startsWith(MFPath.useparator)) url=MFPath.useparator+url;return url;}public MFActionItem findAction(String url){for(MFActionItem item:items){String Str=MFString.NullToString(item.getNamespace())+item.getActionName()+ext;Str=CheckPath(Str);if (MFString.ComparerNoCase(url, Str)) {MFDebug.println("find");return item;}}return null;}public String getAttrValue(Element item,String name){Attribute attr=item.attribute(name);if (attr!=null){String text=attr.getText();return text;}return null;   }public boolean loadConfig(String filePath) throws DocumentException{File file = new File(filePath);SAXReader reader = new SAXReader();Document doc=reader.read(file);Element root = doc.getRootElement(); //load include filefor (Iterator<?> i = root.elementIterator("include"); i.hasNext();) {Element item = (Element) i.next();String value=getAttrValue(item,"file");if (MFString.NotNullOrEmpty(value)) includeFiles.add(value);   }//load constantfor (Iterator<?> i = root.elementIterator("constant"); i.hasNext();) {Element item = (Element) i.next();String conName=getAttrValue(item,"name");String conValue=getAttrValue(item,"value");if (MFString.NotNullOrEmpty(conName)&&MFString.NotNullOrEmpty(conValue) ) {configs.put(conName, conValue);}     }//load actionfor (Iterator<?> i = root.elementIterator("package"); i.hasNext();) {Element packageItem = (Element) i.next();String packageName=getAttrValue(packageItem,"name");String namespace=getAttrValue(packageItem,"namespace");for (Iterator<?> j = packageItem.elementIterator("action"); j.hasNext();) {MFActionItem action=new MFActionItem();Element actionItem = (Element) j.next();String actionName=getAttrValue(actionItem,"name");String className=getAttrValue(actionItem,"class");String method=getAttrValue(actionItem,"method");action.setPackageName(packageName);action.setNamespace(namespace);action.setActionName(actionName);action.setActionName(actionName);action.setClassName(className);action.setMethod(method);for (Iterator<?> k = actionItem.elementIterator("result"); k.hasNext();) {Element resultItem = (Element) k.next();String resultName=getAttrValue(resultItem,"name");String url=(String)resultItem.getData();action.getResults().put(resultName, url);}items.add(action);}}return true;}public void setIncludeFiles(List<String> includeFiles) {this.includeFiles = includeFiles;}public List<String> getIncludeFiles() {return includeFiles;}
}

转载于:https://my.oschina.net/cnet2001/blog/55002

一个模仿Struct的Action类相关推荐

  1. 一个action类中写多个方法需要继承MappingDispatchAction

    原本action里只有一个默认execute方法,今天我在action里增加了方法后发现页面卡死无法跳转了,原来如果写多个方法要继承DispatchAction类. 一个action中有一个execu ...

  2. Cocos2d之Action类详解

    一.声明 文章中使用到的cocos2d的源代码的版本是cocos2d-x-3.3rc0. 二.主要内容 [Action类简介] 在cocos2d中,Action类是所有动作的基类.Action类继承了 ...

  3. Struts2教程6:在Action类中获得HttpServletResponse对象的四种方法

    在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和request.而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得H ...

  4. JAVA框架Struts2 Action类

    一.Action书写方式: 接口地址:https://struts.apache.org/maven/struts2-core/apidocs/index.html Action类就是一个POJO类. ...

  5. Struts2中的action类

    Struts2中的action类 action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值. 在Struts2里面,Action充当 ...

  6. Struts2 - 在Action类中获得HttpServletResponse对象

    Struts2 - 在Action类中获得HttpServletResponse对象 在struts1.x Action类的execute方法中,有四个参数,其中两个就是 response和reque ...

  7. 在Action类中获得HttpServletResponse对象的四种方法

    Struts2:在Action类中获得HttpServletResponse对象的四种方法 在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和req ...

  8. 关于JFace中的右键菜单Action类,ActgionGroup类,MenuManager类

    Action类,ActionGroup类,MenuManager类介绍 SWT中菜单是Menu类,菜单项用MeauItem类来实现.但是在实际开发中,同一种功能会有多中表现形式, 例如:Eclipse ...

  9. Struts2中XXX.Action类中方法的访问(三种方式)

    第一种:使用action标签的method属性(常规方法) Action类: package cn.tedu.web;import org.springframework.context.annota ...

  10. ssh备考-05Struts2 Action类下的重要API(原生Servlet的API、跳转配置、框架自身的数据封装、自定义拦截器)

    目录 一.Struts框架中如何使用原生Servlet的API 方法一.使用ActionContext类(完全解耦合的方式)(不好用,了解) demo1.jsp demo1Action.java    ...

最新文章

  1. C#中怎样获取默认配置文件App.config中配置的键值对内容
  2. Winform中使用控件的Dock属性设计窗体布局,使不随窗体缩放而改变
  3. python修改第三方库重写_Python安装第三方库,切换镜像源
  4. Windows下MySQL数据库名及表名无法大写的问题
  5. 洛谷 P1136 迎接仪式 解题报告
  6. Spring Integration Java DSL示例–使用Jms名称空间工厂进一步简化
  7. python调用动态链接库传送protobuf数据。
  8. 传统emmc所用的sdio接口_SolidGear SD/SDIO/eMMC协议分析仪
  9. HDU-2024c语言合法标识符
  10. golang基础-etcd介绍与使用、etcd存取值、etcd监测数据写入
  11. ERROR: ld.so: object '/usr/lib64/libtcmalloc.so.4' from LD_PRELOAD cannot be preloaded: ignored
  12. Lync Server 2010迁移至Lync Server 2013部署系列 Part13:DNS记录变更
  13. 2020计算机二级vb考试题库,2020年计算机二级VB题库计算机二级考试题库.docx
  14. win7计算机怎么录屏,Win7系统屏幕录制功能在哪里?Win7系统屏幕录制功能的使用教程...
  15. 教育培训机构拼团招生小程序公众号
  16. Linux如何磁盘分区
  17. 构建地形系统(翻译)1
  18. android怎么点击换图片,ImageButton单击切换按钮图片
  19. 最全的厚黑学...教你怎样混社会(转...作者不是一般的城府,但这就是中国真实的社交关系,深的很)
  20. 西电通院随机信号实验(FPGA实现2ASK键控、RC低通滤波器、Matlab实现SSB调制)

热门文章

  1. php公众号第三方登录,微信公众号开发小记——3.接入三方登录
  2. c语言警告文件末尾没有换行符,“文件末尾没有换行符”编译器警告
  3. java 求高精度幂_POJ 1001 求高精度幂【JAVA】
  4. mysql读写分离_SpringBoot+MyBatis+MySQL读写分离
  5. 刚刚,蚂蚁金服荣膺“中国金融大数据领军企业”称号 1
  6. 为什么 Math.min() 比 Math.max() 大?
  7. 忘记root密码,使用救援模式,grup设置密码
  8. HttpContext.Current
  9. linux下单网卡设双置IP
  10. c语言一行灯的熄灯问题,熄灯问题