QA@IT

Action 内で error success を返しているが、その Result に遷移しない。

3987 PV

login_check という Action Method ないで error success を返しているが、struts.xml に記述した、/main/login_success.jsp /main/login_error.jsp に遷移しない。

遷移先は、login.jsp のように見えます。

LoginAction.java

package main;

public class LoginAction {

    public String errmsg;
    public String userId;
    public String password;

    public String execute() throws Exception {
        return "success";
    }

    public String login_check() throws Exception {

        if(this.password == null || !this.password.equals("pass")){

            this.errmsg = "PASSWORDは「pass」と入力してください";

            return "error";

        } else {

            return "success";

        }

    }

}

struts.xml

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

    <constant name="struts.devMode" value="false" />
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />

    <package name="main" namespace="/main" extends="struts-default">

        <action name="login" method="execute" class="main.LoginAction">

            <result name="success">/main/login.jsp</result>

        </action>

        <action name="login_check" method="login_check" class="main.LoginAction">

            <result name="success">/main/login_success.jsp</result>

            <result name="error">/main/login_error.jsp</result>

        </action>

    </package>

</struts>

login.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<jsp:include page="header.jsp"/>
<s:form cssClass="form-horizontal">
    <div class="form-group">
        <label class="col-sm-2 control-label">USER:</label>
        <div class="col-sm-10">
            <s:textfield name="userId" cssClass="form-control"/>
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-2 control-label">PASSWORD:</label>
        <div class="col-sm-10">
            <s:textfield name="password" type="password" cssClass="form-control"/>
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <s:submit method="login_check" value="LOGIN" cssClass="btn btn-primary"/>
        </div>
    </div>
</s:form>
<p class="err"><s:property value="errmsg" /></p>
<jsp:include page="footer.jsp"/>

回答

お見受けしたところStruts2系統をご利用のようですね。
Struts2系統でのActionクラスはActionSupporクラスを継承致します。
また、そこで使われるメソッドはActionSupporクラスにあるexecute()メソッドを
オーバーライドしてコーディングします。
最新バージョンのstruts-2.3.24.1を採用なされていたら、
lib配下に配置したxwork-core-2.3.24.1.jarをコピーしてデスクトップに貼り付け、
拡張子jarをzipに変更しデスクトップに「すべて展開」して下さい。
デスクトップに「com」というフォルダがありますので、
開くと「opensymphony」というフォルダがあります。さらに「xwork2」というフォルダがありますので開くと、
「ActionSupport.class」があります。
http://varaneckas.com/jad/というサイトから最新バージョンの「jad」というソフトをダウンロードして、
「ActionSupport.class」がある階層に「jad.exe」を移動して、
「jad.exe」に「ActionSupport.class」をドラックアンドドロップして「実行」して下さい。
「ActionSupport.jad」というファイルが出来ますので「メモ帳」で開くと、

package com.opensymphony.xwork2;

import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
import java.io.Serializable;
import java.util.*;

public class ActionSupport
    implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable
{
    public ActionSupport()
    {
    }
    ------
    public String execute()
        throws Exception
    {
    ------
}

とコーディングされています。
すなわちActionSupporクラスを継承したらexecute()メソッドをオーバーライドして使いなさいよという事です。
なぜかというと、Struts2系統を使ってActionクラスをコーディングする時は、
プログラマは皆execute()メソッドで処理を実装しなさいよという暗黙のルールだと考えて下さい。
プログラマがチームでプログラミングしやすいようにとでも考えて下さい。
また、Struts2系統でStruts.xmlはいらないです。いるのはStruts1系統です。
従って、LoginAction.javaでは、successとerrorの遷移先は@Resultというアノテーションで宣言します。

LoginAction.java

package main;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.convention.annotation.Action;
import com.opensymphony.xwork2.ActionSupport;

@Results({
     @Result(name="success", location="/main/login_success.jsp"),
     @Result(name="error", location="/main/login_error.jsp")
})
public class LoginAction extends ActionSupport{

    public String errmsg;
    public String userId;
    public String password;

    private static final long serialVersionUID = 1L;    

    @Action("login")
    public String execute() throws Exception {
        if(this.password == null || !this.password.equals("pass")){
            this.errmsg = "PASSWORDは「pass」と入力してください";
            return "error";
        } else {
            return "success";
        }
    }
}

login.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<jsp:include page="header.jsp"/>
<s:form method="post" action="login" cssClass="form-horizontal">
    <div class="form-group">
        <label class="col-sm-2 control-label">USER:</label>
        <div class="col-sm-10">
            <s:textfield name="userId" cssClass="form-control"/>
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-2 control-label">PASSWORD:</label>
        <div class="col-sm-10">
            <s:textfield name="password" type="password" cssClass="form-control"/>
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <s:submit value="LOGIN" cssClass="btn btn-primary"/>
        </div>
    </div>
</s:form>
<p class="err"><s:property value="errmsg" /></p>
<jsp:include page="footer.jsp"/>
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。