2008年11月28日金曜日

偽善とか自己満足という言葉が気になっていた

気になりますよね。え?気にしたことなんかないって?そうか・・・私だけか。時々妙に「自己満足?偽善?」って考えこんじゃうんだけどな。

確かに青臭い同士学生の議論じゃあるまいし、大人になってしまえば「それはお前の自己満足だ」とか「偽善だ」などと決め付けられる機会も滅多にありませんね。それにたとえ他人から決め付けられるても「それがどーした」「ほっとけ」で済みます。オレが満足しようがしまいがお前の知ったことか。2ちゃんかどこかの標語にありましたが「しない善よりする偽善」。客観的な成果がでればいいじゃないか。だいたいお前には善が分かっているのか。お前はブッシュ大統領か、と。

そもそも、「自己満足」と「偽善」という言葉を平然と並べているが、関係あるのか、と。一括りにして語る意味があるのか。そんな声も聞こえてきそうです。

う~ん。そのとおりかもしれません。でも引っかかる。昔から幾度か反芻させられてきた言葉なんです。非難と若干の責める側の優越感を漂わせたこの言葉。「自己満足で終わってないか?」「それは偽善じゃないのか?」

なぜそれほどまでにこの言葉に引っかかるんだろう。ちょっと考えてみました。

両者の共通点って何だろう。

それはこれらの言葉が二つとも、その程度で満足していいのか、それでいいと思っているのか、と人に根底的に問いかける意図を持って発せられる、まずはそこが共通する点であるように思えます(言葉の裏にひそむ悪意や揶揄は考えないことにしましょう。ストレートに問いかけられたとします)。

お前の人生それでいいのか?大きなお世話だといえばその通りですが、私はふと足を止めて考えてしまう。俺はこれまで正しいことをしてきたのだろうか。これでよかったのか?でも次の瞬間にその問いを忘れてしまう。今日中に完了しなければならない仕事がある。あるいは子供が呼んでいる。一時的に私はその問いを忘れてしまう。でも忘れたつもりでもその問いは心の奥深くに沈殿し、再び浮かび上がる機会をじっと待っている。

お前の人生それでいいのか?実に青臭い問いかけです。あるいは人生を知らない浅い問いなのかもしれません。昔は常に自問していたような気がします。これでいいんだろうか。俺は何をしたいんだろうか。何をすべきなんだろうか。でも年を取るにつれてそんな問いは忘れていった。仕事も収入もあり、養うべき家族もいる。いまさら根本的に反省する必要などない。それより日々働いて家族と暮らすので精一杯。

希望や挫折や将来の不安で押しつぶされそうになりつつ、何ごとかを成し遂げたいと考えていたかつての自分。むやみに焦り、イライラとしながら周りを軽蔑し、でも何が出来るわけでもなく独り悶々と過ごしていた昔の"俺"。そんな"俺"が今の私を見たら何と言うだろうか。今の人生でいいのか。それでお前は本当に良かったのか。そんなふうに厳しく問い詰めてくるのかもしれません。

昔の自分と今の自分が顔を見合わせたとき、恥ずかしそうに去って行くのは今の"私"の方なのでしょうか。それとも昔の"俺"?

「自己満足」とか「偽善」という言葉を聞くと、かつての青臭い自分を思い出すような気がする。それがこの言葉が引っかかる理由なのかも知れません。

生きて行くために失われるもの。それは失われる必然性があったのか、それとも失われるべきではなかったのか。

死ぬときに自分の人生を肯定できれば、それでいい。そんな気がします。
.

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(11)

値をサーバ側で取得します。

1. ListBeanに選択された値を扱う変数と処理を追加します。
2. list.jspを編集します(変数の追加・送信ボタンの追加)。
3. faces-config.xmlに画面遷移定義を追加します。

1. ListBeanに選択された値を扱う変数と処理を追加
package test.beans;

import java.util.List;

import javax.ejb.EJB;

import test.MySample;
import test.MySampleSessionLocal;

public class ListBean {
private static final long serialVersionUID = 1L;

List<MySample> mySamples = null;
// Stringにしないとエラーが出ます。理由はよく分かりません・・・
private String selectedIndex = null;

public String getSelectedIndex() {
return selectedIndex;
}

public void setSelectedIndex(String selectedIndex) {
this.selectedIndex = selectedIndex;
}

@EJB(name="MySample")
private MySampleSessionLocal mySampleSession;

public List<MySample> getMySamples() {
// まあ二回くらい呼ばれたっていいでしょう
if (mySamples == null) {
try {
List<MySample> tmpList = mySampleSession.listMySamples();
setMySamples(tmpList);
} catch (Exception e) {
//
}
}
return mySamples;
}

private void setMySamples(List<MySample> mySamples) {
// 読み取り専用
this.mySamples = mySamples;
}

public String executeTest() {
System.out.println("Selected index -> " + selectedIndex);
return "success";
}

}

2. list.jspを編集
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@page
language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="/WEB-INF/tld/mysample.tld" prefix="custom"%>
<html>
<head>
<title>list</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
</head>
<body>
<h2>リスト MySample</h2>
<f:view>
<h:form>
<h:dataTable value="#{listBean.mySamples}" var="item" border="1">
<h:column>
<f:facet name="header">
<h:outputText value="Select" />
</f:facet>
<custom:radioButton id="myRadioId1" name="myRadioCol"
overrideName="true" value="#{listBean.selectedIndex}"
itemValue="#{item.myid}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="ID" />
</f:facet>
<f:verbatim>id: </f:verbatim>
<h:outputText value="#{item.myid}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="VAL" />
</f:facet>
<f:verbatim>value: </f:verbatim>
<h:outputText value="#{item.myFlag}" />
</h:column>
</h:dataTable>
<h:commandButton value="実行"
action="#{listBean.executeTest}" />
</h:form>
</f:view>
</body>
</html>

3. faces-config.xmlに画面遷移定義を追加
 <navigation-rule>
<from-view-id>list.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>list.jsp</to-view-id>
</navigation-case>
</navigation-rule>

以上。
.

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(10)

一覧表示した行を、ラジオボタンで選択できるようにします。
残念ながらカスタムタグを開発する必要があります。
(JSTLでもこの手の実装に苦労した記憶が・・・どうして標準の機能に無いんだろう??)

以下のページを参考にしました。というか、一部型のエラーが出たりしたので、変数をStringからObjectに変更してtoString()してますが、ほとんどそのまんまです。(感謝)

※RAD環境ではweb.xmlへのtaglib要素の追加は不要でした。web-app_2_5.xsdだから?よく分かってません。

Group radio buttons inside a JSF dataTable component
Write a custom JSF tag for enhancing radio button behavior
By Srijeeb Roy, JavaWorld.com, 02/27/07
(JAVAWORLD)
http://www.javaworld.com/javaworld/jw-02-2007/jw-02-jsf.html

ずいぶんとdeprecatedになってしまっているようですが、Webをダラダラ調べたところ、気にせず使うのが一番いいみたい。まだこれといった代替方法は確立されていないようです。

■準備
MySampleJSFの中にそのまま作ってもよいのですが、jarに分けたほうがカッコよいのでユーティリティ・モジュールプロジェクトとして作成します。

まずファイル > 新規 > その他 > 新規Javaユーティリティ・モジュールプロジェクト > "MySampleCTG" を作成。

MySampleJSF のプロパティを開き、Java EE モジュール依存関係 > Webライブラリータブ(J2EEモジュールではなく)を開いてMySampleCTGにチェックを入れます。

準備完了。

■カスタムタグの作成
以下のステップが必要です。結構大変ですね。

1. 以下の三つのクラスを作成します。
1-1. コンポーネント クラス(MySampleCTGプロジェクトに作成)
1-2. レンダー クラス(同上)
1-3. カスタム・タグ クラス(同上)
2. TLDファイルを作成します。(MySampleJSFプロジェクトに作成。MySampleCTGのMETA-INFではうまく行きませんでした)
3. faces-config.xmlにコンポーネント要素を追加します。(同上)
4. jspにタグを書きます。(同上)

1-1. コンポーネントクラス(UICustomSelectOneRadio)
package test.ctg;

import javax.el.ValueExpression;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;

public class UICustomSelectOneRadio extends UIInput {

// 1. 属性をクラス変数として定義
private String name = null;
private String overrideName = null;
private String styleClass = null;
private String style = null;
private String disabled = null;
private String itemLabel = null;
private Object itemValue = null;
private String onClick = null;
private String onMouseOver = null;
private String onMouseOut = null;
private String onFocus = null;
private String onBlur = null;

// 2. 動的に属性を取得するためのメソッドを定義
public String returnValueBindingAsString(String attr) {
// サンプルコードは一部Deprecatedだったので適宜変更しています。
ValueExpression valueExpression = getValueExpression(attr);
if (valueExpression != null) {
return valueExpression.getValue(this.getFacesContext()
.getELContext()).toString();
} else {
return null;
}
}

// 3. setter, getterを定義. getterでreturnValueBindingAsStringを使っている
// ので注意
public String getName() {
if (name != null) {
return name;
}
return returnValueBindingAsString("name");

}

public void setName(String name) {
this.name = name;
}

public String getOverrideName() {
if (overrideName != null) {
return overrideName;
}
return returnValueBindingAsString("overrideName");
}

public void setOverrideName(String overrideName) {
this.overrideName = overrideName;
}

public String getStyleClass() {
if (styleClass != null) {
return styleClass;
}
return returnValueBindingAsString("styleClass");
}

public void setStyleClass(String styleClass) {
this.styleClass = styleClass;
}

public String getStyle() {
if (style != null) {
return style;
}
return returnValueBindingAsString("style");
}

public void setStyle(String style) {
this.style = style;
}

public String getDisabled() {
if (disabled != null) {
return disabled;
}
return returnValueBindingAsString("disabled");
}

public void setDisabled(String disabled) {
this.disabled = disabled;
}

public String getItemLabel() {
if (itemLabel != null) {
return itemLabel;
}
return returnValueBindingAsString("itemLabel");
}

public void setItemLabel(String itemLabel) {
this.itemLabel = itemLabel;
}

public Object getItemValue() {
if (itemValue != null) {
return itemValue;
}
return returnValueBindingAsString("itemValue");
}

public void setItemValue(Object itemValue) {
this.itemValue = itemValue;
}

public String getOnClick() {
if (onClick != null) {
return onClick;
}
return returnValueBindingAsString("onClick");
}

public void setOnClick(String onClick) {
this.onClick = onClick;
}

public String getOnMouseOver() {
if (onMouseOver != null) {
return onMouseOver;
}
return returnValueBindingAsString("onMouseOver");
}

public void setOnMouseOver(String onMouseOver) {
this.onMouseOver = onMouseOver;
}

public String getOnMouseOut() {
if (onMouseOut != null) {
return onMouseOut;
}
return returnValueBindingAsString("onMouseOut");
}

public void setOnMouseOut(String onMouseOut) {
this.onMouseOut = onMouseOut;
}

public String getOnFocus() {
if (onFocus != null) {
return onFocus;
}
return returnValueBindingAsString("onFocus");
}

public void setOnFocus(String onFocus) {
this.onFocus = onFocus;
}

public String getOnBlur() {
if (onBlur != null) {
return onBlur;
}
return returnValueBindingAsString("onBlur");
}

public void setOnBlur(String onBlur) {
this.onBlur = onBlur;
}

// 4. restoreStateとsaveStateメソッドを実装します。
@Override
public void restoreState(FacesContext context, Object state) {
Object[] values = (Object[]) state;
super.restoreState(context, values[0]);
styleClass = (String) values[1];
style = (String) values[2];
disabled = (String) values[3];
itemLabel = (String) values[4];
itemValue = (String) values[5];
onClick = (String) values[6];
onMouseOver = (String) values[7];
onMouseOut = (String) values[8];
onFocus = (String) values[9];
onBlur = (String) values[10];
name = (String) values[11];
overrideName = (String) values[12];
}
@Override
public Object saveState(FacesContext context) {
Object[] values = new Object[13];
values[0] = super.saveState(context);
values[1] = styleClass;
values[2] = style;
values[3] = disabled;
values[4] = itemLabel;
values[5] = itemValue;
values[6] = onClick;
values[7] = onMouseOver;
values[8] = onMouseOut;
values[9] = onFocus;
values[11] = name;
values[12] = overrideName;
return (values);
}

// 5. getFamilyを実装します。faces-config.xmlにこの名前を指定します。
@Override
public String getFamily() {
return ("CustomSelectOneRadio");
}
}

次はレンダークラス(HTMLCustomSelectOneRadioRenderer)です。
package test.ctg;

import java.io.IOException;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.component.UIData;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;

public class HTMLCustomSelectOneRadioRenderer extends Renderer {

@SuppressWarnings("unchecked")
@Override
public void decode(FacesContext context, UIComponent component) {
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
UICustomSelectOneRadio aUICustomSelectOneRadio = null;
if (component instanceof UICustomSelectOneRadio) {
aUICustomSelectOneRadio = (UICustomSelectOneRadio) component;
} else {
return;
}
Map map = context.getExternalContext().getRequestParameterMap();
String name = getName(aUICustomSelectOneRadio, context);
if (map.containsKey(name)) {
String value = map.get(name).toString();
if (value != null) {
setSubmittedValue(component, value);
}
}
}

public void setSubmittedValue(UIComponent component, Object obj) {

if (component instanceof UIInput) {
((UIInput) component).setSubmittedValue(obj);
}
}

private String getName(UICustomSelectOneRadio aUICustomSelectOneRadio,
FacesContext context) {

UIComponent parentUIComponent = getParentDataTableFromHierarchy(aUICustomSelectOneRadio);
if (parentUIComponent == null) {
return aUICustomSelectOneRadio.getClientId(context);
} else {
if (aUICustomSelectOneRadio.getOverrideName() != null
&& aUICustomSelectOneRadio.getOverrideName().equals("true")) {
return aUICustomSelectOneRadio.getName();
} else {
String id = aUICustomSelectOneRadio.getClientId(context);
int lastIndexOfColon = id.lastIndexOf(":");
String partName = "";
if (lastIndexOfColon != -1) {
partName = id.substring(0, lastIndexOfColon + 1);
if (aUICustomSelectOneRadio.getName() == null) {
partName = partName + "generatedRad";
} else
partName = partName + aUICustomSelectOneRadio.getName();
}
return partName;
}
}
}

private UIComponent getParentDataTableFromHierarchy(UIComponent uiComponent) {
if (uiComponent == null) {
return null;
}
if (uiComponent instanceof UIData) {
return uiComponent;
} else {
// try to find recursively in the Component tree hierarchy
return getParentDataTableFromHierarchy(uiComponent.getParent());
}
}

@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
if ((context == null) || (component == null)) {
throw new NullPointerException();
}

UICustomSelectOneRadio aUICustomSelectOneRadio = (UICustomSelectOneRadio) component;

if (component.isRendered()) {
ResponseWriter writer = context.getResponseWriter();

writer.write("<input type=\"radio\"");

writer.write(" id=\"" + component.getClientId(context) + "\"");
writer.write(" name=\"" + getName(aUICustomSelectOneRadio, context)
+ "\"");
if (aUICustomSelectOneRadio.getStyleClass() != null
&& aUICustomSelectOneRadio.getStyleClass().trim().length() > 0) {
writer
.write(" class=\""
+ aUICustomSelectOneRadio.getStyleClass()
.trim() + "\"");
}
if (aUICustomSelectOneRadio.getStyle() != null
&& aUICustomSelectOneRadio.getStyle().trim().length() > 0) {
writer.write(" style=\""
+ aUICustomSelectOneRadio.getStyle().trim() + "\"");
}
if (aUICustomSelectOneRadio.getDisabled() != null
&& aUICustomSelectOneRadio.getDisabled().trim().length() > 0
&& aUICustomSelectOneRadio.getDisabled().trim().equals(
"true")) {
writer.write(" disabled=\"disabled\"");
}
if (aUICustomSelectOneRadio.getItemValue() != null) {
writer.write(" value=\""
+ aUICustomSelectOneRadio.getItemValue().toString().trim() + "\"");
}
if (aUICustomSelectOneRadio.getOnClick() != null
&& aUICustomSelectOneRadio.getOnClick().trim().length() > 0) {
writer.write(" onclick=\""
+ aUICustomSelectOneRadio.getOnClick().trim() + "\"");
}
if (aUICustomSelectOneRadio.getOnMouseOver() != null
&& aUICustomSelectOneRadio.getOnMouseOver().trim().length() > 0) {
writer.write(" onmouseover=\""
+ aUICustomSelectOneRadio.getOnMouseOver().trim()
+ "\"");
}
if (aUICustomSelectOneRadio.getOnMouseOut() != null
&& aUICustomSelectOneRadio.getOnMouseOut().trim().length() > 0) {
writer
.write(" onmouseout=\""
+ aUICustomSelectOneRadio.getOnMouseOut()
.trim() + "\"");
}
if (aUICustomSelectOneRadio.getOnFocus() != null
&& aUICustomSelectOneRadio.getOnFocus().trim().length() > 0) {
writer.write(" onfocus=\""
+ aUICustomSelectOneRadio.getOnFocus().trim() + "\"");
}
if (aUICustomSelectOneRadio.getOnBlur() != null
&& aUICustomSelectOneRadio.getOnBlur().trim().length() > 0) {
writer.write(" onblur=\""
+ aUICustomSelectOneRadio.getOnBlur().trim() + "\"");
}

if (aUICustomSelectOneRadio.getValue() != null
&& aUICustomSelectOneRadio.getValue().equals(
aUICustomSelectOneRadio.getItemValue())) {
writer.write(" checked=\"checked\"");
}
writer.write(">");
if (aUICustomSelectOneRadio.getItemLabel() != null) {
writer.write(aUICustomSelectOneRadio.getItemLabel());
}
writer.write("</input>");
}
}
}

■カスタム・タグクラス(HTMLCustomSelectOneRadioTag)
package test.ctg;

import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;
import javax.faces.component.UIComponent;
import javax.faces.el.ValueBinding;
import javax.faces.webapp.UIComponentELTag;
import javax.faces.webapp.UIComponentTag;

public class HTMLCustomSelectOneRadioTag extends UIComponentELTag {

public HTMLCustomSelectOneRadioTag() {
name = null;
value = null;
styleClass = null;
style = null;
disabled = null;
itemLabel = null;
itemValue = null;
onClick = null;
onMouseOver = null;
onMouseOut = null;
onFocus = null;
onBlur = null;
overrideName = null;
}

public String getDisabled() {
return disabled;
}

public String getItemLabel() {
return itemLabel;
}

public String getItemValue() {
return itemValue;
}

public String getName() {
return name;
}

public String getOnBlur() {
return onBlur;
}

public String getOnClick() {
return onClick;
}

public String getOnFocus() {
return onFocus;
}

public String getOnMouseOut() {
return onMouseOut;
}

public String getOnMouseOver() {
return onMouseOver;
}

public String getOverrideName() {
return overrideName;
}

public String getStyle() {
return style;
}

public String getStyleClass() {
return styleClass;
}

public String getValue() {
return value;
}

public void setDisabled(String string) {
disabled = string;
}

public void setItemLabel(String string) {
itemLabel = string;
}

public void setItemValue(String string) {
itemValue = string;
}

public void setName(String string) {
name = string;
}

public void setOnBlur(String string) {
onBlur = string;
}

public void setOnClick(String string) {
onClick = string;
}

public void setOnFocus(String string) {
onFocus = string;
}

public void setOnMouseOut(String string) {
onMouseOut = string;
}

public void setOnMouseOver(String string) {
onMouseOver = string;
}

public void setOverrideName(String string) {
overrideName = string;
}

public void setStyle(String string) {
style = string;
}

public void setStyleClass(String string) {
styleClass = string;
}

public void setValue(String string) {
value = string;
}

protected void setProperties(UIComponent component) {
super.setProperties(component);
UICustomSelectOneRadio aUICustomSelectOneRadio =
(UICustomSelectOneRadio) component;
if (name != null) {
if (UIComponentTag.isValueReference(name)) {
aUICustomSelectOneRadio.setValueBinding("name",
getValueBinding(name));
} else {
aUICustomSelectOneRadio.getAttributes().put("name", name);
}
}
if (value != null)
if (UIComponentTag.isValueReference(value))
aUICustomSelectOneRadio.setValueBinding("value",
getValueBinding(value));
else
aUICustomSelectOneRadio.getAttributes().put("value", value);
if (styleClass != null)
if (UIComponentTag.isValueReference(styleClass))
aUICustomSelectOneRadio.setValueBinding("styleClass",
getValueBinding(styleClass));
else
aUICustomSelectOneRadio.getAttributes().put("styleClass",
styleClass);
if (style != null)
if (UIComponentTag.isValueReference(style))
aUICustomSelectOneRadio.setValueBinding("style",
getValueBinding(style));
else
aUICustomSelectOneRadio.getAttributes().put("style", style);
if (disabled != null)
if (UIComponentTag.isValueReference(disabled))
aUICustomSelectOneRadio.setValueBinding("disabled",
getValueBinding(disabled));
else
aUICustomSelectOneRadio.getAttributes().put("disabled",
disabled);
if (itemLabel != null)
if (UIComponentTag.isValueReference(itemLabel)) {
aUICustomSelectOneRadio.setValueBinding("itemLabel",
getValueBinding(itemLabel));
} else {
System.out.println("itemLabel=" + itemLabel);
aUICustomSelectOneRadio.getAttributes().put("itemLabel",
itemLabel);
}
if (itemValue != null)
if (UIComponentTag.isValueReference(itemValue))
aUICustomSelectOneRadio.setValueBinding("itemValue",
getValueBinding(itemValue));
else
aUICustomSelectOneRadio.getAttributes().put("itemValue",
itemValue);
if (onClick != null)
if (UIComponentTag.isValueReference(onClick))
aUICustomSelectOneRadio.setValueBinding("onClick",
getValueBinding(onClick));
else
aUICustomSelectOneRadio.getAttributes().put("onClick", onClick);
if (onMouseOver != null)
if (UIComponentTag.isValueReference(onMouseOver))
aUICustomSelectOneRadio.setValueBinding("onMouseOver",
getValueBinding(onMouseOver));
else
aUICustomSelectOneRadio.getAttributes().put("onMouseOver",
onMouseOver);
if (onMouseOut != null)
if (UIComponentTag.isValueReference(onMouseOut))
aUICustomSelectOneRadio.setValueBinding("onMouseOut",
getValueBinding(onMouseOut));
else
aUICustomSelectOneRadio.getAttributes().put("onMouseOut",
onMouseOut);
if (onFocus != null)
if (UIComponentTag.isValueReference(onFocus))
aUICustomSelectOneRadio.setValueBinding("onFocus",
getValueBinding(onFocus));
else
aUICustomSelectOneRadio.getAttributes().put("onFocus", onFocus);
if (onBlur != null)
if (UIComponentTag.isValueReference(onBlur))
aUICustomSelectOneRadio.setValueBinding("onBlur",
getValueBinding(onBlur));
else
aUICustomSelectOneRadio.getAttributes().put("onBlur", onBlur);
if (overrideName != null)
if (UIComponentTag.isValueReference(overrideName))
aUICustomSelectOneRadio.setValueBinding("overrideName",
getValueBinding(overrideName));
else
aUICustomSelectOneRadio.getAttributes().put("overrideName",
overrideName);
}

public ValueBinding getValueBinding(String valueRef) {
ApplicationFactory af = (ApplicationFactory) FactoryFinder
.getFactory("javax.faces.application.ApplicationFactory");
Application a = af.getApplication();
return a.createValueBinding(valueRef);
}

private String name;
private String value;
private String styleClass;
private String style;
private String disabled;
private String itemLabel;
private String itemValue;
private String onClick;
private String onMouseOver;
private String onMouseOut;
private String onFocus;
private String onBlur;
private String overrideName;

@Override
public String getComponentType() {
return "component.CustomSelectOneRadio";
}

@Override
public String getRendererType() {
return "renderer.CustomSelectOneRadio";
}
}

2. mysample.tldファイルです。
/WEB-INF/tldに置いてください。
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>
<!-- ============== Tag Library Description Elements ============= -->
<tlib-version>0.03</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Custom JavaServerFaces Framework Tag Library</short-name>
<uri>http://www.srijeeb.com/jsf/tags-html</uri>
<tag>
<name>radioButton</name>
<tag-class>test.ctg.HTMLCustomSelectOneRadioTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>overrideName</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>id</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>value</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>styleClass</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>style</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>disabled</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>rendered</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>Boolean</type>
</attribute>
<attribute>
<name>itemLabel</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>itemValue</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>onClick</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>onMouseOver</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>onMouseOut</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>onFocus</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>onBlur</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
</tag>
</taglib>

重要:TLDファイルをMySampleCTG/src/META-INF配下に置いたらうまく動きませんでした。web.xmlとかJSPをいろいろいじってみたのですがダメでした。

エラー例)
com.ibm.ws.jsp.inputsource.JspInputSourceImpl JspInputSourceImpl Failed to create inputsource contextURL =[file:/C:/Documents and Settings/user_name/IBM/rationalsdp/workspace/MySampleJSF/WebContent/ relativeURL =[http://www.srijeeb.com/jsf/tags-html]
java.net.MalformedURLException
at java.net.URL.<init>(URL.java:601)
...

おそらくそれと関連してると思われるのですが、WASテスト環境の調子も悪くなりました。
[08/11/27 13:14:21:000 JST] 0000001e annotations E ArchiveInputStreamData iterate unable to open file iterator
java.util.zip.ZipException: ZipFile closed
...のようなエラーが毎回出るようになった・WASの「公開」プロセスが0%のまま進まない、など。

ユーティリティプロジェクトは動作が怪しいですね。はっきり言って使わないほうがいいと思います。(昔のWSADでも動作が怪しかった記憶があります)
重要:ClassNotFoundエラーが出たら、MySampleCTGフォルダを右クリック Java EE > EARライブラリの更新 をしたら直ることがあります。MySampleCTG配下を編集したら「EARライブラリの更新」を実行するようにしましょう。

3. faces-config.xmlにコンポーネント要素を追加します。
以下の要素を追加してください。
 <component>
<component-type>component.CustomSelectOneRadio</component-type>
<component-class>test.ctg.UICustomSelectOneRadio
</component-class>
<component-extension>
<component-family>CustomSelectOneRadio</component-family>
<renderer-type>renderer.CustomSelectOneRadio</renderer-type>
</component-extension>
</component>
<render-kit>
<renderer>
<component-family>CustomSelectOneRadio</component-family>
<renderer-type>renderer.CustomSelectOneRadio</renderer-type>
<renderer-class>test.ctg.HTMLCustomSelectOneRadioRenderer
</renderer-class>
</renderer>
</render-kit>

4. jspにタグを書きます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@page
language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="/WEB-INF/tld/mysample.tld" prefix="custom"%>
<html>
<head>
<title>list</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
</head>
<body>
<h2>リスト MySample</h2>
<f:view>
<h:dataTable value="#{listBean.mySamples}" var="item" border="1">
<h:column>
<f:facet name="header">
<h:outputText value="Select" />
</f:facet>
<custom:radioButton id="myRadioId1" name="myRadioCol"
overrideName="true" value="#{item.myid}"
itemValue="#{item.myid}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="ID" />
</f:facet>
<f:verbatim>id: </f:verbatim>
<h:outputText value="#{item.myid}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="VAL" />
</f:facet>
<f:verbatim>value: </f:verbatim>
<h:outputText value="#{item.myFlag}" />
</h:column>
</h:dataTable>
</f:view>
</body>
</html>s

以上です。表示だけはできるようになったはず。
(やれやれ。何で標準機能にしないんだろう・・・)

次回、radioボタンで送信されたデータを取得します。
.

2008年11月27日木曜日

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(9)

今度はテーブルの内容を一覧表示します。

■EJB(MySampleSession)に一覧(java.util.List)を取得するメソッドを追加します。
    // List<MySample>のwarningを抑止しています。それ以外は来ないはずなので。
@SuppressWarnings("unchecked")
public List<MySample> listMySamples() throws MySampleException {
Query query = em.createQuery("select m from MySample m");
List<MySample> result = query.getResultList();
return result;

}

■Webプロジェクト(MySampleJSF)に、新規にListBeanを追加します。
package test.beans;

import java.util.List;

import javax.ejb.EJB;

import test.MySample;
import test.MySampleSessionLocal;

public class ListBean {
private static final long serialVersionUID = 1L;
/*
* JPA直は好きじゃないのですが今回はこれで。
*/
List<MySample> mySamples = null;

@EJB(name="MySample")
private MySampleSessionLocal mySampleSession;

public List<MySample> getMySamples() {
// nullチェックでは厳密にインスタンスの生成を制御できませんが、
// まあ二回くらい呼ばれたっていいでしょう
if (mySamples == null) {
try {
List<MySample> tmpList = mySampleSession.listMySamples();
setMySamples(tmpList);
} catch (Exception e) {
//
}
}
return mySamples;
}

private void setMySamples(List<MySample> mySamples) {
this.mySamples = mySamples;
}
}

■faces-config.xmlにmanagedBean要素を追加します。
  <managed-bean>
<managed-bean-name>listBean</managed-bean-name>
<managed-bean-class>test.beans.ListBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

■list.jspを新規に作成します。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@page
language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><html>
<head>
<title>list</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
</head>
<body>
<h2>リスト MySample</h2>
<f:view>
<h:dataTable value="#{listBean.mySamples}" var="item" border="1">
<h:column>
<f:verbatim>id: </f:verbatim>
<h:outputText value="#{item.myid}"/>
</h:column>
<h:column>
<f:verbatim>value: </f:verbatim>
<h:outputText value="#{item.myFlag}"/>
</h:column>
</h:dataTable>
</f:view>
</body>
</html>

今度は一覧表示にラジオボタンを追加したいのですが、これが大変なのです(<h:dataTable ..>と<h:selectOneMenu...>は入れ子にできないため・・・)。次回以降で挑戦してみます。

以上
.

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(8)

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(8)

手順

1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
5. JSFを作成
6. EJBに挿入メソッドを作成する
7. JSFを作成(挿入)
8. EJBに更新メソッドを作成する
9. JSFを作成(更新)
(前回)
10. EJBに削除メソッドを作成する
11. JSFを作成(削除)
(今回はここまで)
12. 未定。テーブルの内容の一覧表示とか

後は似たようなものです。どんどん行きます。

10. EJBに削除メソッドを作成する

■MySampleSessionにロジックを追加します。
    public void deleteMySample(int myid) throws MySampleException {
MySample target = this.findMySample(myid);
if (target == null) {
throw new MySampleException();
}
em.remove(target);
em.flush();
}

以上。UTCなどで動作確認することもできます。

11. JSFを作成(削除)

■MySampleBeanにロジックを追加します。
    public void deleteMySample(int myid) throws MySampleException {
MySample target = this.findMySample(myid);
if (target == null) {
throw new MySampleException();
}
em.remove(target);
em.flush();
}

JSPは全てこれまでのものを流用します。
■success.jspに削除ボタンを追加します。
Found bean.<br>
id -> ${ mySampleBean.id } <h:inputHidden value="#{mySampleBean.id}"/>
value -> <h:inputText value="#{mySampleBean.value}"/>
<br>
<h:commandButton value="更新"
action="#{mySampleBean.updateValue}" />
<h:commandButton value="削除"
action="#{mySampleBean.deleteValue}" />

■faces-config.xmlを編集します(削除が成功したら検索画面に戻ります)。
  <navigation-rule>
<from-view-id>success.jsp</from-view-id>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/WEB-INF/results/failure.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/WEB-INF/results/success3.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>del_failure</from-outcome>
<to-view-id>/WEB-INF/results/failure.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>del_success</from-outcome>
<to-view-id>/search.jsp</to-view-id>
</navigation-case>
</navigation-rule>

以上。
.

2008年11月26日水曜日

痛恨の片思い

一方的に仲良くしたい、親しみたいと思っていろいろアプローチしても、どうも相手のほうはその気になってくれないというか、うまく行かないということはよくありますが、私の場合、そのお相手は豚バラブロックの大きなかたまり肉でした。

昔からどうもこのほとんど脂身じゃねーかコノー、という巨大なかたまりに対しては、憎しみと共に愛情、あるいはほのかな憧れを抱いていたのです。憎たらしい脂身だけれども、いったいどうやったらこれを美味しく頂けるんだろう。スーパーでカナダ産やアメリカ産の豚バラブロック肉を見るにつけ、なんだか挑発されているような煽られているような気がしてならなかったのです。

妻は飽和脂肪酸とか動物性油脂や加工油脂とかを嫌がるので、ブロックだろうが薄切りだろうが豚バラ肉を嫌います。実は私だって脂身はさほど好きではない。豚ならバラよりヒレ肉。鳥ならモモ肉よりもムネやささみを好むほうです。しかしどうにもこの白い脂のかたまりは、私の本能を突き動かしてしょうがない。DNAレベルで揺さぶられている気すらしてしまう。

一部で話題の飽和脂肪酸。体によくないらしいけれども、沖縄では皮付きの豚ばら肉を泡盛で煮込んで黒糖としょうゆで煮付け、美味しい角煮を作っているらしい。つまり、沖縄では豚バラの角煮が食べられている。しかるに沖縄は長寿で有名である。すなわち豚バラの角煮を食べているにも関わらず、沖縄の人は長生きする。つまり、角煮を食べてもそれほど体に悪いことはないかしんない、という三段論法がここに成立するわけです。

昔テレビでやっていた「どっちの料理ショー」でも、よく肉からタラーリタラリと垂れる脂を見て歓声が上がっていたような気がします。しかも脂をたっぷり口に含んで「ジューシーで美味しい!」とか「甘~い」とか。脂舐めてうまいとは何ごとであるか、と半分怒りながらも見ていた私でしたが、豚ばら肉のレシピを見ると「最初にしっかり焼いて余分な脂を落とす」とか「酒を入れたお湯でしっかり茹でてから調理する」という記載があり「余分な脂が抜けて*サッパリした*美味しい豚バラの角煮」というものが存在しているかのように信じてしまい、いつかはそのような角煮を作って見たいものだ、などと考えていました。

で、一度作ってみたんですよ。もうしばらく昔になりますけど。しっかり焼いて脂も落としたし(60%くらいの大きさに縮まった)、味つけする前にお湯で1時間以上茹でたりもしました。でも、結果はやっぱり豚の脂。脂は脂。冷えるとにっちゃり。確かに美味しかったですけどね。でもニチャニチャ。

これに懲りてしばらくこの人には手を出さなかったんですが、またこの間また挑戦してみたのです。塩豚に。しかも塩豚を燻製にして自家製ベーコン を作ってみようと。よりによってというかアチャーという行為ですが、片思いから逃れられない私。恋は盲目です。

結論から言いますと、これが大失敗。いや、多分料理としては正当な手順でそこそこ正当な結果が得られたと思うんですが、その出来上がったものがまさに煙で燻されたしょっぱい豚脂。もう一口で勘弁って感じでした。頑張って半分ほど使いましたが、一週間ほど経過して消費できなかった残りは迷わずゴミ箱へダンクシュート。普段は食べ物を捨てるなんてことはしないんですよ。賞味期限+1、2日経過のものは平気だし、ものによっては味噌や塩に漬け込んで延命を図り、ちゃんと消費する性格です。食べ物は粗末にしたくない。でも塩豚の燻製はアウトでしたね。もう二度と作らない。

というわけで、ようやく豚バラの呪いから開放されたと思った私ですが、この前、業務用スーパーで巨大な豚バラかたまり肉(2,3kgもあろうかというやつ)を見かけて瞳孔を拡張しながら足を止めてしまいました。なんて懲りない私でしょうか。もう二度と自分で買うことはないでしょう。ないと思います。しかし、この豚バラのかたまりは、当分の間私を悩ませ続けるに違いない。巨大な生白いエロティックな脂肪の塊から目を離すことができないまま、私はそのように思ったのであります。

以上。
.

2008年11月25日火曜日

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(7)

手順

1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
5. JSFを作成
6. EJBに挿入メソッドを作成する
7. JSFを作成(挿入)
8. EJBに更新メソッドを作成する
(前回)
9. JSFを作成(更新)
(今回はここまで)
10. EJBに削除メソッドを作成する
11. JSFを作成(削除)

9. JSFを作成(更新)

JSFに更新ページを作成します。

■MySampleBeanにロジックを追加します。
 public String updateValue() {
try {
mySampleSession.updateMySample(id, value);
} catch(Exception e) {
return "failure";
}
return "success";
}

これだけ。

■次はJSP。
以前に作った検索(search.jsp)、結果表示ページ(/WEB-INF/results/success.jsp)を再利用します。

まず旧結果表示ページを/WEB-INF以外の場所に移動し、編集します。
なぜ移動するか。
以前に紹介したチュートリアルのPage-Navigation-1.pdfに以下の記述がありました。
Strategies
- You cannot put input-form JSP pages in WEB-INF
- Because URL must correspond directly to file location

そのまんまですね。この人はJSFの欠陥だ、と言い切ってます。私もそう思うな。

idはそのまま表示し(hidden要素に入れておく)、valueはテキストボックスに表示します。
Found bean.<br>
id -> ${ mySampleBean.id } <h:inputHidden value="#{mySampleBean.id}"/>
value -> <h:inputText value="#{mySampleBean.value}"/><br>
<h:commandButton value="更新"
action="#{mySampleBean.updateValue}" />

こんな感じで。

次に新しい方の結果表示ページ(更新結果を表示するページ)を作成します。
/WEB-INF/results/success3.jspとします。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@page
language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<html>
<head>
<title>exists</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
</head>
<body>
Updated bean.<br>
id -> ${ mySampleBean.id }
value -> ${ mySampleBean.value }
</body>
</html>

次にfaces-config.xmlです。以下のタグを適切な場所に追加します。
  <navigation-rule>
<!-- この success.jsp が /WEB-INF/results の下にあるとダメな分けです -->
<from-view-id>success.jsp</from-view-id>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/WEB-INF/results/failure.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/WEB-INF/results/success3.jsp</to-view-id>
</navigation-case>
</navigation-rule>

以上。
.

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(6)

手順

1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
5. JSFを作成
6. EJBに挿入メソッドを作成する
7. JSFを作成(挿入)
(前回)
8. EJBに更新メソッドを作成する
(今回はここまで)
9. JSFを作成(更新)
10. EJBに削除メソッドを作成する
11. JSFを作成(削除)

8. EJBに更新メソッドを作成する

EJBに更新メソッドを作成します。

以下のメソッドをMySampleSession セッションBeanに追加します。
 public void updateMySample(int myid, String value) throws MySampleException {
if (value.length() > 1) {
throw new MySampleException();
}
MySample target = (MySample)em.find(MySample.class, myid);
if (target == null) {
throw new MySampleException();
}
target.setMyFlag(value);
em.persist(target);
em.flush();
}

アウトラインでupdateMySampleメソッドを右クリックし、Java EE ツール > メソッドのプロモート を実行します。(忘れがちなので注意しましょう)

これでUTCからテストが出来ます(テスト方法このシリーズで何度か書いたので割愛します)。ちゃんと動くか確認してみて下さい。(サクサク行きますねえ)
.

プリキュア映画版は面白かった

やはり面白いですね。映画版プリキュア。普段は地味な主役もちゃんと活躍してたし。カッコよかったぜ、ていい歳ぶっこいて何言ってんだ、という照れもありつつも。

やはりおっさんが若い女子の活躍する熱血青春アニメを面白がるというのも恥ずかしいもんで、そこは勘弁して頂きたい。

しかし、今回は結構感情移入して見て楽しかったですよ。これまでは「よく出来ている」「面白い」とは思いつつも、客観的スタンスを崩していなかったのが、映画では結構引き込まれた。どうしてかな。悪役がどっかマヌけなモチベーションを持っていたのが良かったと思うな。

まあ、小さい子供を持つお父さんもぜひ一緒に楽しんできてください。面白いから。多分ね。

.

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(5)

手順

1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
5. JSFを作成
6. EJBに挿入メソッドを作成する
(前回)
7. JSFを作成(挿入)
(今回はここまで)
8. EJBに更新メソッドを作成する
9. JSFを作成(更新)

7. JSFを作成(挿入)

挿入を受け付けるJSF画面を追加します。(行き当たりばったりの画面設計・・・)

JSFの観点から言えばNothing Specialです。淡々と行きます。

■insert.jsp
<%@page language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>挿入</title>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-31j">
</head>
<body>
<CENTER>
<h2>挿入</h2>
<h:form>
myid:
<h:inputText value="#{mySampleBean.id}" />
value:
<h:inputText value="#{mySampleBean.value}" />
<h:commandButton value="挿入"
action="#{mySampleBean.insertValue}" />
</h:form>
</CENTER>
</body>
</html>
</f:view>

■/WEB-INF/result/failure2.jsp(重複キーエラーの時に表示させます)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@page
language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<html>
<head>
<title>exists</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
</head>
<body>
Duplicate key exists. Could not insert.
</body>
</html>

■/WEB-INF/results/failure2-1.jsp(その他のシステムエラー用です。UTできませんが念のため)

/WEB-INF/result.failure2.jspの"Duplicate key exists. Could not insert."を"System error"に変えるだけ

■/WEB-INF/reusults/success2.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@page
language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<html>
<head>
<title>exists</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
</head>
<body>
Inserted bean.<br>
id -> ${ mySampleBean.id }
value -> ${ mySampleBean.value }
</body>
</html>

■faces-config.xml
以下を追加
  <navigation-rule>
<from-view-id>/insert.jsp</from-view-id>
<navigation-case>
<from-outcome>failure2</from-outcome>
<to-view-id>/WEB-INF/results/failure2.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure2-1</from-outcome>
<to-view-id>/WEB-INF/results/failure2-1.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success2</from-outcome>
<to-view-id>/WEB-INF/results/success2.jsp</to-view-id>
</navigation-case>
</navigation-rule>

■MySampleBeanに太字部分を追加
package test.beans;

import java.io.Serializable;

import javax.ejb.EJB;

import test.MySample;
import test.MySampleException;
import test.MySampleSessionLocal;

public class MySampleBean implements Serializable {

private static final long serialVersionUID = 1L;

int id;
String value;

@EJB(name="MySample")
private MySampleSessionLocal mySampleSession;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}

public String checkInput() {
MySample ms = mySampleSession.findMySample(id);
if (ms != null) {
this.setValue(ms.getMyFlag());
return "success";
} else {
return "failure";
}
}

public String insertValue() {
try {
mySampleSession.addMySample(id, value);
} catch(MySampleException mse) {
return "failure2";
} catch(Exception e) {
return "failure2-1";
}
return "success2";
}
}

以上です。いや、簡単ですね。
.

RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(4)

手順

1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
5. JSFを作成
(前回)
6. EJBに挿入メソッドを作成する
(今回はここまで)
7. JSFを作成(挿入)
8. EJBに更新メソッドを作成する
9. JSFを作成(更新)

6. EJB Session Beanに挿入メソッドを作成する
findメソッドの次にinsertMySampleメソッドを作成します。

最初に例外を追加します。想定していないデータが入力されたときにスローするためです。

MySampleEJBClientフォルダ(注意!EJBClientフォルダです) < ejbModule < test パッケージを右クリック < 新規作成 < クラス として「新規Javaクラス」ウィンドウを起動します。名前に「MySampleException」スーパークラスに「java.lang.Exception」を指定します。以上です。

MySampleEJBプロジェクト < MySampleEJB < セッションBean < MySampleSession.java を開きます。

以下のメソッドを追加します。
    public void addMySample(int myid, String value) throws MySampleException {
if (value.length() < 1) {
throw new MySampleException();
}
try {
MySample ms = new MySample();
ms.setMyid(myid);
ms.setMyFlag(value);
em.persist(ms);
em.flush(); // これがないと例外がキャッチできません。重要!
} catch(EntityExistsException e3) {
throw new MySampleException();
}
}

em.flush()が重要です。これをしないとアプリケーションから到達できないクラスで例外が発生するため、ハンドリングができなくなります。

次にメソッドのプロモートを忘れずに実行します。(アウトライン ビューでaddMySampleメソッドを右クリック、Java EE < メソッドのプロモート)

WAS v7テスト環境を起動します。

サーバーを右クリックしてUniversal Test Clientを起動、ログインします。

1.JNDI エクスプローラーリンクをクリック
2.右ペインに表示される[ローカル EJB Bean]フォルダを展開
3.test.MySampleSessionLocalリンクをクリック
4.左ペインに表示されるMySampleSessionLocalの'+'を展開
5.void addMySample(int, String) をクリック
6.int と String(1文字のみ) に適宜値を入れて起動

「メソッドが正常終了しました。」と表示されれば成功です。テーブルの中を見るとデータが追加されていることが確認できます。

6のステップで二文字以上を入力し、例外のロジックを確認します。MySampleExceptionが発生すれば成功です。

.