??xml version="1.0" encoding="utf-8" standalone="yes"?>www在线免费观看,亚洲免费一区二区,中文字幕av免费专区久久http://www.aygfsteel.com/kangdy/我就像AK47里打出去的子式V目标TMD永远在前斏V我只能TMD拼命向前?/description>zh-cnWed, 18 Jun 2025 16:55:18 GMTWed, 18 Jun 2025 16:55:18 GMT60(转脓)数据库连?内连接,外连接,交叉q接)http://www.aygfsteel.com/kangdy/archive/2011/11/30/365223.htmlAK47AK47Wed, 30 Nov 2011 09:24:00 GMThttp://www.aygfsteel.com/kangdy/archive/2011/11/30/365223.htmlhttp://www.aygfsteel.com/kangdy/comments/365223.htmlhttp://www.aygfsteel.com/kangdy/archive/2011/11/30/365223.html#Feedback0http://www.aygfsteel.com/kangdy/comments/commentRss/365223.htmlhttp://www.aygfsteel.com/kangdy/services/trackbacks/365223.html文章地址 Q?nbsp;http://www.zxbc.cn/html/20080527/51189.html
转蝲 
内连接:把两个表中数据对应的数据查出?nbsp;
外连接:以某个表为基把对应数据查出来Q全q接是以多个表ؓ基础Q?nbsp;
student?nbsp;
no name 
1     a 
2     b 
3     c 
4     d 
grade?nbsp;
no grade 
1     90 
2     98 
3     95 
内连?inner joinQ查找条件中对应的数据,no4没有数据不列出来Q?nbsp;
语法Qselect * from student inner join grade on student.no = grade.no 
l果 
student.no name grade.no grade 
1             a             1         90 
2             b             2         98 
3             c             3         95 
左连接(左表中所有数据,双中对应数据) 
语法Qselect * from student left join grade on student.no = grade.no 
l果Q?nbsp;
student.no name grade.no grade 
1                 a         1         90 
2                 b         2         98 
3                 c         3         95 
4                 d     
双接(双中所有数据,左表中对应数据) 
语法Qselect * from student right join grade on student.no = grade.no 
l果Q?nbsp;
student.no name grade.no grade 
1                 a         1         90 
2                 b         2         98 
3                 c         3         95 
全连?nbsp;
语法Qselect * from student full join grade on student.no = grade.no 
l果Q?nbsp;
no name grade 
1     a     90 
2     b     98 
3     c     95 
4     d 
1     a     90 
2     b     98 
3     c     95 
注:access 中不能直接用full join Q需要用union all 左q接和右q接合ƈ后才可以

交叉q接
两个表所有行l合Q连接后的行Cؓ两个表行数的乘积Q笛卡尔U)
语法Q借用上面的例子应该是
select * from student cross join grade

行数应该?2?Q?br />
no name grade 
1     a     90 
2     b     98 
3     c     95 
4     d  
1     a     90 
2     b     98 
3     c     95 
4     d 
1     a     90 
2     b     98 
3     c     95 
4     d 


AK47 2011-11-30 17:24 发表评论
]]>
JAXB向Xml非根节点d一个或多个属?/title><link>http://www.aygfsteel.com/kangdy/archive/2011/11/23/364635.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Wed, 23 Nov 2011 06:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/kangdy/archive/2011/11/23/364635.html</guid><wfw:comment>http://www.aygfsteel.com/kangdy/comments/364635.html</wfw:comment><comments>http://www.aygfsteel.com/kangdy/archive/2011/11/23/364635.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kangdy/comments/commentRss/364635.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kangdy/services/trackbacks/364635.html</trackback:ping><description><![CDATA[JAXB 向Xml非根节点d一个或多个属性,直接上代码,关于JAXB的相x解可查阅JAVA API?br /><br /><span style="color: red;">原创文章Q{载请注明出处?/span><a href="http://www.aygfsteel.com/kangdy/archive/2011/11/23/364635.html">http://www.aygfsteel.com/kangdy/archive/2011/11/23/364635.html</a><br /><br />code1: colorsc?nbsp; 根节?br /><fieldset><legend>code1</legend><div>package com.kangdy.test;<br /><br />import javax.xml.bind.annotation.XmlAccessType;<br />import javax.xml.bind.annotation.XmlAccessorType;<br />import javax.xml.bind.annotation.XmlElement;<br />import javax.xml.bind.annotation.XmlRootElement;<br /><br />@XmlRootElement(name = "Colors")<br />@XmlAccessorType(XmlAccessType.FIELD)<br />public class Colors {<br />    <br />    @XmlElement(name = "red",nillable=true)<br />    private Red red;<br />    <br />    @XmlElement(name = "blue",nillable=true)<br />    private Blue blue;<br /><br />    public Red getRed() {<br />        return red;<br />    }<br /><br />    public Blue getBlue() {<br />        return blue;<br />    }<br /><br />    public void setRed(Red red) {<br />        this.red = red;<br />    }<br /><br />    public void setBlue(Blue blue) {<br />        this.blue = blue;<br />    }<br />}</div></fieldset><br />code2:  Redc?nbsp; 子节?br /><fieldset><legend>code2</legend>package com.kangdy.test;<br /><br />import javax.xml.bind.annotation.XmlAccessType;<br />import javax.xml.bind.annotation.XmlAccessorType;<br />import javax.xml.bind.annotation.XmlAttribute;<br />import javax.xml.bind.annotation.XmlRootElement;<br /><br />@XmlRootElement(name = "red")<br />@XmlAccessorType(XmlAccessType.FIELD)<br />public class Red {<br />    <br />    private String value;<br />    <br />    @XmlAttribute(name = "att1")<br />    private String att;<br />    <br />    public String getValue() {<br />        return value;<br />    }<br />    <br />    public void setValue(String value) {<br />        this.value = value;<br />    }<br /><br />    public String getAtt() {<br />        return att;<br />    }<br /><br />    public void setAtt(String att) {<br />        this.att = att;<br />    }<br />    <br />}<br /><br /></fieldset><br />code3:  c?Blue 子节?br /><fieldset><legend>code3</legend><div>package com.kangdy.test;<br /><br />import javax.xml.bind.annotation.XmlAccessType;<br />import javax.xml.bind.annotation.XmlAccessorType;<br />import javax.xml.bind.annotation.XmlAttribute;<br />import javax.xml.bind.annotation.XmlRootElement;<br /><br />@XmlRootElement(name = "blue")<br />@XmlAccessorType(XmlAccessType.FIELD)<br />public class Blue {<br />    private String value;<br />    <br />    @XmlAttribute(name = "att2")<br />    private String att2;<br />    <br />    @XmlAttribute(name = "att1")<br />    private String att;<br />    <br />    public String getAtt() {<br />        return att;<br />    }<br /><br />    public void setAtt(String att) {<br />        this.att = att;<br />    }<br /><br />    public String getValue() {<br />        return value;<br />    }<br /><br />    public void setValue(String value) {<br />        this.value = value;<br />    }<br /><br />    public String getAtt2() {<br />        return att2;<br />    }<br /><br />    public void setAtt2(String att2) {<br />        this.att2 = att2;<br />    }<br />}</div></fieldset><br />code4: mainc?br /><fieldset><legend>code4</legend><div>package com.kangdy.test;<br /><br />import java.io.StringWriter;<br /><br />import javax.xml.bind.JAXBContext;<br />import javax.xml.bind.Marshaller;<br /><br />public class Jaxbtest {<br />    public static void main(String[] args) throws Exception {<br /><br />        StringWriter writer = new StringWriter();<br />        JAXBContext jc = JAXBContext.newInstance(Colors.class);<br />        Marshaller ma = jc.createMarshaller();<br />        ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);<br />        <br />        Colors colors = new Colors();<br />        Red red = new Red();<br />        red.setAtt("att-red");<br />        red.setValue("red");<br />        Blue blue = new Blue();<br />        blue.setValue("blue");<br />        blue.setAtt("att-blue");<br />        blue.setAtt2("blue-att2");<br />        colors.setRed(red);<br />        colors.setBlue(blue);<br />        <br />        ma.marshal(colors, writer);<br />        System.out.println(writer.toString());<br /><br />    }<br />}</div></fieldset><br />q行l果Q?br /><fieldset><legend>l果</legend><div><?xml version="1.0" encoding="UTF-8" standalone="yes"?><br /><Colors><br />    <red att1="att-red"><br />        <value>red</value><br />    </red><br />    <blue att1="att-blue" att2="blue-att2"><br />        <value>blue</value><br />    </blue><br /></Colors></div></fieldset><img src ="http://www.aygfsteel.com/kangdy/aggbug/364635.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-23 14:33 <a href="http://www.aygfsteel.com/kangdy/archive/2011/11/23/364635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转蝲)关于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>重新认识Java finallyhttp://www.aygfsteel.com/kangdy/archive/2011/11/01/362456.htmlAK47AK47Tue, 01 Nov 2011 08:56:00 GMThttp://www.aygfsteel.com/kangdy/archive/2011/11/01/362456.htmlhttp://www.aygfsteel.com/kangdy/comments/362456.htmlhttp://www.aygfsteel.com/kangdy/archive/2011/11/01/362456.html#Feedback0http://www.aygfsteel.com/kangdy/comments/commentRss/362456.htmlhttp://www.aygfsteel.com/kangdy/services/trackbacks/362456.html以下是{贴内容:

1 . JAVA finally字句的异怸失和q回D盖解?/strong>
原帖地址 Q?br />http://blog.csdn.net/sureyonder/article/details/5560538
转脓
Java虚拟机在每个try语句块和与其相关的catch子句的结?处都?#8220;调用”finally子句的子例程。实际上Qfinally子句在方法内部的表现很象“微型子例E?#8221;。finally子句正常l束后-指的是finally子句中最后一条语句正常执行完毕,不包括抛出异常,或执行return、continue、break{情况,隶属于这个finally子句的微型子例程执行“q回”操作。程序在W一ơ调用微型子例程的地方l执行后面的语句?br />
finally“微型子例E?#8221;不等同于Ҏ函数的调用,finally子句都是在同一个栈内执行的Q微型子例程?#8220;q回”操作也不会涉及到Ҏ退栈,仅仅是ɽE序计数器pc跌{到同一个方法的一个不同的位置l箋执行?br />一 异常丢失
    public static void exceptionLost()  
     {  
       try  
       {  
         try  
         {  
           throw new Exception( "exception in try" );  
         }  
         finally  
         {  
           throw new Exception( "exception in finally" );  
         }  
       }  
       catch( Exception e )  
       {  
         System.out.println( e );  
       }  
     }  

exceptionLost()的输出结果是“exception in finally”Q而不是try块中抛出的异常,q是JAVA异常机制的一个瑕疵-异常丢失?br />
在字节码中,throw语句不是原子性操作。在较老的JDK中,exceptionLost()中try块的throw语句分解为几步操作:
1) 把Exception("exception in try")对象引用存储C个局部变量中
  astore_2  // pop the reference to the thrown exception, store into local variable 2
2) 调用finally微型子程?br />3) 把局部变量中的Exception("exception in try")对象引用push到操作数栈顶Q然后抛出异?br />  aload_2  // push the reference to the thrown exception from local variable 2

  athrow   // throw the exception

如果finally通过break、return、continueQ或者抛出异常而退出,那么上面的第Q步׃会执行?br />
在JDK1.6中,通过字节码我们可以看刎ͼfinally子句作ؓ一U特D的catch来实现的Q下面是exceptionLost()Ҏ的异常表Q?br />
Exception tableQ?br />  from   to   target  type
   0     10    10     any
 0     21    21     Class java/lang/Exception

finally可以捕获?行到9行之间抛出的Mcd(any)的异常,q新抛出捕L异常Q或者抛Z个自己构造的新异常,q个新异常就会覆盖try语句块中的异常?br />二 q回D?br />
    public static int getValue()  
     {  
       int value = 0;  
         
       try  
       {  
         value = 100;  
           
         return value;  
       }  
       finally  
       {  
         value = 200;  
       }  
     }  

q个Ҏ的返回值是100q是200?l果?00?br />在字节码中,return语句不是原子性操作,它会把getValue()中的return语句分解为几步操作:
1) 把value值存储到一个局部变?q里命名为temp)中:
   iload_0   // push local variable 0 - the 100
   istore_2   //  pop an int (the 100), store into local varaible 2
2) 调用finally微型子程?br />3) 把局部变?指temp)的值push到操作数栈顶Q然后返回到调用Ҏ
     iload_2  // push local varaible 2 - the 100
   ireturn      // return int on top of the stack - the 100: return 100

׃return语句在返回之前会把返回g存到一个时的局部变量中Q所以在finally子句内对value重新赋g会媄响返回倹{?br />
了解finally子句内在的一些知识,我们能够了解finally能够做什么和不能够做什么,q样会帮助我们正用finally子句?/div>

2 . 关于 Java ?finally 语句块的深度辨析
原帖地址 Q?a href=" http://www.ibm.com/developerworks/cn/java/j-lo-finally/index.html?ca=drs-">
http://www.ibm.com/developerworks/cn/java/j-lo-finally/index.html?ca=drs-
转脓
关于 Java 虚拟机是如何~译 finally 语句块的问题Q有兴趣的读者可以参?span style="color: #008000;">?The JavaTM Virtual Machine Specification, Second Edition 》中 7.13 ?Compiling finally。那里详l介l了 Java 虚拟机是如何~译 finally 语句块。实际上QJava 虚拟Z?finally 语句块作?subroutineQ对于这?subroutine 不知该如何翻译ؓ好,q脆׃译了,免得产生歧义和误解。)直接插入?try 语句块或?catch 语句块的控制转移语句之前。但是,q有另外一个不可忽视的因素Q那是在执?subroutineQ也是 finally 语句块)之前Qtry 或?catch 语句块会保留其返回值到本地变量表(Local Variable TableQ中。待 subroutine 执行完毕之后Q再恢复保留的返回值到操作数栈中,然后通过 return 或?throw 语句其q回l该Ҏ的调用者(invokerQ?/span>h意,前文中我们曾l提到过 return、throw ?break、continue 的区别,对于q条规则Q保留返回|Q只适用?return ?throw 语句Q不适用?break ?continue 语句Q因为它们根本就没有q回倹{?/span>


AK47 2011-11-01 16:56 发表评论
]]>
վ֩ģ壺 ϵ| Դ| | ɽ| | մ| բ| | ̫| | Դ| ɽ| | | | | Ҿ| ɽ| ʯʨ| | Ϫ| ¡| | ʵ| ˳| ԭ| Զ| ɽ| ϲ| | ޽| ƽ| | ˫| | | մ| ľ| Ƥɽ| | |