Struts学习笔记

本文详细介绍了Struts框架中DispatchAction的使用方法及其配置细节,包括如何通过配置实现一个Action处理多个业务请求,以及在实际应用中可能出现的错误及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

    今晚上很郁闷, 为了一个小问题整整花费了自己近3个小时来调试...  ...  让大把时间花在这种价值不大的问题上真是心痛!!! 还原问题:

   diapatchAction工作原理: 根据Action元素的parameter属性值去获取请求中提交的参数名, 然后根据反射机制去调用请求处理的方法, 方法名和参数的值相同。

2、 struct-config.xml中action的parameter属性设置

这个是Struts的DispatchAction机制,
简单描述:
一个Action通常只能完成一种业务操作,如果你想在一个Action里处理多个业务请求,那么可以使用DispatchAction
只不过再配置Action的时候需要设置parameter="your_method";
请求时这样写http://localhost:8080/test.do?your_method=init
其中init是你继承DispatchAction的Action类的一个业务操作,
如果你的Action类写的不是继承DispatchAction的话,你的设置就没用了,有两种方法要么改配置去掉parameter="method" ,然后在action里用request.getPramater("method");来取得参数名称,或者将你的Action类继承DispatchAction.

 <action>的parameter属性是给DispatchAction使用的,你的类要继承DispatchAction类,而不是普通的Action,Action只会执行execute方法,DispatchAction会根据parameter的值执行特定的方法,注意parameter的值不要设置为execute,也不要覆盖DispatchAction中的execute(),因为DispatchAction继承于Action,它的execute会首先执行,在execute()方法中取出parameter的值,通过java反射调用指定的方法。

页面设置基本这样就可以了.如果是form中这样可以
<html:form action="/myTest.do?method=insert" metho="post">.
如果是超链 这样可以
<a herf="myTest.do?method=insert"">1111
另外action必须是extens dispatchaction的.

——————上述的方法我都知道并且验证通过, 我的问题是form表单中相应的参数一定得命名为method,当我换成别的名字时就报错了...按理说应该是随便命名的,  为什么呀???

  ————————————struts基础学习——————————

    每个Action都会初始化一个ActionMapping,再在execute方法中获取ActionMapping和ActionForm,接着调用业务逻辑类,最后由处理结果返回一个ActionForward给ActionServlet,告诉ActionServlet下一步做什么。
     2) 这时看struts-config.xml,讲清楚下面几个属性
 type:路径被请求时调用的Action 对象
 name:和HTMl表单一起使用的JavaBean helper (ActionForm)类
 scope:属性,标明是否将助手类存储在请求或者会话中的属性
 validate:属性,ActionForm在调用Action 对象前是否调用标准的校验方法
 input:属性,标明在校验方法返回False时,将控制发送到哪里
 attribute: 指定放在session等作用域中的键值 
 forward:由标签转到哪个jsp页面
     3) 再讲讲action的参数ActionMapping. 
        ActionMapping为每个Action提供应射信息,如关联的表单,请求路径等。我们主要用它的findForward返回一个ActionForward。ActionForward与ActionMapping中的每个forward标签对应。提供视图信息,即哪个jsp,访问别名,redirect=true为重定向,false为转向? 方法会首先检查局部转发列表。局部转发查找失败才会触发全局转发的查找&lt;global-forwards /&gt;。如果在两个地方都没有找到相应的 forward ,findForward 方法将返回null。如果不幸发生了这种事情,因为Action 类和Struts 配置不一致,Action 对象就会返回一个空(null)ActionForward,使浏览器报告错误。
 a. 在struts-config.xml视图上新建forward-选择全局的-填写name/path即可。
     4) DispatcherAction
 其实刚刚没讲新功能,我们想如果想调用一个action中的不同方法,则要求
   a. 继承DispatcherAction,在struts-config.xml视图上新建action,选择超类org.apache.struts.actions.DispatchAction等,关联一个表单,选择input source,不用再选择forward,可用刚才建的全局的
   b. 注释execute方法,写do1/do2/do3方法,参数同execute
   c. 在struts-config.xml中的action中加:parameter=“mm“
   d. 在jsp的form或超链中调用:logon.do?mm=do1等等

  ——————————————————————————————————————

<action>的parameter属性是给DispatchAction使用的,你的类要继承DispatchAction类,而不是普通的Action,Action只会执行execute方法,DispatchAction会根据parameter的值执行特定的方法,注意parameter的值不要设置为execute,也不要覆盖DispatchAction中的execute(),因为DispatchAction继承于Action,它的execute会首先执行,在execute()方法中取出parameter的值,通过java反射调用指定的方法。

——————————————————————常见错误之does not contain handler parameter named

   今天也犯了这个错误.被郁闷了半天.

到最后原因是没有写POST方式.

主要是没有用html:form标签,直接用的form,就忘了这项了.

 

列一下这个错误的主要产生的根源:

1.struts-config.xml在ACTION属性里加上parameter="method",一般这个是不会忘的

2.action要继承DispatchAction

3.就是不用html:form标签时,一定要设置method="post"

Struts DispatchAction 报错

 

 

使用Struts的DispatchAction时报错:does not contain handler parameter named 'method'. This may be caused by whitespace in the label text

这个异常往往是大家对DispatchAction 不熟悉造成,在用它的时候别忘记了在STRUTS-CONFIG中的<action>属性加

parameter="method",还有<html:form>和普通的<form>是有区别的,在用form提交表单的时候别忘记要家范围method="post",不

然也会有错,还有在action.do?method=XXXX这个中间不要有空格!

 

   这个原因是.你用DispatchAction这个类的话 form 表单里面,如果是不设置method方法为post 的话.就会出现这样的问题,用改用GET方式请求试一下.就可以重现了

 

今天遇到了Struts DispatchAction错误:

 

——————————————————————关于struts中国际化的问题

     使用了“过渡文件”的方式来解决这个问题, 过渡文件可随便命名,但是必须与之后写的语言转换文件 XXX.bat中保持一致,

 在目标文件后加上  YYY_zh_CN.properties的后缀。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值