DynaActionForm 実践編。

LoginAction.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.DynaActionForm;

public class LoginAction extends Action {

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

      DynaActionForm dynaForm = (DynaActionForm) form;
      String user = (String) dynaForm.get("userID");
      String pass = (String) dynaForm.get("password");
    
    if (user.equals("mirai")) {
      if (pass.equals("conan")) {
        return map.findForward("next");
      }
    }
    return map.findForward("reject");
  }
}

struts-config.xml(間違いあり)

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
  <data-sources />
  <form-beans>
    <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">
      <form-property name="userID" type="java.lang.String" initial="" />
      <form-property name="password" type="java.lang.String" initial="" />
    <form-bean/>
  </form-beans>
  <global-exceptions />
  <global-forwards />
  <action-mappings>
      <action path="/Login" type="LoginAction" name="loginForm" scope="request" input="/Login.jsp" validate="true">
          <forward name="next" path="/loginSuccess.jsp"/>
          <forward name="reject" path="/rejectUser.jsp"/>
      </action>
  </action-mappings>
  <message-resources parameter="MessageResources" />
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
    <set-property property="stopOnFirstError" value="true" />
  </plug-in>
</struts-config>

で準備完了。それっとババン!

HTTPステータス 500 - 

--------------------------------------------------------------------------------

type 例外レポート

メッセージ 

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外 

javax.servlet.ServletException: ActionMappingsまたはActionFormBeansコレクションが見つかりません
  org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
  org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
  org.apache.jsp.Login_jsp._jspService(Login_jsp.java:81)
  org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
  org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
  org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


原因 

javax.servlet.jsp.JspException: ActionMappingsまたはActionFormBeansコレクションが見つかりません
  org.apache.struts.taglib.html.FormTag.lookup(FormTag.java:711)
  org.apache.struts.taglib.html.FormTag.doStartTag(FormTag.java:419)
  org.apache.jsp.Login_jsp._jspx_meth_html_form_0(Login_jsp.java:150)
  org.apache.jsp.Login_jsp._jspx_meth_html_html_0(Login_jsp.java:111)
  org.apache.jsp.Login_jsp._jspService(Login_jsp.java:72)
  org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
  org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
  org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


注意 原因のすべてのスタックトレースは、Apache Tomcat/5.0.28のログに記録されています


--------------------------------------------------------------------------------

Apache Tomcat/5.0.28


これだけでは何もわからないのでログを見る

C:\Program Files\Apache Software Foundation\Tomcat 5.0\logs\localhost_log.2004-12-06.txt(抜粋)

2004-12-06 18:35:52 StandardContext[/test]サーブレット /test がload()例外を投げました
javax.servlet.UnavailableException: パス /WEB-INF/struts-config.xml に対するリソース読み込みエラー
  at org.apache.struts.action.ActionServlet.handleConfigException(ActionServlet.java:739)
  at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:715)
  at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:670)
  at org.apache.struts.action.ActionServlet.init(ActionServlet.java:329)
  at javax.servlet.GenericServlet.init(GenericServlet.java:211)


げげげ、struts-config のパースミスって事は書式がおかしいのか。

struts-config.xml(抜粋)

  <form-beans>
    <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">
      <form-property name="userID" type="java.lang.String" initial="" />
      <form-property name="password" type="java.lang.String" initial="" />
    <form-bean/>
  </form-beans>

確かにおかしい部分がある。xml ファイルで構文にエラーがある場合はたいてい

  • 開始タグと閉じタグの関係がおかしい。(閉じタグが無いとか)
  • タグ内の要素でリテラルの閉じ記号とかを忘れてる(type="aaa name="jjj"みたいに)

になってると思う。

さて今回は。
ずばり抜粋の5行目のの閉じタグの書式・・・だめじゃん。(それは閉じタグ省略時の記法)

×

で、修正してババン!(2度目)

出たー!ばっちり、つーか簡単。ちゃんとエラーチェックも通らなくなってる。完勝!