struts2为Action配置method属性将Action类中的每一个处理方法都定义成一个逻辑Action方法。
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="my" extends="struts-default" namespace="/manage"> <action name="userLogin" class="org.qiujy.web.struts2.action.LoginAction" method="login"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> <action name="userRegist" class="org.qiujy.web.struts2.action.LoginAction" method="regist"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
如上,把LoginAction中的login和regist方法都配置成逻辑Action。要调用login方法,则相应的把index.jsp中表单元素的action设置为"manage/userLogin.action";要调用regist方法,把regist.jsp中表单元素的action设置为"manage/userRegist.action"。
使用通配符映射(wildcard mappings)方式:
在struts.xml文件中配置<action…>元素时,它的name、class、method属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。
当我们使用通配符定义Action的name属性时,相当于用一个元素action定义了多个逻辑Action:
<action name="user_*" class="org.qiujy.web.struts2.action.UserAction" method="{1}"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action>
如上,<action name=”user_*”>定义一系列请求URL是user_*.action模式的逻辑Action。同时method属性值为一个表达式{1},表示它的值是name属性值中第一个*的值。例如:用户请求URL为user_login.action时,将调用到UserAction类的login方法;用户请求URL为user_regist.action时,将调用到UserAction类的regist方法。
处理结果
如果在配置文件中写Action执行完的跳转的路径,那么在编写Action Java代码的时候还需要切换至配置文件才能知道action转向那个页面,直接写在Action中不好么?
依照这种并且结合struts1,struts2的零配置,已经在多个项目中应用,也没发现问题
struts1中我的做法是
-
public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //...... return new ActionForward("/demo/Blog/edit.jsp"); }
struts1中自己另外做了扩展,可以将action的name作为formBean的配置,整个项目的struts-config配置只有下面这么一段话,path举例/admin/User/delete.do
-
<action-mappings> <action path="/*/*/*" type="com.kingsoft.{1}.web.action.{2}Action" name="com.kingsoft.{1}.web.form.{2}Form" scope="request" validate="false" parameter="{3}" attribute="{2}Form"> </action> </action-mappings>
跳转到页面和跳转到action
struts2中自己另外做了扩展,实现forward的做法是
/**进入更新页面*/ public String edit() { blog = (Blog)blogManager.getById(id); return "/demo/Blog/edit.jsp"; }
struts2
-
/**保存更新*/ public String update() { blogManager.update(this.blog); return "!/demo/Blog/list.action"; }
具体跳转例子
struts2
<package name="default" namespace="/demo" extends="custom-default"> <action name="*/*" method="{2}" class="com.kingsoft.demo.action.{1}Action"> <result name="*" type="direct">通过Action直接返回</result> </action> </package>
java action中进行调用
public class StatAction extends BaseStruts2Action implements Preparable,ModelDriven{ protected static final String JSP_dataDay="/WEB-INF/pages/stat/dataDay.jsp"; /** * 日数据查询 * @return */ public String dataDay(){ //.... return JSP_dataDay; }
例子:请求(注意,xml中的namespace必须为“”,否则报错;namespace的含义:命名空间,在浏览器里面输入的东西,http://ip地址:端口号/项目部署名称/namespace/action名称):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <include file="struts-default.xml"/> <!-- 替换struts.properties中的属性 action name="*/*/*" 中的/ 可用 --> <constant name="struts.enable.SlashesInActionNames" value="true"></constant> <!-- struts2的action必须放在一个指定的包空间下定义 --> <package name="kk" namespace="" extends="struts-default" > <!-- 定义处理请求URL为:功能模块包名/Bean名/方法名 例如:bankinfor/BcmBankInfor/queryBankInfor--> <action name="*/*/*" method="{3}" class="function.business.{1}.action.{2}Action"> <result name="success">/pages/{1}/list.jsp</result> </action> </package> </struts>