Struts(九)Struts2结果类型剖析

1.在struts.xml页面里面extends 的struts-default(结果类型)

(1)dispatcher---请求转发(系统默认)

(2)chain---action之间链接(也就是转发,由一个action转到另一个action,且在同一个请求中)

(3)redirect---重定向到一个资源

(4)redirecrAction---重定向到某个action上

 

2.采取请求转发的方式完成表单内容的添加会造成内容的重复插入。

add请求发送给servlet,该servlet有两个功能,添加功能与查询功能。当查询结果结束后,会将结果请求转发list页面显示出来。但是,如果客户在list页面点击刷新,则结果页面会出现两次信息的插入。

 

3.采取重定向的方式实现数据的添加不会导致数据的重复插入。

当用户发送add请求,servlet页面接受请求,同时处理add功能,再将结果重定向导ListServlet页面,在此页面上执行查询功能,最后将结果请求转发到list页面。客户在listServlet页面刷新,只会重复查询数据。

 

4.struts-default结果类型详将

(1)redirect,重定向之后拿不到请求

(2)redirectAction

例子:redirectLogin.jsp

 

<body>
   <form action="RedirectAction">
       <input type="text" name="username"><br>
       <input type="password" name="password"><br>
       <input type="submit" value="submit">
   </form>
  </body>

RedirectAction 

public class RedirectAction extends ActionSupport
{
    private String username;
    private String password;
    private String and;
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public String getAnd()
    {
        return and;
    }
    public void setAnd(String and)
    {
        this.and = and;
    }
    
    
    @Override
    public String execute() throws Exception
    {
        return SUCCESS;
    }
RedirectAction2

RedirectAction2

public class RedirectAction2 extends ActionSupport
{
    private String username;
    private String password;
    private String and;
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public String getAnd()
    {
        return and;
    }
    public void setAnd(String and)
    {
        this.and = and;
    }
    
    @Override
    public String execute() throws Exception
    {
        return SUCCESS;
    }
}

redirectResult.jsp

<body>
       <s:property value="username"/>
       <s:property value="password"/>
    <s:property value="and"/>
   
  </body>

struts.xml

<action name="RedirectAction" class="com.liule.action.RedirectAction">
            <result name="success" type="redirectAction">
            <param name="actionName">RedirectAction2</param>
            <param name="username">${username}</param>
            <param name="password">${password}</param>
            <param name="and">${and}</param>
            </result>
        </action>
        
        <action name="RedirectAction2" class="com.liule.action.RedirectAction2">
            <result  name="success">/redirectResult.jsp</result>
            
        </action>
        

 

5.防止表单的重复提交

(1)通过重定向

(2)通过Session Token(session 令牌):当客户端请求页面时,服务器会通过token标签生成一个随机数,并且将该随机数放置到session当中,然后将该随机数发向客户端;如果客户端第一次提交,那么会将该随机数发往服务器,服务器会接收到该随机数并且与session中所保存的随机数进行比较,这时两者的值是相同的,服务器认为是第一次提交,并且将更新服务器的这个随机数值;如果此时再次重复提交,那么客户端发向服务器端的随机数还是之前的那个,而服务器端的随机数则已经发生了变化,两者不同,服务器就认为这是重复提交,进而转向invalid.token所指向的结果页面。

例子:struts.xml

<action name="TokenAction" class="com.liule.action.TokenAction">
            <result name="success">/tokenResult.jsp</result>
            <result name="invalid.token">/tokenError.jsp</result>
            <interceptor-ref name="token"></interceptor-ref> 
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

tokenLogin.jsp

<s:form action="TokenAction" theme="simple">
      username:<s:textfield name="username" ></s:textfield><br>
      password:<s:password name="password"></s:password><br>
      
      <s:token></s:token>
      
      <s:submit value="sbmit"></s:submit>
  
  
  </s:form>

 http://www.cnblogs.com/liunanjava/p/4375462.html

posted on 2015-11-07 03:28  张凌赫_帅  阅读(200)  评论(0)    收藏  举报

导航