2016-03-30 10 views
2

を検証通過した後、私のログインが検証に合格したと呼ばれるが、関数を実行されていないがStruts2の/春 - 実行しても、私は私のセットアップに問題を抱えている

LoginAction.java呼び出されていない:

@Override 
public String execute() throws Exception { 

    System.out.println("5"); 
    String username = blogUser.getUsername(); 
    String password = blogUser.getPassword(); 
    blogUser = blogUserService.getUserByLogin(username, password); 
    System.out.println("6"); 
    sessionMap.put(Constants.SESSION_USERNAME, blogUser.getUsername()); 
    System.out.println("7"); 
    sessionMap.put(Constants.SESSION_USERID, blogUser.getUserId()); 
    System.out.println("return:success"); 
    return SUCCESS; 
} 

@Override 
public void validate() { 
    System.out.println("1"); 
    String username = blogUser.getUsername(); 
    String password = blogUser.getPassword(); 
    System.out.println("username:"+username + ", password:"+password); 
    if (username == null & password == null) { 
     System.out.println("22"); 
     addFieldError("blogUser.username",""); 
    } else if (username == null || password == null) { 
     System.out.println("2"); 
     addFieldError("blogUser.username","Invalid Login"); 
    } else if (!blogUserService.checkLogin(username, password)) { 
     System.out.println("3"); 
     addFieldError("blogUser.username","Invalid Login"); 
    } 
    System.out.println("4"); 
} 

public String postLogin() throws Exception { 
    System.out.println("77"); 
    return LOGIN; 
} 

struts.xml:

<action name="login" class="loginActionBean" > 
     <result name="input" type="tiles">/login.tiles</result> 
     <result name="none" type="tiles">/login.tiles</result> 
     <result name="login" type="tiles">/login.tiles</result> 
     <result name="success" type="redirectAction">postPreviewAction</result> 
     <result name="error" type="tiles">/login.tiles</result> 
    </action> 

    <action name="doLogin" class="loginActionBean" method="postLogin"> 
     <result name="login" type="tiles">/login.tiles</result> 
     <result name="input" type="redirectAction">login</result> 
    </action> 

login.jspを:

<%@ page contentType="text/html; charset=UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<div> 
    <h2>Users Login</h2> 
    <s:form action="login" method="post"> 
     <s:textfield label="Username" name="blogUser.username" /> 
     <s:password label="Password" name="blogUser.password" /> 
     <s:submit value="Login" /> 
    </s:form> 
</div> 

私は(それが検証に合格したという意味)だけ "4" が印刷されて見ることができますが、それはそれだ、それは "5" には行かない

EDIT:を追加tiles.xmlスニペット

<definition name="/login.tiles" extends="baseLayout"> 
    <put-attribute name="body" value="/login.jsp" /> 
</definition> 
+0

何スコープアクション豆のために使用していますか?あなたのタイルの定義は実際には '/ login.tiles'と呼ばれていますか? –

+0

私はスコープの設定がなく、ほとんどの場合デフォルトです。私はtiles.xmlのスニペットで編集します。 –

+1

デフォルトは 'singleton'ですが、これは' prototype'でなければなりません。 –

答えて

1

通常、struts.xmlでは、各アクションのクラスを指定します。デフォルトのSpringObjectFactoryを使用している場合、フレームワークはSpringにアクションを作成し、デフォルトの自動ワイヤー動作によって指定された依存関係を結ぶように要求します。

意味するところでは、動作からSpring Beanを作成する必要はありません。

ただし、SpringによってBeanを完全に管理したい場合があります。たとえば、Acegiなどのより複雑なAOPまたはSpring対応のテクノロジをBeanに適用する場合などに便利です。これを行うには、SpringのapplicationContext.xmlにBeanを設定し、struts.xmlの`Action 'からクラス属性を変更して、クラス名の代わりにSpringで定義されたBean名を使用するだけです。

Struts2自体は、リクエストごとにアクションの新しいインスタンスを作成するため、アクションはシングルトンではありません。あなたは、アクションのうち、春のBeanを作成する場合は、それを適切なscope(例えばscope="prototype")を得、理由:デフォルトでは

Beanは場合にそれを親Bean定義がない限り、Beanは、singletonになります親のスコープを継承します。

loginActionBean宣言例:

<bean id="loginActionBean" class="some.package.LoginActionBean" scope="prototype" /> 
1

doLoginという名前のアクションが(showLoginのような適切な名前を持つ必要があります)ログインページが表示されるアクションです。それは常に失敗するため、検証するべきではありません。これをアクション設定から削除する必要があります

<result name="input" type="redirectAction">login</result> 

アクションの方法を検証から除外する必要があります。 validationインターセプタをexclude this methodに設定することもできますが、別の方法として、@SkipValidationアノテーションをメソッドに追加するだけです。

@SkipValidation 
public String showLogin() throws Exception { 
    System.out.println("77"); 
    return LOGIN; 
} 

loginという名前のアクションが

<result name="none" type="tiles">/login.tiles</result> 
<result name="login" type="tiles">/login.tiles</result>   
<result name="error" type="tiles">/login.tiles</result> 

注意を除去することができ、いくつかの冗長な結果を持っている:それは、検証から除外されない限り、デフォルトではその検証がアクションクラスからすべてのアクションメソッドで呼び出されますまたは、validationインターセプターが構成されていない。

最終的な構成:Struts2 Spring Plugin documentationから

<action name="login" class="loginActionBean" > 
    <result name="input" type="tiles">/login.tiles</result> 
    <result type="redirectAction">postPreviewAction</result> 
</action> 

<action name="showLogin" class="loginActionBean" method="showLogin"> 
    <result name="login" type="tiles">/login.tiles</result> 
</action> 
+0

ノートに感謝します。私はあなたの答えを見る前に、実際にあなたがここに投稿したことをしました。問題は、doLoginメソッドで改善が必要な場合でも、executeメソッドが呼び出されていないことです。私は既にログインページに入っていて、doLoginメソッドがどのアクションを呼び出して実行するかを指定しています。 –

+0

@JiroManio実際にあなたが言っていることはありませんでした。 executeメソッドはアクション呼び出しで呼び出され、*は*ではない*他の方法で呼び出されます。 –

+0

yesアクション呼び出しによって呼び出されます。それはvalidate関数の後です。 addFieldError関数が呼び出された場合、関数は実行されません。問題は、アクションがvalidate関数を渡したときに、呼び出されたaddFieldErrorがないことを意味し、自動的に実行されるべきexecute関数に継続しなかったということでした。 validate関数の最後で停止します。 TLDR:アクションはvalidate関数でSTOPSを呼び出し、実行機能を継続しません –

関連する問題