Struct2 简单映射

struts2Action配置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中的loginregist方法都配置成逻辑Action。要调用login方法,则相应的把index.jsp中表单元素的action设置为"manage/userLogin.action";要调用regist方法,把regist.jsp中表单元素的action设置为"manage/userRegist.action"

使用通配符映射(wildcard mappings)方式:

struts.xml文件中配置<action…>元素时,它的nameclassmethod属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。

当我们使用通配符定义Actionname属性时,相当于用一个元素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_*”>定义一系列请求URLuser_*.action模式的逻辑Action。同时method属性值为一个表达式{1},表示它的值是name属性值中第一个*的值。例如:用户请求URLuser_login.action时,将调用到UserAction类的login方法;用户请求URLuser_regist.action时,将调用到UserAction类的regist方法。

处理结果

如果在配置文件中写Action执行完的跳转的路径,那么在编写Action Java代码的时候还需要切换至配置文件才能知道action转向那个页面,直接写在Action中不好么?
依照这种并且结合struts1,struts2的零配置,已经在多个项目中应用,也没发现问题



struts1
中我的做法是

  1. public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request,   
            HttpServletResponse response) {   
             //......   
        return new ActionForward("/demo/Blog/edit.jsp");   
    } 
     

  public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request,

     HttpServletResponse response) {

           //......

   return new ActionForward("/demo/Blog/edit.jsp");

  }

struts1中自己另外做了扩展,可以将actionname作为formBean的配置,整个项目的struts-config配置只有下面这么一段话,path举例/admin/User/delete.do

  1. <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-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";

  }

/**进入更新页面*/  
public String edit() {   
    blog = (Blog)blogManager.getById(id);   
    return "/demo/Blog/edit.jsp";   
}  

 

struts2

中实现redirect的做法是,前面增加了一个"!"
  1. /**保存更新*/  
    public String update() {   
        blogManager.update(this.blog);   
        return "!/demo/Blog/list.action";   
    } 
      

  /**保存更新*/

  public String update() {

   blogManager.update(this.blog);

   return "!/demo/Blog/list.action";

  }

具体跳转例子



struts2

增加了direct的返回类型,struts.xml配置也只有一段话
<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>

 

猜你喜欢

转载自duan10jun.iteye.com/blog/1872718