Struts2配置详解_配置Action

Struts2配置详解_配置Action

    <div class="article_manage clearfix">
    <div class="article_l">
        <span class="link_categories">
        标签:
          <a href="http://www.csdn.net/tag/struts" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">struts</a><a href="http://www.csdn.net/tag/action" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">action</a><a href="http://www.csdn.net/tag/delete" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">delete</a><a href="http://www.csdn.net/tag/%e6%a1%86%e6%9e%b6" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">框架</a><a href="http://www.csdn.net/tag/class" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">class</a><a href="http://www.csdn.net/tag/url" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">url</a>
        </span>
    </div>
    <div class="article_r">
        <span class="link_postdate">2012-05-08 16:07</span>
        <span class="link_view" title="阅读次数">76388人阅读</span>
        <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(22)</span>
        <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('Struts2配置详解_配置Action','7546607');return false;" title="收藏" target="_blank">收藏</a></span>
         <span class="link_report"> <a href="#report" onclick="javascript:report(7546607,2);return false;" title="举报">举报</a></span>

    </div>
</div>
<div class="embody" style="display:none" id="embody">
    <span class="embody_t">本文章已收录于:</span>
    <div class="embody_c" id="lib" value="{&quot;err&quot;:0,&quot;msg&quot;:&quot;ok&quot;,&quot;data&quot;:[]}"></div>
</div>
<style type="text/css">        
        .embody{
            padding:10px 10px 10px;
            margin:0 -20px;
            border-bottom:solid 1px #ededed;                
        }
        .embody_b{
            margin:0 ;
            padding:10px 0;
        }
        .embody .embody_t,.embody .embody_c{
            display: inline-block;
            margin-right:10px;
        }
        .embody_t{
            font-size: 12px;
            color:#999;
        }
        .embody_c{
            font-size: 12px;
        }
        .embody_c img,.embody_c em{
            display: inline-block;
            vertical-align: middle;               
        }
         .embody_c img{               
            width:30px;
            height:30px;
        }
        .embody_c em{
            margin: 0 20px 0 10px;
            color:#333;
            font-style: normal;
        }
</style>
<script type="text/javascript">
    $(function () {
        try
        {
            var lib = eval("("+$("#lib").attr("value")+")");
            var html = "";
            if (lib.err == 0) {
                $.each(lib.data, function (i) {
                    var obj = lib.data[i];
                    //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                    html += ' <a href="' + obj.url + '" target="_blank">';
                    html += ' <img src="' + obj.logo + '">';
                    html += ' <em><b>' + obj.name + '</b></em>';
                    html += ' </a>';
                });
                if (html != "") {
                    setTimeout(function () {
                        $("#lib").html(html);                      
                        $("#embody").show();
                    }, 100);
                }
            }      
        } catch (err)
        { }

    });
</script>
  <div class="category clearfix">
    <div class="category_l">
       <img src="http://static.blog.csdn.net/images/category_icon.jpg">
        <span>分类:</span>
    </div>
    <div class="category_r">
                <label onclick="GetCategoryArticles('1142054','ldl420783321','top','7546607');">
                    <span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">ssh<em>(3)</em></span>
                  <img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
                  <img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
                    <div class="subItem">
                        <div class="subItem_t"><a href="http://blog.csdn.net/ldl420783321/article/category/1142054" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
                        <ul class="subItem_l" id="top_1142054">                            
                        </ul>
                    </div>
                </label>                    
    </div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>  

Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。

该方法如下:

   public String execute() throws Exception

Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:

    public String  xxx()

在实际开发中,action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。

开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。

 

1.    Action映射:
  action
映射是Struts2框架中的基本 工作单元action映射就是将一个请求URL(action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
                   action
元素的完整属性表

属性

是否必须

说明

name

action的名字,用于匹配URL

class

Action实现类的完整类名

method

执行Action类时调用的方法

convert

应用于action的类型转换的完整类名



 

 

 

 

       例如:
<action name=“user” class=“org.lesson05.UserAction”>

                <result name=“success”>/user.jsp</result>

        </action>

    2. 使用method属性
           在配置action时,我们可以通过action元素的method属性来指定action调用的
       
 方法,所指定的方法,必须遵循与execute方法相同的格式。
          
 在Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用
        method
属性。
          
 在Struts.xml文件中为同一个Action类配置不同的别名
            
<!– 使用method属性 –>

<package name=“methods” namespace=“/”

extends=“struts-default”>

        <!– 对应着MethodAction里面的execute方法 –>

        <action name=“list” class=“org.lesson05.MethodAction”>

            <result name=“success”>/Methods/list.jsp</result>

        </action>

        <!– 对应着MethodAction里面的add方法 –>

        <action name=“add” class=“org.lesson05.MethodAction”

method=“add”>

            <result name=“success”>/Methods/add.jsp</result>

        </action>

        <!– 对应着MethodAction里面的edit方法 –>

        <action name=“edit” class=“org.lesson05.MethodAction”

method=“edit”>

            <result name=“success”>/Methods/edit.jsp</result>

        </action>

        <!– 对应着MethodAction里面的delete方法 –>

        <action name=“delete”

class=“org.lesson05.MethodAction”

 method=“delete”>

            <result name=“success”>/Methods/delete.jsp</result>

        </action>

</package>

对应的MethodAction类,代码如下:
            
importcom.opensymphony.xwork2.ActionSupport;

public class MethodAction extends ActionSupport

{

 

    @Override

    public String execute() throws Exception

    {

       return SUCCESS;

    }

   

    public String add() throws Exception

    {

       return SUCCESS;

    }

   

    public String edit() throws Exception

    {

       return SUCCESS;

    }

   

    public String delete() throws Exception

    {

       return SUCCESS;

    }

}

           使用actionmethod属性可以任意指定处理请求的方法(只要该方法和execute

方法具有相同的格式),这样就可以在同一个类中完成相关的任务,而不需要去编写不

同的Action类。

           注意:Struts2在根据action元素的method属性查找方法时有两种途径:

           1.查找与method属性值完全一致的方法.
2.
查找doMethod()形式的方法.

   3.动态方法调用:

         另外一种无需配置就可以直接调用Action中的非execute方法的方式,是使用

Struts2的动态方法调用。

   动态方法调用是在action的名字中使用感叹号(!)来标识要调用的方法名,其语法格

式为 actionName!methodName.action

   例如,我们配置了如下的action

   <action name=“user” class=“org.lesson05.UserAction”>

            <result name=“success”>/Methods/list.jsp</result>

   </action>

          当请求/user!delete.action时,就会自动调用UserAction中的delete()

提示,这种调用方式会带来安全隐患!

 

4模拟Struts1中的ForwardAction
             <action name=“user”>

       <result>/index.jsp</result>

              </action>

      这样写就可以了.

 

   5.默认的action

         如果请求一个不存在的action,结果将是HTTP404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。

         默认的action使用default-action-ref元素来声明,如下所示:

          <!– 默认action –>

<package name=“defaultAction” namespace=“/default”

extends=“struts-default”>

        <default-action-ref name=“error”></default-action-ref>    

        <action name=“defaultaction”

class=“org.lesson05.DefaultAction”>

            <result name=“success”>/defaultAction.jsp</result>

        </action>

        <action name=“error”>

            <result>/error.jsp</result>

        </action>

    </package>

   注意:根据struts-2.0.dtd中定义的package元素的内容模型,

default-acion-ref必须在action元素之前使用。

   如果请求的是/default/defaultaction1.action,框架找不到映射到defaultaction1action,那么名为erroraction将被调用。

    注意:每个包中都可以有它自己默认的action,但是每一个名称空间应该只有一个默认action。如果具有相同名称空间的多个包中都声明了默认action,那么哪一个action才是默认的将无法保证。

    注意:默认action只对action的访问有效。如果你访问一个非action的资源,例如/user.jsp,而该页面不存在,这时仍会看到HTTP404错误。如果想为整个Web应用程序指定默认页面,需要在web.xml文件中对HTTP404错误指定相应的错误处理页面。

 

6.通配符映射

      随着Web应用程序的增加,所需的Action也会更多,从而导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置。

      通配符即星号(*),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。

             以下是在action映射中使用通配符:
              
 <action name=“news*”          

class=“org.struts2.lesson05.News{1}Action”>

                    <result name=“success”>/WEB-INF/News/{1}.jsp</result>

        </action>

      我们在action元素的name属性中使用了通配符(*),允许这个映射匹配所有以/news开始的URL,例如/newsAdd,/newsEdit,/newsDelete,但是,如果请求的是/newsEdit/add,那么这个映射就不会被匹配。

      在上面,有一个特殊的记号{1},这是作为占位符使用的,它将被通配符所匹配的值替换,例如访问/newsEdit,通配符(*)匹配的部分是Edit,那么,这个值将替换{1},最终调用的类是org.struts2.lesson05.NewsEditAction,Action

   执行成功后导向的结果页面是/WEB-INF/News/Edit.jsp

      在action映射和action结果中,通配符匹配的值可以用记号{N}来访问,N是从19的数字,指出替换的是哪一个通配符匹配的值。整个请求URL可以用记号{0}来访问。例如如下的action映射:
    
 <action name=“*_*” class=“org.struts2.lesson05.{1}Action”  

method=“{2}”>

            <result>/WEB-INF/News/{0}.jsp</result>

        </action>

      当访问/News_delete时,name属性中的第一个”*”匹配News,第二个”*”匹配deleteclass属性中使用的记号是{1},所以被News所替换,method属性中使用的记号是{2},于是被delete所替换。结果映射中使用的记号是{0},于是被整个URL替换,即News_delete所替换。整个替换后的结果是:当请求/News_delete时,框架调用NewsAction实例的delete方法对请求进行处理。执行成功后,请求被导向到/WEB-INF/News/News_delete.jsp页面。

      通配符方法设置的另一种常见方式是使用后缀通配符,即将”*”放在action名字的后面,在”*”和名字前缀之间使用一个特殊字符作为分隔,常用的特殊字符是下划线(_),当然也可以使用其他字符。例如:

               <action name=“News_*”

class=“org.struts2.lesson05.NewsAction” method=“{1}”>

                    <result>/WEB-INF/News/{0}.jsp</result>

        </action>

       当请求/News_delete时,调用的是NewsAction实例的delete方法,当请求/News_edit的时候,调用的是NewsAction实例的edit方法。

document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
    <div id="digg" articleid="7546607">
        <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">

             <dt>顶</dt>
            <dd>11</dd>
        </dl>


        <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">

              <dt>踩</dt>
            <dd>2</dd>               
        </dl>

    </div>
 <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
<script type="text/javascript">
            function btndigga() {
                $(".tracking-ad[data-mod='popu_222'] a").click();
            }
            function btnburya() {
                $(".tracking-ad[data-mod='popu_223'] a").click();
            }
        </script>

<div style="clear:both; height:10px;"></div>


    <div class="similar_article" style="">
            <h4>我的同类文章</h4>
            <div class="similar_c" style="margin:20px 0px 0px 0px">
                <div class="similar_c_t">
                            <label class="similar_cur">
                                <span style="cursor:pointer" onclick="GetCategoryArticles('1142054','ldl420783321','foot','7546607');">ssh<em>(3)</em></span>
                            </label>
                </div>

                <div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
                    <a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
                    <ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/ldl420783321/article/details/7609831" id="foot_aritcle_7609831undefined5796416363749277" target="_blank" title="spring3.1 包,根据自己需要加入需要的包">spring3.1 包,根据自己需要加入需要的包</a><span>2012-05-28</span><label><i>阅读</i><b>656</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/ldl420783321/article/details/7546219" id="foot_aritcle_7546219undefined10719547715785072" target="_blank" title="struts.xml配置文件(package,namespace,action)">struts.xml配置文件(package,namespace,action)</a><span>2012-05-08</span><label><i>阅读</i><b>4033</b></label></li> </ul>

                    <ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/ldl420783321/article/details/7546963" id="foot_aritcle_7546963undefined46954008348421983" target="_blank" title="Struts2:通过action标签向页面传值">Struts2:通过action标签向页面传值</a><span>2012-05-08</span><label><i>阅读</i><b>7879</b></label></li> </ul>
                </div>
            </div>
        </div>    
<script type="text/javascript">
    $(function () {
        GetCategoryArticles('1142054', 'ldl420783321','foot','7546607');
    });
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值