昨今 Struts というのが流行っている、らしい。
フレームワークの有効性だとか何だとかいろいろ議論はあるのですがね、ぶっちゃけ「フォームの入力チェック部分が JavaScript ではなく Java で書ける」っていうのが、最大のメリットだと評価されているんだろうと思う。
ええ、発想としては面白いですよ、確かに。だけど、ぶっちゃけ面倒臭い。
Struts だと、
フォームの飛び先をサーブレットで受ける→コンテキストからデータを引っ張ってきて Form から送られたデータを JavaBeans (いわゆる FormBean )に格納する→ Beans の中で入力チェックを行なう。→結果(終了ステータス)によってどこのページに飛ぶかを( struts_config.xml ファイルの内容から)判断する。
ということをやっているのですが、これ、何か修正しようとするとあっちゃこっちゃ影響が出てウザいったらありゃしない。
入力フォームがあらゆるページにあるような在庫管理システムとかならともかく、中規模・小規模のシステムに本当に 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>
呼ぶときは、<!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>
ってな感じになります。 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分