竹形誠司 ブログ
談話室    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
Struts 無用論
by KILROY[KILROY]
 昨今 Struts というのが流行っている、らしい。
 フレームワークの有効性だとか何だとかいろいろ議論はあるのですがね、ぶっちゃけ「フォームの入力チェック部分が JavaScript ではなく Java で書ける」っていうのが、最大のメリットだと評価されているんだろうと思う。
 ええ、発想としては面白いですよ、確かに。だけど、ぶっちゃけ面倒臭い。
 Struts だと、
 フォームの飛び先をサーブレットで受ける→コンテキストからデータを引っ張ってきて Form から送られたデータを JavaBeans (いわゆる FormBean )に格納する→ Beans の中で入力チェックを行なう。→結果(終了ステータス)によってどこのページに飛ぶかを( struts_config.xml ファイルの内容から)判断する。
ということをやっているのですが、これ、何か修正しようとするとあっちゃこっちゃ影響が出てウザいったらありゃしない。
 入力フォームがあらゆるページにあるような在庫管理システムとかならともかく、中規模・小規模のシステムに本当に Struts を使う意味があるんだろうか、と私なんかは思っちゃうわけですよ。
 でまあ、開発した手法が「自分自身に飛ぶ」というテクニック。具体的には
  <form action="<%=request.getRequestURI()%>" method="Post">
っつーやりかたです。そうすると、Struts のように「入力値が不正だったから元のページに制御を投げ返す」んじゃなくて、「条件が満たされたら他のページに遷移する」っていうスタイルが取れるわけです。他のページ(大抵は確認用のページ)の内容をリダイレクトすると、URI が同じになっちゃったりするわけですが、これ、慣れるとけっこう自然です。で、入力値チェックを Java で記述できるうえに、「投げ返す」わけじゃないから一つのファイルで記述が閉じている、つまり「どこに置くか」を気にしなくていい。
 近々、サンプルアプリケーション公開予定。では。
投稿:KILROY[KILROY]/2007年 04月 05日 22時 30分 /更新:2007年 04月 05日 22時 38分
Struts 無用論(つづき)
by KILROY[KILROY]
>  近々、サンプルアプリケーション公開予定。では。
 というわけで、「たとえばログイン用のページはこんなふうに書ける」という例。ところどころ余計なコードが入っているのはお許しください。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<%@ page language="java" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="Windows-31J" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="test" tagdir="/WEB-INF/tags/view" %>
<%@ taglib prefix="cntrl" tagdir="/WEB-INF/tags/cntrl" %>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
  <title>ログイン</title>
<!--
    ページをキャッシュしないようにしておかないと、
    セッション切断の操作が行なわれないことがある。
-->
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">
</head>
<body>
  <jsp:useBean id="user" class="common.beans.UserBean" scope="session" />
<%
    String name = request.getParameter("user_name");
    String pass = request.getParameter("user_pass");
    boolean checked = false;
    boolean authorized = false;
    if ( (name != null) && (pass != null) ) {
        authorized = user.authenticate(name, pass);
        checked = true;
    }
    if (authorized) {
%>
    <jsp:setProperty name="user" property="login" value="true" />
<%
        response.sendRedirect(user.getPageTo());
    }
%>
  <core:if test="${(param.submitted=='submit') && (param.user_pass=='')}" >
    <div style="">
      ユーザ名またはパスワードが間違っています。<br />
      正しいユーザ名とパスワードを入力してください。
    </div>
  </core:if>
<%
    if (checked && !authorized) {
%>
    <div style="">
      認証に失敗しました。
    </div>
<%
    }
%>

  <form action="<%=request.getRequestURI()%>" method="Post">
    <input type="hidden" name="submitted" value="submit" />
    <dl>
      <dt>ユーザ名</dt>
      <dd>
        <input type="text" name="user_name" size="20" />
        <core:if test="${(param.submitted=='submit') && (param.user_name=='')}" >
          名前(ログイン名)を入力してください。
        </core:if>
      </dd>
      <dt>パスワード</dt>
      <dd>
        <input type="password" name="user_pass" size="40" maxlength="40" />
        <core:if test="${(param.submitted=='submit') && (param.user_pass=='')}" >
          パスワードを入力してください。
        </core:if>
      </dd>
    </dl>
    <input type="submit" value="送信" />
  </form>
  <a href="<%=user.getPageFrom()%>" />戻る</a>
  <test:footer />
</body>
</html>
 呼ぶときは、
<%
    user.setPageFrom(request.getRequestURI());
    user.setPageTo(request.getRequestURI());
%>
    <a href="<%=request.getContextPath()%>/common/login.jsp">[ログインする]</a>
ってな感じになります。
投稿:KILROY[KILROY]/2007年 04月 19日 14時 27分 /更新:2007年 04月 26日 07時 52分