With a single step

~千里の道も一歩からと信じたいノート~

セッションスコープのアクションフォーム

今日はSAStrutsチュートリアルのセッションスコープを学ぶ。
。。。( ̄△ ̄;)エッ・・?
本家のサイトに説明ないのね。。。

sastruts.seasar.org

ということで、本家のサイトを当てにするのはやめる

ソース

index.jsp
<%@page pageEncoding="UTF-8"%>
<html>
<head>
<title>Tutorial: Session index</title>
<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />
</head>
<body>

<h1>Tutorial: Session index</h1>
<html:errors/>
<s:form>
First:<html:text property="first"/><br />
<input type="submit" name="goSecond" value="Secondへ"/>
</s:form>
</body>
</html>
second.jsp
<%@page pageEncoding="UTF-8"%>
<html>
<head>
<title>Tutorial: Session second</title>
<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />
</head>
<body>

<h1>Tutorial: Session second</h1>

<html:errors/>
<s:form>
<table>
<tr><td>First</td><td>${f:h(first)}</td></tr>
<tr><td>Second</td><td><html:text property="second"/></td></tr>
</table>
<input type="submit" name="goThird" value="Thirdへ"/>
<input type="submit" name="index" value="戻る"/>
</s:form>
</body>
</html>
third.jsp
<%@page pageEncoding="UTF-8"%>
<html>
<head>
<title>Tutorial: Session third</title>
<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />
</head>
<body>

<h1>Tutorial: Session third</h1>

<s:form>
<table>
<tr><td>First</td><td>${f:h(first)}</td></tr>
<tr><td>Second</td><td>${f:h(second)}</td></tr>
</table><br />
<input type="submit" name="backSecond" value="戻る"/>
<input type="submit" name="clear" value="クリアして最初の画面へ"/>
</s:form>
</body>
</html>
SessionAction.java
package tutorial.action;

import javax.annotation.Resource;

import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

import tutorial.form.SessionForm;

public class SessionAction {

	@ActionForm
	@Resource
	protected SessionForm sessionForm;

	@Execute(validator = false)
	public String index() {
		return "index.jsp";
	}

	@Execute(input = "index.jsp")
	public String goSecond() {
	    return "second.jsp";
	}

	@Execute(input = "second.jsp")
	public String goThird() {
	    return "third.jsp";
	}

	@Execute(validator = false)
	public String backSecond() {
		return "second.jsp";
	}

	@Execute(validator = false, removeActionForm = true)
	public String clear() {
		return "index.jsp";
	}
}
SessionForm.java
package tutorial.form;

import java.io.Serializable;

import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;
import org.seasar.struts.annotation.Required;

@Component(instance = InstanceType.SESSION)
public class SessionForm implements Serializable {

	private static final long serialVersionUID = 1L;

	@Required
	public String first;

	@Required(target = "goThird")
	public String second;
}

ポイント

・${}
・f:h()
・@Component(instance = InstanceType.SESSION)
・removeActionForm属性
・implements Serializable
・private static final long serialVersionUID = 1L;
・@Resouse
・protected

${}

これに関しては、セッションスコープに登録したオブジェクトのフィールドを参照しているのわかるけど、
「名前何だっけ?」
状態だったので、振り返る。
qiita.com

f:h()

SAStruts 入門
なるほど、HTMLエスケープを行うためね(。 ・ω・))フムフム
エスケープって何(゚Д゚ll)???
viral-community.com
あ~、サニタイジングのことね( ̄▽ ̄)
ただ、頭では理解しているつもりだけど、サニタイジングしないと実際にどうなるかは試したこと無い。やってみよう。

f:h()使用の場合(サニタイジングしている場合)

ボタン押下前
f:id:who_is_unfair:20160702214650p:plain
ボタン押下後
f:id:who_is_unfair:20160702215416p:plain
入力内容が正常に表示されていることがわかる。
念のため、Chromeの開発ツールを確認。
f:id:who_is_unfair:20160702215521p:plain
正常ですね。

f:h()未使用の場合(サニタイジングしない場合)

ボタン押下前
f:id:who_is_unfair:20160702214650p:plain
ボタン押下後
f:id:who_is_unfair:20160702215621p:plain
なんかおかしな事になっとる。
Chromeの開発ツールを確認。
f:id:who_is_unfair:20160702220413p:plain
やはり、異常事態発生。
タグが埋め込まれてる。
サニタイジングの本来の目的とは違う検証だが、
これだけでも、サニタイジングすることが
大切であることを確認できた。

@Component(instance = InstanceType.SESSION)

d.hatena.ne.jp
ActionFormのスコープをデフォルトのrequestから、sessionに変更したい場合
に利用するのね。

removeActionForm属性

d.hatena.ne.jp
セッションからActionFormを削除する場合に利用するのね。

implements Serializable

シリアライズ : kei@sodan
正直、チンブンカンプンだったため、非常に勉強になった。
シリアライズって内部的にどんなことをしてるの?
→メモリ上のオブジェクトをバイト列 (ストリーム) にする
そもそも何のためにやってるの?
→、ネットワークを通じて離れたマシンとデータをやりとりする時や、データをファイルに保存する時etc

private static final long serialVersionUID = 1L;

d.hatena.ne.jp
これに関しては、もう少し勉強する必要がありそう。
役割は理解できたが、コメント者の情報が気になる。

@Resouse

tomame0se.blog.shinobi.jp
わかったような、わからないような、DI対象のものね。。。(´・ω・`)
dev.classmethod.jp
Springの話だが、これが一番DIについて理解しやすい気がする^_^

protected

d.hatena.ne.jp
なぜ、SessionFormがprotectedなのか調べてみたら、
どうも、DI用のフィールドは、protectedにして、@Resourceをつけることが推奨らしい。