Apache Struts

1月 1, 2003 · Posted in Apache Struts · Comment 

Apache Struts

リンク

Apache Struts – アクションの分離(DispatchAction)

1月 1, 2003 · Posted in Apache Struts · Comment 

アクションを分離する

ひとつのForm内に複数のsubmitボタンがあり、それぞれ異なるアクションを実行したい場合に、DispatchActionを利用することで、JavaScriptによるSubmitの制御や、if文による実行ロジックの判定などを排除することができる。

実装

submitボタンにproperty句を指定し、任意の名称を設定する。

<html:form action="/DispatchAction">
    <html:submit property="command" value="add">add</html:submit>
    <html:submit property="command" value="delete">delete</html:submit>
</html:form>

struts-config.xmlには parameter="[リクエストパラメータ名]"を設定する。

<action path="/DispatchAction"
        type="struts.dispatchaction.DispatchActionSample"
        name="DummyForm"
        parameter="command"
        scope="request">
    <forward name="success"
    path="/pages/dispatchaction/index.jsp" />
</action>

DispatchActionを継承したアクションクラスを作成し、html:submitボタンのvalue句に指定した名称と同様のメソッドを定義する。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import util.logging.LogManager;

public class DispatchActionSample extends DispatchAction{
    private Log log = LogManager.getLogger(this.getClass());

    public ActionForward add(ActionMapping mapping, ActionForm form,
                             HttpServletRequest request, HttpServletResponse response)
                             throws Exception{
        log.debug("add");
        return mapping.findForward("success");
    }

    public ActionForward delete(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request, HttpServletResponse response)
                             throws Exception{
        log.debug("delete");
        return mapping.findForward("success");
    }
}

これで、addボタン押下時にはaddメソッドが、deleteボタン押下時にはdeleteメソッドが実行されるようになる。

Apache Struts – エラーの分離

1月 1, 2003 · Posted in Apache Struts · Comment 

エラーを分離する

Strutsでは発生したアクションエラー(ActionError, ActionMessage)がキーと値の組み合わせで一元管理されている。
異なるキーでエラーを格納することで、エラーを論理的に分離することができる。

エラーチェックコード

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;

public class ActionErrorsAction extends Action {

    private static Log log = LogFactory.getLog(ActionErrorsAction.class);

    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response)
        throws Exception {

        log.debug(getClass().getName());

        DynaActionForm dynaForm = (DynaActionForm)form;
        String name = (String)dynaForm.get("name");
        String userid = (String)dynaForm.get("userid");
        String password = (String)dynaForm.get("password");
        log.debug("name\t"+name);
        log.debug("userid\t"+userid);
        log.debug("password\t"+password);

        ActionMessages errors = new ActionMessages();
        if(isEmpty(name)){
            errors.add("info", new ActionMessage("errors.required", "name"));
        }
        if(isEmpty(userid)){
            errors.add("system", new ActionMessage("errors.required", "userid"));
        }
        if(isEmpty(password)){
            errors.add("system", new ActionMessage("errors.required", "password"));
        }
        if(errors.size() > 0){
            log.debug("error(s) info\t" + errors.size("info") + "件");
            log.debug("error(s) system\t" + errors.size("system") + "件");
            saveErrors(request, errors);
            return mapping.getInputForward();
        }

        return mapping.findForward("success");
    }

    private boolean isEmpty(String param){
        return (param == null || param.equals(""));
    }
}

jspでの分離

<b>group1</b>
<html:errors property="info"/>

<b>group2</b>
<html:errors property="system"/>

リダイレクトされたアクション内での分離(例:input=xxx.do)

ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
log.debug("info\t"+messages.size("info"));
log.debug("system\t"+messages.size("system"));

次ページへ »