原本一个action对应一个exctue方法做业务处理,那么是不是很浪费呢?怎么让一个action可以包含多个处理方法呢?
1,继承(a)DispatchAction,(b)MappingDispatchAction,(c)LookupDispatchAction
2,分别适用于什么情况,a,b都可以通过在form的action和link等传递一个参数过去,让struts框架得知需要调用action中哪个方法,但是a的耦合性没有b的好。
3,a的配置文件
- <action
- attribute="buyForm"
- input="/buy.jsp"
- name="buyForm"
- path="/buy"
- parameter="ope"
- scope="request"
- type="prj11_1.action.BuyAction"/>
- [code=HTML]<html:formaction="/buy.do?ope=add">
- insertbook:<html:textproperty="book"/><html:errorsproperty="book"/><br/>
- <html:submit/><html:cancel/>
- </html:form>
- <hr>
- showbook:<logic:presentname="cart">
- <logic:iterateid="book"name="cart">
- <bean:writename="book"/>
- <html:linkaction="/buy?ope=delete"paramId="BOOK"paramName="book">delete</html:link>
- </logic:iterate>
- </logic:present>
<action
attribute="buyForm"
input="/buy.jsp"
name="buyForm"
path="/buy"
parameter="ope"
scope="request"
type="prj11_1.action.BuyAction" />
[code=HTML]<html:form action="/buy.do?ope=add">
insert book : <html:text property="book"/><html:errors property="book"/><br/>
<html:submit/><html:cancel/>
</html:form>
<hr>
show book:<logic:present name="cart">
<logic:iterate id="book" name="cart">
<bean:write name="book"/>
<html:link action="/buy?ope=delete" paramId="BOOK" paramName="book">delete</html:link>
</logic:iterate>
</logic:present>
这段代码就调用a的action。到底区别在哪里呢?<html:linkaction="/buy?ope=delete><html:formaction="/buy.do?ope=add">就在这里,系统通过add和delete来识别调用的方法,但是jsp必须知道是哪个action。这样不太好。
b的配置文件
- <action
- attribute="buyForm"
- input="/buy.jsp"
- name="buyForm"
- path="/add"
- parameter="add"
- scope="request"
- type="prj11_1.action.BuyAction"/>
-
- <action
- attribute="buyForm"
- input="/buy.jsp"
- name="buyForm"
- path="/delete"
- parameter="delete"
- scope="request"
- type="prj11_1.action.BuyAction"/>
<action
attribute="buyForm"
input="/buy.jsp"
name="buyForm"
path="/add"
parameter="add"
scope="request"
type="prj11_1.action.BuyAction" />
<action
attribute="buyForm"
input="/buy.jsp"
name="buyForm"
path="/delete"
parameter="delete"
scope="request"
type="prj11_1.action.BuyAction" />
[/code]
- <html:formaction="/add">
- insertbook:<html:textproperty="book"/><html:errorsproperty="book"/><br/>
- <html:submit/><html:cancel/>
- </html:form>
- <hr>
- showbook:<logic:presentname="cart">
- <logic:iterateid="book"name="cart">
- <bean:writename="book"/>
- <html:linkaction="/delete"paramId="BOOK"paramName="book">delete</html:link>
- </logic:iterate>
- </logic:present>
<html:form action="/add">
insert book : <html:text property="book"/><html:errors property="book"/><br/>
<html:submit/><html:cancel/>
</html:form>
<hr>
show book:<logic:present name="cart">
<logic:iterate id="book" name="cart">
<bean:write name="book"/>
<html:link action="/delete" paramId="BOOK" paramName="book">delete</html:link>
</logic:iterate>
</logic:present>
调用了继承b的action通过配置文件,直接可以确定调用那个action方法了。注意parameter="delete"和parameter="add"。
c的配置文件
<action
attribute="lrForm"
input="/lr.jsp"
name="lrForm"
parameter="ope"
path="/lr"
scope="request"
type="prj11_1.action.LrAction"/>
c可以用来判断2个不同功能按钮到底怎么做出来。但是要结合资源文件来使用。
jsp页面
- <html:formaction="/lr">
- account:<html:textproperty="account"/><br/>
- password:<html:passwordproperty="password"/><br/>
- <html:submitproperty="ope"><bean:messagekey="info.login"/></html:submit>
- <html:submitproperty="ope"><bean:messagekey="info.register"/></html:submit>
- </html:form>
<html:form action="/lr">
account : <html:text property="account"/><br/>
password : <html:password property="password"/><br/>
<html:submit property="ope"><bean:message key="info.login"/></html:submit>
<html:submit property="ope"><bean:message key="info.register"/></html:submit>
</html:form>
资源文件
info.login=login
info.register=register
action的代码
- publicclassLrActionextendsLookupDispatchAction{
-
- protectedMapgetKeyMethodMap(){
- Mapmap=newHashMap();
- map.put("info.login","login");
- map.put("info.register","register");
- returnmap;
- }
- publicActionForwardlogin(ActionMappingmapping,ActionFormform,
- HttpServletRequestrequest,HttpServletResponseresponse){
- LrFormlrForm=(LrForm)form;
- returnnull;
- }
-
- publicActionForwardregister(ActionMappingmapping,ActionFormform,
- HttpServletRequestrequest,HttpServletResponseresponse){
- LrFormlrForm=(LrForm)form;
- returnnull;
- }
public class LrAction extends LookupDispatchAction {
protected Map getKeyMethodMap() {
Map map=new HashMap();
map.put("info.login","login");
map.put("info.register","register");
return map;
}
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LrForm lrForm = (LrForm) form;
return null;
}
public ActionForward register(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LrForm lrForm = (LrForm) form;
return null;
}
必须实现getKeyMethodMap