2010-09-12 26 views
1

我開發一個非常簡單的Struts2的aplication,我得到這個奇怪的(而且容易解決,我敢肯定)問題:如何驗證只是如果用戶提交的東西(用Struts2的)形式

當我訪問directoly登錄URL,它顯示登錄表單(用戶名和密碼的文本字段)這些錯誤:

Name field is required 
Password is required 

領域是空的,因爲這是用戶第一次進入它,所以我喜歡告訴Struts2驗證系統不要驗證,除非用戶使用用戶名和密碼提交登錄表單。我確信我忽略或僞造了一些東西。

Login.java動作代碼:

package actions.access; 

import actions.base.BaseAction; 
import data.Webuser; 

public class Login extends BaseAction { 

    private Webuser user; 

    public String execute() { 
     if (user != null) { 
      session = this.getSession(); 
      if (session.get("user-logged") == null) { 
       session.put("user-logged", user.getId()); 
      } 
     } 
     return SUCCESS; 
    } 

    public void validate() { 
     if (user != null) { 
      Webuser realUser = services.getWebuserByNickname(user.getNickname()); 
      if (realUser.getPass().equals(user.getPass())) { 
       user.setId(realUser.getId()); 
      } else { 
       addFieldError("user.nickname", "Nickname or password are wrong"); 
      } 
     } 
    } 

    public Webuser getUser() { 
     return user; 
    } 


    public void setUser(Webuser user) { 
     this.user = user; 
    } 

} 

登錄-validation.xml中代碼:

<field name="user.nickname"> 
    <field-validator type="requiredstring"> 
     <param name="trim">true</param> 
     <message>Login name is required</message> 
    </field-validator> 
</field> 

<field name="user.pass"> 
    <field-validator type="requiredstring"> 
     <param name="trim">true</param> 
     <message>Password is required</message> 
    </field-validator> 
</field> 

任何形式的幫助將不勝感激。 在此先感謝。

回答

0

你需要兩個動作。

  1. 您的登錄動作重定向到您的login.jsp。

  2. LoginSubmit處理登錄過程的操作。

對於第二個你可以定義你的驗證。

+0

你不需要兩個動作,並使用兩個動作添加不必要的代碼。 – 2011-02-06 03:29:17

0

您需要一個重定向到login.jsp的動作和另一個處理登錄過程和驗證的動作。 裏面的第一行動不要寫任何東西只是設置結果=成功。是

public class IndexAction extends ActionSupport 
{ 


    public String execute() throws Exception 
    { 
     return SUCCESS; 
    } 
} 

條目在struts.xml中像如下:以避免此問題

<action name="login" class="com.test.web.LoginAction"> 
<result name="input">/pages/login.jsp</result> 
    <result name="success" >/pages/welcome.jsp</result>  
</action> 
<action name="index" class="com.test.web.IndexAction"> 
    <result name="success">/pages/login.jsp</result> 
</action> 
+0

使用兩個操作會添加不必要的代碼,並且不能很好地擴展。每當您需要處理表單時,您都會收到2個操作類。確認! – 2011-02-06 03:30:33

0

的一種方法是,在web.xml文件中有歡迎文件列表中的條目。這應該指向你的登錄頁面。只要你開始你的應用程序,這個登錄頁面就會打開,不做任何形式的動作和驗證。

<welcome-file-list> 
    <welcome-file>Login.jsp</welcome-file> 
</welcome-file-list> 

啓動服務器後,您可以通過以下形式給予網址

http://localhost:8080/ApplicationContext
這裏8080訪問應用程序 - 是默認的HTTP端口,它可以在你的情況不同。
ApplicationContext-是您的應用程序的上下文。

我覺得其他的東西應該可以正常工作。

1

您正在尋找的是使用相同的動作來顯示錶單,然後(在提交後)處理表單。

public class LoginAction { 
    @SkipValidation 
    public String execute() throws Exception { 
     return INPUT; // shows the form 
    } 

    public void validate() { 
     // do your validations here... 
    } 

    public String submit() throws Exception { 
     // process the form 
     // redirect somewhere 
    } 
} 

表單應提交「登錄!提交」(這是動態方法調用,它調用你的submit()法)。你不需要爲此使用兩個動作。

相關問題