Top / Struts / TIPS集

プロパティは保持される

<html:text property="userid" />

は画面が切り替わってもパラメータが保持されてますよね。
パラメータの操作(setAttribute)などをしなくても、入力値が保持されるんですね。

bean:write

<bean:write name="username"/>

はxxxx.getAttribute("username") して取得したインスタンスのtoString()を画面に書き出すみたいです。*1

logic:present

<logic:present name="username">
  <bean:write name="username"/>
</logic:present>

というようにlogic:presentで囲まないとusernameがコンテキストにないときにエラーになってしまいます。ようするにxxx.getAttribute("username");がnullかどうかをチェックするためのイディオムです。

bean:define

<bean:define id="user_name" name="username"/>
<%=user_name%>

とすると、

user_name = xxx.getAttribute(username);

といったことが行われます。つまり、スコープからインスタンスを(name属性の名称で)取り出し、(idで指定した文字列の)変数を定義します。

bean:size

<bean:size id="count" name="username" />
<bean:write name="count"/>
<%=count%>

とすると、

int count = xxx.getAttribute(username).size();

みたいなことが行われます。つまり、スコープからインスタンスを取り出し、それがCollectionの場合に要素数を返します。*2

クエリを追加する

<html:link action="/execute" paramId="userid" paramName="userID">検索</html:link>

ってやると、

execute.do?userid=[userIDの値]

となる。userIDってのはxxx.getAttribute("userID");のこと(確か)。

logic:empty

<logic:empty name="userid">

は..。なんだっけ?

ApplicationResources?.properties にアクセスする

<bean:message key="app.title"/>

タグをxhtmlに対応する

デフォルトでは、Strutsのタグはxhmlに対応していない(閉じタグとか)。

<html:html xhtml="true">

とすることで、xhtml形式のタグを出力します。

初期アクセスのパラメタエラーを回避する

たとえば何かを検索する画面(JSP)で、最初にその画面を開いたときは検索パラメータがのってませんよね。検索パラメータを画面に表示している場合、最初のアクセスだけエラーにならないようなロジックが必要になりそうですが、こんな回避法がありました。何のことはない、パラメタチェックを入れているだけですが、こんな感じでやるとキレイになりますね。

こちらは検索側の記述
<html:form action="/search">
  <html:text property="input" />
  <html:submit>送信</html:submit>
</html:form>
こちらが表示側の記述
<logic:present name="input">
 入力値: <bean:write name="input" />
</logic:present>

ちなみに、下のinputはrequest.getParameter("input");ではなく、xxxx.getAttribute("input")*3;であることに注意。

サンプル

struts-config.xml

<form-beans>
	<form-bean name="testForm" 
	type="org.apache.struts.action.DynaActionForm">
		<form-property name="name" type="java.lang.String" />
		<form-property name="word" type="java.lang.String" />
	</form-bean>
</form-beans>

<action-mappings>
	<action name="testForm" path="/test" scope="request" 
	type="kino.action.TestAction">
		<forward name="success" path="/WEB-INF/jsp/Test.jsp">
		</forward>
	</action>
</action-mappings>

につき

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
<HEAD>
<%@ page 
language="java"
contentType="text/html; charset=SHIFT_JIS"
pageEncoding="SHIFT_JIS"
%>
<META http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
<META name="GENERATOR" content="IBM WebSphere Studio">
<TITLE>Test.jsp</TITLE>
</HEAD>

<BODY>
<html:form action="/test">
	<html:text property="name" />
	<br />
	<html:text property="word" />
	<html:submit>送信</html:submit>
</html:form>

<logic:present name="name">
	<bean:write name="name" />
</logic:present>
<br />
<logic:present name="word">
	<bean:write name="word" />
</logic:present>
</BODY>
</html:html>

この記事は

選択肢 投票
おもしろかった 1  
そうでもない 0  

#navi(contents-page-name): No such page: Java/Struts

現在のアクセス:75977


*1 よく、html:textで指定したプロパティをwriteしようとしてエラーを出しました。ややこしいですが、writeはコンテキストにセットされた属性、html:textはparameterですね
*2 bean:sizeはスコープからデータを取り出すだけでなく、idで指定した文字列で変数とPageContext?に値をセットします。
*3 xxxxはrequestとか、sessionとかいろいろ

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS