今晚上很郁闷, 为了一个小问题整整花费了自己近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为转向? 方法会首先检查局部转发列表。局部转发查找失败才会触发全局转发的查找<global-forwards />。如果在两个地方都没有找到相应的 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时报错: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的后缀。