??xml version="1.0" encoding="utf-8" standalone="yes"?>成人午夜在线视频,超碰aⅴ人人做人人爽欧美,91成人高清http://www.aygfsteel.com/kangdy/category/47762.html我就像AK47里打出去的子式V目标TMD永远在前斏V我只能TMD拼命向前?/description>zh-cnSat, 07 Jan 2012 12:59:02 GMTSat, 07 Jan 2012 12:59:02 GMT60(转蝲)关于paramsPrepareParamsStackhttp://www.aygfsteel.com/kangdy/archive/2011/11/16/363973.htmlAK47AK47Wed, 16 Nov 2011 07:39:00 GMThttp://www.aygfsteel.com/kangdy/archive/2011/11/16/363973.htmlhttp://www.aygfsteel.com/kangdy/comments/363973.htmlhttp://www.aygfsteel.com/kangdy/archive/2011/11/16/363973.html#Feedback0http://www.aygfsteel.com/kangdy/comments/commentRss/363973.htmlhttp://www.aygfsteel.com/kangdy/services/trackbacks/363973.htmlhttp://hi.baidu.com/%CC%AB%C6%BD%D1%F31986/blog/item/110b13b1384e805e08230259.html
转脓

paramsPrepareParamsStack在Struts 2.0中是一个很奇妙的interceptor stackQ以至于很多人疑问ؓ何不其讄为默认的interceptor stack。paramsPrepareParamsStack主要解决了ModelDriven和Preparable的配合问题,从字面上理解来说Q?q个stack的拦截器调用的顺序ؓQ首先paramsQ然后prepareQ接下来modelDrivenQ最后再params。Struts 2.0的设计上要求modelDriven在params之前调用Q而业务中prepare要负责准备modelQ准备model又需要参敎ͼq就需要在 prepare之前q行params拦截器设|相兛_敎ͼq个也就是创建paramsPrepareParamsStack的原因?/span>程如下Q?br />    1. params拦截器首先给action中的相关参数赋|如id  
   2. prepare拦截器执行prepareҎQprepareҎ中会Ҏ参数Q如idQ去调用业务逻辑Q设|model对象
   3. modelDriven拦截器将model对象压入value stackQ这里的model对象是在prepare中创建的
   4. params拦截器再参数赋值给model对象
   5. action的业务逻辑执行 依据此stackQ一个action的代码通常如下Q?

public class UserAction extends ActionSupport implements ModelDriven, Preparable {
    private User user;
    private int id;
    private UserService service; // user business service

    public void setId(int id) {
        this.id = id;
    }

    /**
     * create a new user if none exists, otherwise load the user with the
     * specified id
     */
    public void prepare() throws Exception {
        if (id == 0) {
            user = new User();
        } else {
            user = service.findUserById(id);
        }
    }

    public Object getModel() {
        return user;
    }

    /**
     * create or update the user and then view the created user
     */
    public String update() {
        if (id == 0) {
            service.create(user);
        } else {
            service.update(user);
        }
        return "redirect";
    }

    /**
     * delete the user and go to a default home page
     */
    public String delete() {
        service.deleteById(id);
        return "home";
    }

    /**
     * show the page allowing the user to view the existing data
     */
    public String view() {
        return "view";
    }

    /**
     * show the page allowing the user to view the existing data and change the
     * values
     */
    public String edit() {
        return "input";
    }

在上qC码中Qedit和view都不需要根据id再ؓ界面准备数据Q因为prepareҎ已经准备好了modelQ这些方法很单。对于update ҎQprepare首先会从数据库中加蝲数据Q然后params拦截器会参数glmodelQ在update直接更新可以,不会出现数据被ؕ更新 的情c象Hibernate框架Q会判断哪些字段更新了,然后q行更新Q性能也不会损失?br /> 通过paramsPrepareParamsStack可以让流E更明确Q代码更z,也更利于大家的交?/p>


AK47 2011-11-16 15:39 发表评论
]]>
(转蝲) Struts 2杂谈Q?Q:ValueStack对象的传送带机制http://www.aygfsteel.com/kangdy/archive/2011/11/11/363543.htmlAK47AK47Fri, 11 Nov 2011 09:21:00 GMThttp://www.aygfsteel.com/kangdy/archive/2011/11/11/363543.htmlhttp://www.aygfsteel.com/kangdy/comments/363543.htmlhttp://www.aygfsteel.com/kangdy/archive/2011/11/11/363543.html#Feedback0http://www.aygfsteel.com/kangdy/comments/commentRss/363543.htmlhttp://www.aygfsteel.com/kangdy/services/trackbacks/363543.htmlStruts 2杂谈Q?Q:ValueStack对象的传送带?/strong>?/div>作者:nokiaguy  原文地址Q?a >http://blog.csdn.net/nokiaguy/article/details/4684750
转脓
   众所周知QStrut 2的Actionc通过属性可以获得所有相关的|如请求参数、Action配置参数、向其他Action传递属性|通过chainl果Q等{。要获得 q些参数|我们要做的唯一一件事是在ActioncM声明与参数同名的属性,在Struts 2调用ActioncȝActionҎQ默认是executeҎQ之前,׃为相应的Action属性赋倹{?br />     要完成这个功能,有很大程度上QStruts 2要依赖于ValueStack对象。这个对象诏I整个Action的生命周期(每个Actioncȝ对象实例会拥有一个ValueStack对象Q。当 Struts 2接收C?action的请求后Q会先徏立Actioncȝ对象实例Qƈ且将Actioncȝ对象实例压入ValueStack对象中(实际 上,ValueStack对于相当一个栈Q,而ValueStackcȝsetValue和findValueҎ可以讄和获得Action对象的属?倹{Struts 2中的某些拦截器正是通过ValueStackcȝsetValueҎ来修改Actioncȝ属性值的。如params拦截器用于将h参数值映到?应成Actioncȝ属性倹{在params拦截器中在获得请求参数值后Q会使用setValueҎ讄相应的Actioncȝ属性?br />     从这一点可以看出,ValueStack对象p一个传送带Q当客户端请?actionӞStruts 2在创建相应用Action对象后就Action对象攑ֈ了ValueStack传送带上,然后ValueStack传送带会带着Action对象l过 若干拦截器,在每一拦截器中都可以通过ValueStack对象讄和获得Action对象中的属性倹{实际上Q这些拦截器q当于水U作业。如果要?Action对象q行某项加工Q再加一个拦截器卛_Q当不需要进行这工作时Q直接将该拦截器L卛_?/span>
    下面我们使用一个例子来演示q个q程。在q个例子中实C一个拦截器Q该拦截器的功能是将一个属性文件中的key-valueҎ成相应的属性的倹{如下面是一个属性文件的内容Q?br />
    name = h
    price = 10000

    我们可以在ActioncM定义name和price属性,在Action中引用这个拦截器后,׃自动为属性赋倹{?br />     在用该拦截器有如下规则Q?br />     1.  拦截器读取的属性文件\径由path参数指定?br />     2.  属性文件的~码格式由encoding参数指定Q默认值是UTF-8?br />     3.  如果某个key中包含有“.”Q该W号不能出现在标识符中)Q则有如下处理方法:
    Q?Q将Actioncȝ属性名定义为去?#8220;.”的key。例如,key为person.nameQ而属性名可定义ؓpersonname?br />     Q?Q将Actioncȝ属性名定义为将“.”替换成其他字W的表示W号。例如,key为person.nameQ而属性名可定义ؓperson_nameQ其?#8220;_”由separator参数指定?br />     4.  如果key太长Q也可以直接使用Action参数q行映射Q例如,key为country.person.nameQ可做如下映:
      <param name="countrypersonname">name</param>
      要注意的是,name属性g能包?#8220;.”Q因此,应将keyg?#8220;.”L。现在就可以直接在ActioncM定义名ؓname的属性的Qname属性的g与key值相同?br />     5.  上面所有的规则可以同时使用?br />
拦截器的源代码:

package interceptors;

import java.util.Enumeration;
import java.util.Map;
import java.util.Properties;
import java.io.InputStream;
import java.io.FileInputStream;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.util.ValueStack;

public class PropertyInterceptor extends AbstractInterceptor
{
    
private static final String DEFAULT_PATH_KEY = "path";
    
private static final String DEFAULT_ENCODING_KEY = "encoding";
    
private static final String DEFAULT_SEPARATOR_KEY = "separator";

    
protected String pathKey = DEFAULT_PATH_KEY;
    
protected String encodingKey = DEFAULT_ENCODING_KEY;
    
protected String separatorKey = DEFAULT_SEPARATOR_KEY;

    
public void setPathKey(String pathKey) 
    {
        
this.pathKey = pathKey;
    }

    
public void setEncodingKey(String encodingKey)
    {
        
this.encodingKey = encodingKey;
    }

    
public void setSeparatorKey(String separatorKey)
    {
        
this.separatorKey = separatorKey;
    }

    @Override
    
public String intercept(ActionInvocation invocation) throws Exception
    {
        ActionConfig config 
= invocation.getProxy().getConfig();

        Map
<String, String> parameters = config.getParams();
        
if (parameters.containsKey(pathKey))
        {
            String path 
= parameters.get(pathKey);
            String encoding 
= parameters.get(encodingKey);
            String separator 
= parameters.get(separatorKey);
            
if (encoding == null)
                encoding 
= "UTF-8";
            
if (separator == null)
                separator 
= "";
            path 
= invocation.getAction().getClass().getResource(path)
                    .getPath();
            Properties properties 
= new Properties();
            InputStream is 
= new FileInputStream(path);
            java.io.Reader reader 
= new java.io.InputStreamReader(is, encoding);
            
            properties.load(reader);
            ActionContext ac 
= invocation.getInvocationContext();
            ValueStack stack 
= ac.getValueStack();
            System.out.println(stack.hashCode());
            Enumeration names 
= properties.propertyNames();
            
while (names.hasMoreElements())
            {
                
//  下面会用setValueҎ修改ValueStack对象中的相应属性?/span>
                String name = names.nextElement().toString();
                
if (!name.contains("."))
                    stack.setValue(name, properties.get(name)); 

                String newName 
= null;
                newName 
= parameters.get(name.replaceAll("//."""));
                
if (newName != null)
                    stack.setValue(newName, properties.get(name));

                
if (!separator.equals(""))
                {
                    newName 
= name.replaceAll("//.""");
                    stack.setValue(newName, properties.get(name));
                }               
                newName 
= name.replaceAll("//.", separator);
                stack.setValue(newName, properties.get(name));
            } 
        }
        
return invocation.invoke();
    }
}

用于试的Actioncȝ源代码:

package actions;

public class MyAction
{
    
private String name;
    
private Integer price;
    
private String log4jappenderstdout;
    
private String log4j_rootLogger;
    
private String conversionPattern;

    
public String getName()
    {
        
return name;
    }

    
public void setName(String name)
    {
        
this.name = name;
    }

    
public Integer getPrice()
    {
        
return price;
    }

    
public void setPrice(Integer price)
    {
        
this.price = price;
    }

    
public String getLog4jappenderstdout()
    {
        
return log4jappenderstdout;
    }

    
public void setLog4jappenderstdout(String log4jappenderstdout)
    {
        
this.log4jappenderstdout = log4jappenderstdout;
    }

    
public String getLog4j_rootLogger()
    {
        
return log4j_rootLogger;
    }

    
public void setLog4j_rootLogger(String log4j_rootLogger)
    {
        
this.log4j_rootLogger = log4j_rootLogger;
    }

    
public String getConversionPattern()
    {
        
return conversionPattern;
    }

    
public void setConversionPattern(String conversionPattern)
    {
        
this.conversionPattern = conversionPattern;
    }

    
public String execute()
    {
        System.out.println(
"name:" + name);
        System.out.println(
"price:" + price);
        System.out.println(
"log4jappenderstdout:" + log4jappenderstdout);
        System.out.println(
"log4j_rootLogger:" + log4j_rootLogger);
        System.out.println(
"conversionPattern:" + conversionPattern);
        
return null;
    }
}

Actioncȝ配置代码如:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd"
>
<struts>
    
<package name="struts" extends="struts-default">

        
<interceptors>
            
<interceptor name="property"
                class
="interceptors.PropertyInterceptor" />
            
<interceptor-stack name="myStack">
                
<interceptor-ref name="defaultStack" />
                
<interceptor-ref name="property" />
            
</interceptor-stack>
        
</interceptors>
        
<action name="test" class="actions.MyAction">
            
<interceptor-ref name="myStack" />
            
<param name="path">/log4j.properties</param>
            
<param name="encoding">UTF-8</param>
            
<param name="separator">_</param>
            
<param name="log4jappenderstdoutlayoutConversionPattern">
                conversionPattern
            
</param>

        
</action>
    
</package>
</struts>

  请将log4j.properties文g复制到WEB-INF/classes目录Qƈ在该文g中加入name和price属性?br />
试l果Q?br />
name:中国
price:
34
log4jappenderstdout:org.apache.log4j.ConsoleAppender
log4j_rootLogger:error
, stdout
conversionPattern:%d{ABSOLUTE} %5p %c{
1}:%L - %m%n

    ׃property拦截器在defaultStack后引用,因此Q在该拦截器中设|的属性值是最l结果,如果property拦截器放?defaultStack前面Q将两个<interceptor-ref>元素掉换一下)Q就可以通过同名胜Action配置参数或请求参?来干预最l究输出l果了?


AK47 2011-11-11 17:21 发表评论
]]>
(转脓)Struts2数据传输的背后机ӞValueStackQ值栈Q?/title><link>http://www.aygfsteel.com/kangdy/archive/2011/11/11/363537.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Fri, 11 Nov 2011 08:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/kangdy/archive/2011/11/11/363537.html</guid><wfw:comment>http://www.aygfsteel.com/kangdy/comments/363537.html</wfw:comment><comments>http://www.aygfsteel.com/kangdy/archive/2011/11/11/363537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kangdy/comments/commentRss/363537.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kangdy/services/trackbacks/363537.html</trackback:ping><description><![CDATA[     摘要: Q{QStruts2数据传输的背后机ӞValueStackQ值栈Q原文地址 Qhttp://blog.csdn.net/li_tengfei/article/details/6098134转蝲 1.     数据传输背后机制QValueStack(值栈)   在这一切的背后Q是因ؓ有了ValueStackQ值栈Q!   Valu...  <a href='http://www.aygfsteel.com/kangdy/archive/2011/11/11/363537.html'>阅读全文</a><img src ="http://www.aygfsteel.com/kangdy/aggbug/363537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kangdy/" target="_blank">AK47</a> 2011-11-11 16:19 <a href="http://www.aygfsteel.com/kangdy/archive/2011/11/11/363537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>structs2配置UrlRewriteFilter http://www.aygfsteel.com/kangdy/archive/2011/11/09/363318.htmlAK47AK47Wed, 09 Nov 2011 09:22:00 GMThttp://www.aygfsteel.com/kangdy/archive/2011/11/09/363318.htmlhttp://www.aygfsteel.com/kangdy/comments/363318.htmlhttp://www.aygfsteel.com/kangdy/archive/2011/11/09/363318.html#Feedback0http://www.aygfsteel.com/kangdy/comments/commentRss/363318.htmlhttp://www.aygfsteel.com/kangdy/services/trackbacks/363318.html转蝲每个|页或请求都是一个url地址Q一般,q个地址可能?do,.page,.action之类的ƈ加上'?'受?&'h询串{构成的一个长长的的url。很urgly?

一般的url----------------------------------------------------------较好的url
http://www.xxx.net/user/profile.do?id=20001   ====> http://www.xxx.net/user/20001
http://www.xxx.net/forum/board.do?name=java   ====> http://www.xxx.net/forum/java
http://www.xxx.net/forum/thread.do?id=29923   ====> http://www.xxx.net/thread/29923

后者明显较为直观和漂亮?

使用url rewrite可以很好的改善这个状c网站url rewrite应用是非常广泛的Q良好的url设计l用户带来的非常好的体验Q同时也能吸引搜索引擎的注意?/fieldset>原文地址Q?a >http://www.iteye.com/topic/53834
使用方式Q?/strong>
1 配置web.xml文g
样例Q?/strong>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>osivFilter</filter-name>
        <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    <filter-mapping>
        <filter-name>osivFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--配置UrlRewriteFilterqo?->
    <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>*.html</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>
    <filter>
        <filter-name>struts-prepare</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
        <init-param>
            <param-name>actionPackages</param-name>
            <param-value>com.secneo.action.*.*</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter>
        <filter-name>struts-execute</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
    </filter>
    <filter>
        <filter-name>struts-cleanup</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <!--在structs2中用UrlRewriteFilterqo?->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.action</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.tld</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.tag</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>struts-prepare</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts-prepare</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts-prepare</filter-name>
        <url-pattern>*.tld</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>struts-execute</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts-execute</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts-execute</filter-name>
        <url-pattern>*.tld</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>*.tld</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>
            org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
2  在WEB-INF目录下添加urlrewrite.xml 文gQ根据具体需要写规则?/span>
样例Q?/strong>
<?xml version="1.0" encoding="utf-8"?>
<urlrewrite>
    <rule>
        <from>^/(.*).html$</from>
        <to type="forward">/$1.action</to>
    </rule>
    <rule>
        <from>^/(.*).html?(.*)$</from>
        <to type="forward">/$1.action?$2</to>
    </rule>
</urlrewrite>


AK47 2011-11-09 17:22 发表评论
]]>
structs2 filter的执行顺?/title><link>http://www.aygfsteel.com/kangdy/archive/2011/11/09/363301.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Wed, 09 Nov 2011 07:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/kangdy/archive/2011/11/09/363301.html</guid><wfw:comment>http://www.aygfsteel.com/kangdy/comments/363301.html</wfw:comment><comments>http://www.aygfsteel.com/kangdy/archive/2011/11/09/363301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kangdy/comments/commentRss/363301.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kangdy/services/trackbacks/363301.html</trackback:ping><description><![CDATA[<div>Ҏservlet2.3规范filter执行是按照web.xml配置的filter-mapping先后序q行执行?br />所以自己配|的qo器放在structs2的过滤器之前?/div><img src ="http://www.aygfsteel.com/kangdy/aggbug/363301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kangdy/" target="_blank">AK47</a> 2011-11-09 15:44 <a href="http://www.aygfsteel.com/kangdy/archive/2011/11/09/363301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>structs2拦截?/title><link>http://www.aygfsteel.com/kangdy/archive/2011/11/08/363205.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Tue, 08 Nov 2011 10:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/kangdy/archive/2011/11/08/363205.html</guid><wfw:comment>http://www.aygfsteel.com/kangdy/comments/363205.html</wfw:comment><comments>http://www.aygfsteel.com/kangdy/archive/2011/11/08/363205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kangdy/comments/commentRss/363205.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kangdy/services/trackbacks/363205.html</trackback:ping><description><![CDATA[<strong>深入struct2拦截?/strong>  q篇文章很好Q细致讲解了structs2和拦截器的原理?br /><div><a >http://zhanghong.iteye.com/blog/452465</a><br /><fieldset><legend>转蝲</legend><span>在每ơ对你的 Action?execute()ҎhӞpȝ会生成一?ActionInvocation对象Q这个对象保存了 action和你所配置的所有的拦截器以及一些状态信息。比如你的应用用的?defaultStackQ系l将会以拦截器栈配置的顺序将每个拦截器包装成一个个 InterceptorMapping(包含拦截器名字和对应的拦截器对象 )l成一?Iterator保存?ActionInvocation中。在执行 ActionInvocation?invoke()Ҏ时会对这?Iteratorq行q代Q每ơ取Z?InterceptorMappingQ然后执行对?Interceptor?intercept(ActionInVocation inv)ҎQ?intercept(ActionInInvocation inv)Ҏ又包含当前的 ActionInInvcation对象作ؓ参数Q而在每个拦截器中又会调用 inv?invoke()ҎQ这样就会进入下一个拦截器执行了,q样直到最后一个拦截器执行完,然后执行 Action?execute()Ҏ (假设你没有配|访问方法,默认执行 Action?execute()Ҏ )。在执行?execute()Ҏ取得?result后又以相反的序走出拦截器栈Q这时可以做些清理工作。最后系l得C一?resultQ然后根?result的类型做q一步操作?/span></fieldset><br /><div><strong>配置拦截器:</strong>Struts2中提供了大量的拦截器Q多个拦截器可以l成一个拦截器栈,pȝ配置了一个默认的拦截器栈 defaultStackQ具体包括那些拦截器以及序可以在struts-default.xml中找到?br />1) <br /><package name="default" extends="struts-default"><br />   <interceptors><br />       <interceptor name="timer" class=".."/><br />       <interceptor name="logger" class=".."/><br />   </interceptors><br /><br />   <action name="login"<br />      class="tutorial.Login"><br />        <interceptor-ref name="timer"/><br />        <interceptor-ref name="logger"/><br />         <result name="input">login.jsp</result><br />         <result name="success"<br />            type="redirectAction">/secure/home</result><br />   </action><br /></package><br /><br />2)<br /><package name="default" extends="struts-default"><br />   <interceptors><br />        <interceptor name="timer" class=".."/><br />        <interceptor name="logger" class=".."/><br />        <interceptor-stack name="myStack"><br />           <interceptor-ref name="timer"/><br />           <interceptor-ref name="logger"/><br />       <interceptor-ref name="defaultStack"/>    <br />        </interceptor-stack><br />    </interceptors><br /><br /><action name="login"<br />     class="tutuorial.Login"><br />         <interceptor-ref name="myStack"/><br />         <result name="input">login.jsp</result><br />         <result name="success"<br />             type="redirectAction">/secure/home</result><br /></action><br /></package><br /><br /><strong>拦截器执行顺序:</strong><br /><interceptor-stack name="xaStack"><br />  <interceptor-ref name="thisWillRunFirstInterceptor"/><br />  <interceptor-ref name="thisWillRunNextInterceptor"/><br />  <interceptor-ref name="followedByThisInterceptor"/><br />  <interceptor-ref name="thisWillRunLastInterceptor"/><br /></interceptor-stack><br /><br />执行序Q?br />thisWillRunFirstInterceptor<br />  thisWillRunNextInterceptor<br />    followedByThisInterceptor<br />      thisWillRunLastInterceptor<br />        MyAction1<br />        MyAction2 (chain)<br />        MyPreResultListener<br />        MyResult (result)<br />      thisWillRunLastInterceptor<br />    followedByThisInterceptor<br />  thisWillRunNextInterceptor<br />thisWillRunFirstInterceptor<br /><br /><br /><strong>自定义拦截器:</strong>必须实现 com.opensymphony.xwork2.interceptor.Interceptor 也可以?AbstractInterceptor<br /><br /><span style="color: #ff0000;">拦截器要保证U程安全。因为structs2中拦截器会在h间共?/span></div></div><img src ="http://www.aygfsteel.com/kangdy/aggbug/363205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kangdy/" target="_blank">AK47</a> 2011-11-08 18:35 <a href="http://www.aygfsteel.com/kangdy/archive/2011/11/08/363205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转脓)struts2 工作原理?/title><link>http://www.aygfsteel.com/kangdy/archive/2011/11/08/363179.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Tue, 08 Nov 2011 07:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/kangdy/archive/2011/11/08/363179.html</guid><wfw:comment>http://www.aygfsteel.com/kangdy/comments/363179.html</wfw:comment><comments>http://www.aygfsteel.com/kangdy/archive/2011/11/08/363179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kangdy/comments/commentRss/363179.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kangdy/services/trackbacks/363179.html</trackback:ping><description><![CDATA[     摘要: 原脓地址Qhttp://blog.csdn.net/qjyong/article/details/1795833转脓 最q学习struts2Q其实它是webwork2.2的升U版Q现附上原理? 上图来源于Struts2官方站点Q是Struts 2 的整体结构。一个请求在Struts2框架中的处理大概分ؓ以下几个步骤1 客户端初始化一个指向Servlet容器Q例如TomcatQ的h2 ...  <a href='http://www.aygfsteel.com/kangdy/archive/2011/11/08/363179.html'>阅读全文</a><img src ="http://www.aygfsteel.com/kangdy/aggbug/363179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kangdy/" target="_blank">AK47</a> 2011-11-08 15:10 <a href="http://www.aygfsteel.com/kangdy/archive/2011/11/08/363179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Structs的线E安全问?/title><link>http://www.aygfsteel.com/kangdy/archive/2009/10/29/300201.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Thu, 29 Oct 2009 08:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/kangdy/archive/2009/10/29/300201.html</guid><wfw:comment>http://www.aygfsteel.com/kangdy/comments/300201.html</wfw:comment><comments>http://www.aygfsteel.com/kangdy/archive/2009/10/29/300201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kangdy/comments/commentRss/300201.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kangdy/services/trackbacks/300201.html</trackback:ping><description><![CDATA[<p>以前做过Structs 的项?可是一直没做太q研究,其是关于线E安全的<br /> 在网上搜了一下很多这斚w的资?引用了一?ȝ了一?</p> <fieldset><legend>ȝQ?/legend>Struts1 Action是单例模式ƈ且必LU程安全的,因ؓ仅有Action的一个实例来处理所有的h。单例策略限制了Struts1 Action能作的事Qƈ且要在开发时特别心。Action资源必须是线E安全的或同步的?br /> Struts2 Action可以使用原型模式scope=prototype,q样对象为每一个请求生一个实例,因此没有U程安全问题。(实际上,servlet容器l每个请求生许多可丢弃的对象,q且不会D性能和垃圑֛攉题)</fieldset> <p> </p> <p>q篇文章对什么是U程安全的代码和如何使用U程安全的代码做了详l阐q?br /> <a >http://hi.baidu.com/niujunkai/blog/item/021964adc130660a4a36d6ab.html</a><br /> 下面是它内容的引?</p> <fieldset><legend>引用:</legend> <p>1.什么是U程安全的代?br /> 在多U程环境下能正确执行的代码就是线E安全的?br /> 安全的意思是能正执行,否则后果是程序执行错误,可能出现各种异常情况?/p> <p>2.如何~写U程安全的代?br /> 很多书籍里都详细讲解了如何这斚w的问题,他们主要讲解的是如何同步U程对共享资源的使用的问题。主要是对synchronized关键字的各种用法Q以及锁的概cJava1.5中也提供了如d锁这cȝ工具cR这些都需要较高的技巧,而且相对难于调试?/p> <p>但是Q线E同步是不得以的Ҏ,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在~写Ҏ度和性能上会更好些?br /> 我这里强调的是什么代码是始终为线E安全的、是不需要同步的。如?<br /> 1)帔R始终是线E安全的Q因为只存在L作?br /> 2)Ҏ造器的访?new 操作)是线E安全的Q因为每ơ都新徏一个实例,不会讉K׃n的资源?br /> 3)最重要的是:局部变量是U程安全的。因为每执行一个方法,都会在独立的I间创徏局部变量,它不是共享的资源。局部变量包括方法的参数变量?br /> struts user guide里有Q?br /> Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.<br /> ?只用用局部变量?-~写U程安全的代码最重要的原则就是,在ActioncM只用局部变量,不用实例变量?/p> <p><br /> ȝQ?br /> 在Java的Web服务器环境下开发,要注意线E安全的问题。最单的实现方式是在Servlet和Struts Action里不要用类变量、实例变量,但可以用类帔R和实例常量。如果有q些变量Q可以将它们转换为方法的参数传入Q以消除它们?br /> 注意一个容易؜淆的地方Q被Servlet或Action调用的类?如值对象、领域模型类)中是否可以安全的使用实例变量Q如果你在每ơ方法调用时<br /> 新徏一个对 象,再调用它们的ҎQ则不存在同步问?--因ؓ它们不是多个U程׃n的资源,只有׃n的资源才需要同?--而Servlet和Action的实例对于多个线E是׃n 的?br /> 换句话说QServlet和Action的实例会被多个线E同时调用,而过了这一?如果在你自己的代码中没有另外启动U程Q且每次调用后箋业务对象旉是先 新徏一个实例再调用Q则都是U程安全的?/p> </fieldset> <p> </p> <p>如果惛_q解servlet的多U程可以读读此文Q阐q的很详l?br /> <a >http://hi.baidu.com/platon/blog/item/64a20ff3f96e7fce0b46e031.html</a></p><img src ="http://www.aygfsteel.com/kangdy/aggbug/300201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kangdy/" target="_blank">AK47</a> 2009-10-29 16:26 <a href="http://www.aygfsteel.com/kangdy/archive/2009/10/29/300201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">γ</a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ߺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">;</a>| <a href="http://" target="_blank">º</a>| <a href="http://" target="_blank">齭</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ָɽ</a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">޼</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">ƽң</a>| <a href="http://" target="_blank">ʻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ղ</a>| <a href="http://" target="_blank">ֺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>