求问action A 如何调用action B 中的方法?(涉及B的初始化)

prhanxben 2008-06-12 04:32:24
初学SSH,这个累啊。。。
话说有一页中有3个不同的action,他们都有提交功能,(只是提交的东西不同)。已经在action B 中写好了完成提交的方法,写完之后我才发现,原来其他2个action也可以这么写,于是想在action A中直接调用 B中的方法,可是运行报错,说空指针,细看是 action B中的一个属性为空(该属性也是一个类)。
我很奇怪,为啥在action B 中调用这个函数没有问题,在别的action 调用它就会说空指针。
我想应该是action B 没有被正确的初始化吧?可是由页面调用action B 时也没有显式的初始化,它内部的属性就可以用。(真想知道它是在哪初始化它自己的)。
那么我在其他地方调用这个action B的类时,如何初始化它呢?

3大框架我实在没啥概念,可是又要用,求教各位了。多谢!
...全文
573 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sd5816690 2008-06-13
  • 打赏
  • 举报
回复

关于DispatchAction,就是根据参数调用不同的方法
下面是提交到一个action,但是调用不同的方法
例如 UserInfoAction
1、UserInfoAction 继承 DispatchAction
2、在 struts-config.xml 中加入
<action
attribute="userInfoForm"
input="/userInfo/register.jsp"
name="userInfoForm"
parameter="method"
path="/userInfo"
scope="request"
type="xxx.UserInfoAction"/>
3、在JSP页面的表单中加入隐藏表单域
<html:form action="/userInfo.do">
<input type="hidden" name="method" value="doAddUser">
...
</html:form>

根据隐藏表单域的value来调用对应的方法
比如上面的就是调用 doAddUser 方法
但是要注意的是,如果原来的Action 中有execute方法,需要删掉它
qq278095755 2008-06-13
  • 打赏
  • 举报
回复
struts里的action不能之间互相调用.
因为里面牵扯到了要用ActionForm接受参数的
whetu 2008-06-13
  • 打赏
  • 举报
回复
ObjectFactory factory=ObjectFactory.getObjectFactory();
Class classType=Class.forName(com.XXX.XXX.Tester); //通过反射得到类
Object kk = factory.buildBean(com.XXX.XXX.Tester,null); //得到action实例
Method addMethod=classType.getMethod("testnew Class[]{",int.class,Integer.class}); //蓝色部分是test的参数类型
Object result=addMethod.invoke(tester,
new Object[]{new Integer(100),new Integer(200)}); //黄色是实参


原来csdn的标签不能嵌套使用。
whetu 2008-06-13
  • 打赏
  • 举报
回复
楼主,如果你用的是struts2你继续往下看,如果你用struts1,就不用浪费时间了。

action是由Struts的ObjectFactory生成并进行初始化的。
当struts和spring结合时,这个工作是由spring 来管理,是一个叫strutsSpringObjectFactory的
类进行管理struts的各个action。action中那些需要注入的属性也是有spring来进行注入。
要在ActionA中使用ActionB的方法是可以的,在struts2中你可以这么做(struts1我没有用过,你可以去网上搜一下):

ActionA中实例化一个ObjectFactory,调用其buildBean方法,该方法起必须的参数是actionB的全路径和类名,来得到一个ActionB的对象。然后通过反射得到ActionB中你要调用的方法。最后执行该方法。假设ActionA中调用Tester的test方法,如下:

ObjectFactory factory=ObjectFactory.getObjectFactory();
Class classType=Class.forName(com.XXX.XXX.Tester); //通过反射得到类
Object kk = factory.buildBean(com.XXX.XXX.Tester,null); //得到action实例
Method addMethod=classType.getMethod("testnew Class[]{",int.class,Integer.class}); //蓝色部分是test的参数类型
Object result=addMethod.invoke(tester,
new Object[]{new Integer(100),new Integer(200)}); //黄色是实参

具体怎么得到actionB的全路径和类名,那就是你的问题了。
bufeng711 2008-06-13
  • 打赏
  • 举报
回复
利用反射机制是个解决问题的好办法
Landor2004 2008-06-12
  • 打赏
  • 举报
回复
楼主还是分离出来,你要让action去完成他的角色,框架封装了一些初始化action的操作

你那么用action跑不起来,以后出现别的问题你也不好处理

再说,重构一下你的方法应该很简单的
Shine_Panda 2008-06-12
  • 打赏
  • 举报
回复
为什么程序中可以直接使用action里的各种属性,但是没有见到它给这些属性初始化的代码!
有些是在框架一加载 就初始化了如mapping . 有写是在你提交表单的时候初始化的如form
Shine_Panda 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 prhanxben 的回复:]
引用 2 楼 WildboarRider 的回复:
你可以用DispathAction啊!

请问DispathAction啥意思?麻烦多讲2句吧,我实在没概念。
另外我特别想知道那些action是在哪里初始化的,为什么程序中可以直接使用action里的各种属性,但是没有见到它给这些属性初始化的代码!
[/Quote]
DispathAction 你可认为是可以有多个同execute方法一样功能的方法的 Action
prhanxben 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 WildboarRider 的回复:]
你可以用DispathAction啊!
[/Quote]
请问DispathAction啥意思?麻烦多讲2句吧,我实在没概念。
另外我特别想知道那些action是在哪里初始化的,为什么程序中可以直接使用action里的各种属性,但是没有见到它给这些属性初始化的代码!
prhanxben 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Landor2004 的回复:]
action是动作的意思,动作似乎不能来回调用吧,你可以把方法放到一个公共类里面呀
[/Quote]
这个我也想过了,可是开始已经把要用的方法写在其中一个action里了,再单拉一个类不是麻烦么,而且我也不想配置那些xml文件,看着头痛。。。
WildboarRider 2008-06-12
  • 打赏
  • 举报
回复
你可以用DispathAction啊!
Landor2004 2008-06-12
  • 打赏
  • 举报
回复
action是动作的意思,动作似乎不能来回调用吧,你可以把方法放到一个公共类里面呀

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧