StrutsBlank? (Struts1.2.4付属)

  1. web.xml間違え
    ×
    <!DOCTYPE web-app 
       PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
              "http://java.sun.com/dtds/web-app_2_3.dtd">
                                   ^^^^
    ○
    <!DOCTYPE web-app 
       PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
              "http://java.sun.com/dtd/web-app_2_3.dtd">
                                   ^^^

Validator

  1. Javascript
    Validate項目がないのに JSPに<html:javascript> があるとJavascriptエラーになる
  2. Action(Struts-config.xml)
    Validate項目がないのに Actionクラスの @struts.action.validate が true だと
    ActionでServerExceptionが発生する
    
    * @struts.action
    *  name="Form"
    *  path="/URL"
    *  scope="session"
    *  input="/pages/validation-err.jsp"
    *  validate="true" <-----------------ここ
  3. JSP
    JSPの<html:form>の中に検証対象の項目がないとJSPエラーになる
    → 表示したくなくてもHiddenでJSPに持たせるのが吉
  4. Check Boxに対する必須チェックは、チェック([v])されているかどうかのチェック
  5. dateは、DateFormat.SHORT形式の検証。つまり、日付(yyyy/MM/dd)の検証しかしない。時刻まで含めた検証(yyyy/MM/dd hh:mm:ss.SSS)はできない
    →時刻まで検証したい時には入力項目を分ける
    日付 [ 1999/12/31   ]     -> dateで検証
    時刻 [23]:[59]:[59].[999] -> requiredとintRangeで検証 

JSPの出力が途中で止まる

  1. 現象
    Validatorのjavascript検証を有効にしていると、JSPの出力が途中で止まってしまうことがある。特に高負荷時。
     
  2. 理由
    これは、JSPWriterのデフォルト設定が、
    <%@ page buffer="8kb" %>
    <%@ page autoFlush="true" %>
    になっているため。
    Servlet側はバッファがいっぱいになる度にブラウザにバッファの内容を送信するが、バッファがフラッシュされる間隔が広いとブラウザはServletに異常が発生して続きを送信できなくなったと見なして受信を打ち切ってしまう。
     
  3. 対処
    JSPの@pageディレクティブで十分に大きいバッファを指定し、autoFlushをfalseにする。このようにすると、HTTP-RESPONSEは一度に送られるようになる。またHTTP-RESOPNSEの内容がバッファに収まらない場合にはServletエラーとみなされる。
    <%@ page buffer="128kb" %>
    <%@ page autoFlush="false" %>

例外処理

  1. 拾われるのはExceptionの子孫のみ
    • java.lang.Exceptionを継承している例外をひろう
      java.lang.Object
        |
        +--java.lang.Throwable
              |
              +--java.lang.Error
              |
              +--java.lang.Exception
                    |
                    +--java.lang.RuntimeException
      システム異常もRuntimeExcepiton?を継承して作らなくてはいけませんね
    • java.lang.Error(を継承した例外)を記述しても拾われない
      <global-exceptions>
        <exception type="java.lang.Error"
                   path="/pages/system-error.jsp"
                   key="SysError"/>
      </global-exceptions>
      なんてやってもStrutsからは無視される
    • よく見ると Action.execute() throws Exception なんで当然と言えば当然なのですが・・・

ActionForm?

  1. POST時の動作順序
    1. reset()
    2. HTTP-POSTに載っているパラメータを setXXX() で FormBeanに書き込む
    3. validate()
    • reset() は、コンストラクタで走るのではなくリクエスト毎に走る
    • validate()の前にsetterが動くので、型変換エラーが起きる可能性がある。ActionForm?のフィールドはStringにしておくのが吉。
    • checkboxを使うときには、resetで"false"を入れておく必要がある。
      • HTTP-REQUESTでは、「チェックされない」という情報が送られないので、resetで"false"を入れないと、「チェックされない」という情報をActionForm?に設定できない。
      • 以下のようなときの問題が起きる
        操作ActionForm?#agreeCheckの状態
        A画面でchekcboxをチェックしてsubmit"true"(HTTP-REQUEST)
        確認画面でA画面に戻る"true"
        A画面でcheckboxのチェックをはずしてsbumit"true"(HTTP-REQUSETに、agreeCheckが無いので上書きされない
      • resetしてやると
        操作ActionForm?#agreeCheckの状態
        A画面でchekcboxをチェックしてsubmit"false"(reset())->"true"(HTTP-REQUEST)
        確認画面でA画面に戻る"true"
        A画面でcheckboxのチェックをはずしてsbumit"false"(reset())->"false"(HTTP-REQUESTに該当項目がないので上書きされない)
    • multiboxの場合も同様に、resetで、受け口のフィールド変数(String[])にnullを入れておく必要がある。
  2. validate()メソッドはこう書く
     public ActionErrors validate(ActionMapping map, HttpServletRequest req) {
       ActionErrors errors = super.validate(map, req);
    
       if (errors == null) {
         errors = new ActionErrors();
       }
    
       if (甲が乙で乙が丙で丙が丁){
         errors.add(
           ActionMessages.GLOBAL_MESSAGE,
           new ActionMessage("errors.E03459"));
       }
    
       return errors;
     } 
    • ValidateForm?#validate() は、nullか空のActionErrors?を返すとValidateエラーがなかったものと見なされる。

定義ファイル(XML)で、スペースのみの行を消す

  1. Strutsは、スペースのみの行が入っているXMLをうまく処理できないようだ
  2. cf. Struts 独自のValidator#Tips1

Struts 1.x + X Doclet 1.2.3 について

minlength Validator について


Java#Struts


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2008-10-31 (金) 00:01:03 (2962d)
ISBN10
ISBN13
9784061426061