weixin_42315602 2009-06-13 18:02
浏览 310
已采纳

如何得到当前运行的action中运行的方法的名字呢?

例如:程序执行时调用了com.weberyb.bbs.action这个包中的UserAction这个类中的getList这个方法,请问有什么办法拿到这个方法的名字吗?
[b]问题补充:[/b]
用反射的话只能拿指定的方法名,不过我想要的是方法名是action执行时从struts.xml的配置文件中动态解析出来的方法名;
例如:userAction 中有很多方法,在action执行时struts根据
解析出要用的方法是reg这个方法,那如果用Class c= Class.forname(classname)得到的只是userAction这个类,并不知道需要调用的具体的方法名,我想做成一个通用的类,当action执行的时候就动态的知道调用的是哪个类中的哪个方法,那请问要如何实现呢?难道要去动态解析xml文件吗?那用反射去获得类好像就没有什么意义了 8)
[b]问题补充:[/b]
请问lovewhzlq那还有什么办法去实现动态拿方法名这个做法吗?
[b]问题补充:[/b]
whistler兄弟可能误解我的意思了,我的项目是用ssh做的,用的struts2做的mvc,不是struts。不过你说所说的的确是解决问题的办法,不过我的项目写的都很多了,要来改成这样的写法太麻烦,刚刚想了下,于是直接用
ServletActionContext.getRequest().getServletPath()这个方法得到了action请求的url,在用正则表达式匹配出×××.action来解决了这个问题

  • 写回答

4条回答 默认 最新

  • iteye_19131 2009-06-14 01:53
    关注

    利用反射
    struts1.x的配置文件中action元素并没有method这个参数,方法的确定是根据中parameter这个参数的值method来确定。

    当你想要请求UserAction的addUser方法时,应该提供名称为method的这么一个参数,其值为addUser,即 http://主机名:端口号/UserAction?method=addUser

    大概的[color=red]模拟[/color]实现时这样的:
    目标UserAction继承org.apache.struts.actions.DispatchAction,DispatchAction继承org.apache.struts.action。

    /**

    • 这个类用来处理Dispatch(分发)的实现
      /
      public class DispatchAction implements Action{
      protected Class clazz = this.getClass();
      protected Class[] types =
      {
      ActionMapping.class,
      ActionForm.class,
      HttpServletRequest.class,
      HttpServletResponse.class
      };
      /
      *

      • 用来执行具体的请求操作
      • @return ActionForward */ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request,
        HttpServletResponse response) { return dispachMethod(mapping,form,request,response); }

      /**

      • 用来执行具体的请求操作
      • @return ActionForward
        */
        public ActionForward dispachMethod(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,

        HttpServletResponse response)
        {

        ActionForward forward = null;

    [color=green]/*通过调用ActionMapping 的实例mapping的getParameter()我们可以获得parameter这个参数的值即method*/[/color]
    String parameterNmae = mapping.getParameter();

    [color=green]/*根据“method”获得目标方法名称“addUser”*/[/color]
    String methodName = request.getParameter(parameterNmae);

        try 
        {
        [color=green]/*利用反射根据方法名称“addUser”和参数类型数组types获得目标方法的实例*/[/color]
    
        Method method = clazz.getMethod(methodName, types);
        [color=green]/*构造参数实例数组*/[/color]
        Object[] typesVlaues = new Object[]{request,response,mapping,form};
    
        [color=green]/*执行目标对象的目标方法*/[/color]
        forward = (ActionForward)method.invoke(this, parameterVlaues);
    
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return forward;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题