大家好,想请教一个问题是关于struts2的Action在struts.xml中的配置,我说的配置不是说怎么在struts.xml配置方法,我是想问大家做项目的时候都是怎么配置的,小弟是没有struts2的项目,所以现在希望大家可以经验之谈,这问题我也想百度下,但百度出来的都是strus.xml详细配置,都不是我想要的。      用struts2的时候我们调用对于action中的方法都是actioName!method,我现在希望可以把那个“!”去掉,希望地址栏只是个普通的地址不要搞“特殊”,所以我想到两个方法:
      
      一、假设一个action中拥有4个自定义方法,覆写ActionSupport的execute(),页面用ActionName.action?method="方法名字",execute()里面加if()来判断具体到那个自定义方法;
方法一例子execute(){
if(mehotd=="insert"){
insert();
}else if(method=="list"){
list();}
      二、假设一个action中拥有4个自定义方法,原本在struts.xml中是4个自定义方法共享一个action,我就将其分成一个自定义方法就对于一个action;
方法二例子
<action name="Adminlist" class="com.devt2.action.AdminAction" method="list">省略内容</action>
<action name="Admininsert" class="com.devt2.action.AdminAction" method="insert">省略内容</action>

方法三、方法四、方法N,小弟愚笨只能想到两种方法,希望大家不吝赐教,感谢感谢

解决方案 »

  1.   

    用*符号。比如配置如下        <action name="manage_*" class="com.xxx.struts2.ProjectManageAction" method="{1}" >
             <result name="viewBuilding">/WEB-INF/Page/ClientProject/viewBuilding.jsp</result>
    <result name="viewBuilding2">/WEB-INF/Page/ClientProject/viewBuilding2.jsp</result>        </action>  ProjectManageAction代码内如下@Controller("/project/manage_*") 
    public String viewBuildingUI() throws Exception{

    public String viewBuilding2UI() throws Exception{
      

  2.   

    <package name="project" namespace="/project" extends="base">
            <action name="manage_*" class="com.xxxx.struts2.ProjectManageAction" method="{1}" >
             <result name="viewBuilding">/WEB-INF/Page/ClientProject/viewBuilding.jsp</result>
            </action>       
            <result name="viewBuilding2">/WEB-INF/Page/ClientProject/viewBuilding2.jsp</result>
            </action>  
        </package> 一般都用通配符*的调用的时候project/manage_viewBuildingUI.do  
      

  3.   

    我现在希望可以把那个“!”去掉,希望地址栏只是个普通的地址不要搞“特殊”
    我不知道你说这个特殊是什么意思难道你认为这种动态方法调用比你提的第一种通过?拼接参数再在action中if else判断复杂一些?
    action继承了ActionSupport ,完全可以自己定义N个方法共享这一个action
    也没必要想第二种情况在配置文件中指定方法
    直接在页面通过!动态调用方法就行了,我觉得很方便
      

  4.   

    使用通配符,这样配置文件降到最少
    <struts>
    <package name="comm" namespace="/manager/comm" extends="global-struts">
    <action name="*_*" class="{1}" method="{2}">
    <result name="topicList">/form/manager/comm/topic_list.jsp</result>
    <result name="editTopic">/form/manager/comm/topic_add_edit.jsp</result>

    <result name="repleyList">/form/manager/comm/repley_list.jsp</result>
    <result name="addRepley">/form/manager/comm/repley_add_edit.jsp</result>
    <result name="editRepley">/form/manager/comm/repley_add_edit.jsp</result>
    </action>
    </package>
    </struts>只要定要规则,namespace对应一个模块,然后定义好方法和类名
      

  5.   


    你们好,通配符我是我开始打算就用的,我用的时候是这样的name="*",你这样用,我没试过,我用我那种通配符来就有漏洞,用默认action都解决不到的漏洞,你那种看上去也比较明显分清楚action和name
      

  6.   

    搜搜DMI模式吧也就是通配 哈哈…………
      

  7.   

    如果你不怕麻烦,使用通配符也可以
    给以小例子
    <form action="Login_register" method="post">
    用户名:
    <input type="text" name="name">
    <br />
    密码:
    <input type="password" name="pass">
    <br />
    <input type="submit" value="登录">
    </form>public String login() {
    System.out.println("登录");
    return "success";
    } public String register() {
    System.out.println("注册");
    return "success";
    }<package name="hello" extends="struts-default" namespace="/">
    <action name="*_*" class="com.softeem.action.{1}Action" method="{2}">
    <result name="success">{1}_{2}_success.jsp</result>
    </action>
    </package>
      

  8.   


    你误会了,我的特殊的意思是我不希望在地址栏上有“!”的显示,你有看过JAVA网站,在调用方法的时候有“!”的吗,他们都是将其修改成了"method或actionName".action,或者直接就假设QQ网站是Java网站,http://:ww.qq.com/admin/service/,直接这样来根本你就没看到他调用的action和方法,我这个举例是在移动看到的
      

  9.   


    用通配符,我用起来有发觉有漏洞,假设我定义了<default-action-ref name="index"/>,其他通配符,在地址栏上输入输入http://localhsot/工程名/asdfsdf,“asdfsdf”是我乱输入的,在这个时候他/她调转到XML里面,找不到对于的action,通常找不到会去找默认的“index”,但它不会,我用的是通配符方式是:name=“*” class=“com.*action” ></action>
      

  10.   

    其实我觉得,LZ的第一种方法就很不错啊,现在好多大公司都有自己的编程规范的,我们公司用的就是LZ的第一种方法,这种方法直观,一眼看过去就知道是啥意思,方便后来程序员阅读
      

  11.   


    但这缺点是多了变量,多了个if不直接,而方法2是简洁了方法1的缺点,但XML写多了东西,方法1的优点是不用在XML多写
      

  12.   

    if else怎么会不直接,一学java的时候就开发学这个东东了,做开发最重要的要做到让不懂程序的人也能看得懂你写的是什么?
      

  13.   


    我直接的意思是你套个判断 if else 效率会低一点,一般不会太明显,如果一个action的自定义方法多了或其他的因素就会慢得明显一点,我已经想好用哪个方法了,谢谢你们,我给分你们吧
      

  14.   


    你这个是什么来的,我百度“DMI模式”,搜索出来的都是主板之类的东西哦
      

  15.   

    在用了struts2-spring-plugin.jar后,加注解,spring注入struts2的action默认是actionName的第一个字母小写,如:"AdminAction",Spring注入后是adminAction,action在struts2.xml里面的<action name="action">的name的值应该要和spring注入的名字一样。但我发现出现问题但不知道是为什么struts2.xml
    <action name="Admin_*" class="..." method="{1}"></action>
    AdminAction注入是这样写的
    @Component("Admin")
    public class AdminAction extends BeaeAction{}
    按道理这样Spring已经注入的是Admin,当在运行程序的时候
    地址栏写着http://localhsot/poject/Admin_insert.action这样会出错,因为找不到对应的action,但事实上在运行的时候却没有出错,还是照常运行找到对于的action和对于的方法,这是为什么呢
      

  16.   


    理论上楼上在spring注入的是Admin,struts2是Admin_insert,根本没有Admin,但道理应该是出错的,但为什么没有出错呢