ここ数年使われているjargonであるところのWeb service(英語圏では大文字でなく、かつ複数形のweb servicesみたいな記載をよく見ます)。せっかくなのでRAD7.5で作ってみました。個人的にはこのテクノロジーに対しては出た当初から半信半疑です。セールストークやらわけの分からない専門用語が飛び交い過ぎている。まあ私が見限ったのはずいぶん昔のことだし、食わず嫌いもよくないので、最近のweb sevicesがどうなってるのか見てみたいと思います。
TutorialはIBM dW "Create stand-alone Web services applications with Eclipse and Java SE 6, Part 1"。例によってIBM IDの登録が必要です。
注意点)
build.xmlを実行する箇所について。RAD上で右クリック、実行 > Antビルド としてもエラーとなります。コマンド・プロンプトからantを実行すると(別途Apache antの導入が必要)、問題なく実行できました。ちなみにCygwinでもダメです。"Program Files"以下に導入しているからかもしれません。
RunServer を実行する箇所について。実行するためには commons-logging.jar と commons-discovery.jar をビルドパスに追加する必要がありました。
WebサービスエクスプローラーからUDDIメインを開いた後の画面について。Tutorialとは違うようです。RAD7.5では、
レジストリー名:SayHelloService
照会 URL :http://localhost:8080/wsServerExample?wsdl
と入力します。
Webサービスエクスプローラーの使い勝手。ぜんぜん違いますね。いろいろいじってみましたが、とうとうgetGreetingsを呼び出すことができませんでした。
結論。大山鳴動ねずみ一匹、という感じです。まだまだだな。(<偉そう)
以上。
.
モットーは「健全な精神は健全な胃腸に宿る」「生きてるあいだは上機嫌」
主張として「原発は営利企業に任せるべきでなく、もんじゅは絶対に廃炉!」「税金には気をつけろ!」
もう一つ、福島原発作業員の方々ならびに早野先生に国民栄誉賞を。
サブ・ブログという位置づけで、細々更新しています。
2008年12月5日金曜日
2008年11月28日金曜日
RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(11)
値をサーバ側で取得します。
1. ListBeanに選択された値を扱う変数と処理を追加します。
2. list.jspを編集します(変数の追加・送信ボタンの追加)。
3. faces-config.xmlに画面遷移定義を追加します。
1. ListBeanに選択された値を扱う変数と処理を追加
2. list.jspを編集
3. faces-config.xmlに画面遷移定義を追加
以上。
.
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)
次はレンダークラス(HTMLCustomSelectOneRadioRenderer)です。
■カスタム・タグクラス(HTMLCustomSelectOneRadioTag)
2. mysample.tldファイルです。
/WEB-INF/tldに置いてください。
重要: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にコンポーネント要素を追加します。
以下の要素を追加してください。
4. jspにタグを書きます。
以上です。表示だけはできるようになったはず。
(やれやれ。何で標準機能にしないんだろう・・・)
次回、radioボタンで送信されたデータを取得します。
.
残念ながらカスタムタグを開発する必要があります。
(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)を取得するメソッドを追加します。
■Webプロジェクト(MySampleJSF)に、新規にListBeanを追加します。
■faces-config.xmlにmanagedBean要素を追加します。
■list.jspを新規に作成します。
今度は一覧表示にラジオボタンを追加したいのですが、これが大変なのです(<h:dataTable ..>と<h:selectOneMenu...>は入れ子にできないため・・・)。次回以降で挑戦してみます。
以上
.
■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にロジックを追加します。
以上。UTCなどで動作確認することもできます。
11. JSFを作成(削除)
■MySampleBeanにロジックを追加します。
JSPは全てこれまでのものを流用します。
■success.jspに削除ボタンを追加します。
■faces-config.xmlを編集します(削除が成功したら検索画面に戻ります)。
以上。
.
手順
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月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にロジックを追加します。
これだけ。
■次はJSP。
以前に作った検索(search.jsp)、結果表示ページ(/WEB-INF/results/success.jsp)を再利用します。
まず旧結果表示ページを/WEB-INF以外の場所に移動し、編集します。
なぜ移動するか。
以前に紹介したチュートリアルのPage-Navigation-1.pdfに以下の記述がありました。
そのまんまですね。この人はJSFの欠陥だ、と言い切ってます。私もそう思うな。
idはそのまま表示し(hidden要素に入れておく)、valueはテキストボックスに表示します。
こんな感じで。
次に新しい方の結果表示ページ(更新結果を表示するページ)を作成します。
/WEB-INF/results/success3.jspとします。
次にfaces-config.xmlです。以下のタグを適切な場所に追加します。
以上。
.
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に追加します。
アウトラインでupdateMySampleメソッドを右クリックし、Java EE ツール > メソッドのプロモート を実行します。(忘れがちなので注意しましょう)
これでUTCからテストが出来ます(テスト方法このシリーズで何度か書いたので割愛します)。ちゃんと動くか確認してみて下さい。(サクサク行きますねえ)
.
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
■/WEB-INF/result/failure2.jsp(重複キーエラーの時に表示させます)
■/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
■faces-config.xml
以下を追加
■MySampleBeanに太字部分を追加
以上です。いや、簡単ですね。
.
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 を開きます。
以下のメソッドを追加します。
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が発生すれば成功です。
.
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が発生すれば成功です。
.
2008年11月21日金曜日
RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(3)
手順
1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
(前回はここまで)
5. JSFを作成
(今回はここまで)
6. EJBに挿入メソッドを作成する
7. JSFを作成(挿入)
8. EJBに更新メソッドを作成する
9. JSFを作成(更新)
5. JSFを作成(参照のみ)
以下の3ページを作成します。
(1) mysampleのキー(myid)入力画面
(2) キーを持つレコードが存在した場合、それを表示するページ
(3) 存在しない場合に表示するページ
テスト環境(WAS v7サーバー)が起動していたら停止して下さい(私の環境ではハングすることがありました。重すぎるんでしょう)。
ファイル > 新規 > 新規動的 Web プロジェクトをクリックします。
ウィンドウが現れるので、プロジェクト名に MySampleJSF と入力し、EARメンバーシップに MySampleEar があることを確認して 終了 をクリックします。
例によってモジュールの依存関係を定義します。 MySampleJSFを右クリック > プロパティ > Java EE モジュール依存関係 でMySampleEJBClient.jarとMySampleJPA.jarにチェックを入れます。
JSF用のBeanを作成します。
MySampleJSF を右クリックし、新規作成 > クラス を選択します。
新規Javaクラス ウィンドウに
パッケージ:test.beans
名前:MySampleBean
と入力し「終了」をクリックします。
MySampleBean を以下のように作成します。
■web.xmlにFacesサーブレットを定義します。
■/WEB-INF/faces-config.xml を作成します。
次にJSPです。
■index.jsp
■search.jsp
■/WEB-INF/results/success.jsp (パスに注意)
■/WEB-INF/results/failure.jsp
success.jspの"OK"を"NG"に変更するだけ。
これで動作確認をしてみましょう。"0"を入力すれば画面に"OK"が、"0"以外だと"NG"が表示されるはずです。
次にEJBと連携させます。
実はここまでくれば簡単です。
MySampleBean を以下のように変更します(太字部分)。
次にsuccess.jspを変更します。
以上。
.
1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
(前回はここまで)
5. JSFを作成
(今回はここまで)
6. EJBに挿入メソッドを作成する
7. JSFを作成(挿入)
8. EJBに更新メソッドを作成する
9. JSFを作成(更新)
5. JSFを作成(参照のみ)
以下の3ページを作成します。
(1) mysampleのキー(myid)入力画面
(2) キーを持つレコードが存在した場合、それを表示するページ
(3) 存在しない場合に表示するページ
テスト環境(WAS v7サーバー)が起動していたら停止して下さい(私の環境ではハングすることがありました。重すぎるんでしょう)。
ファイル > 新規 > 新規動的 Web プロジェクトをクリックします。
ウィンドウが現れるので、プロジェクト名に MySampleJSF と入力し、EARメンバーシップに MySampleEar があることを確認して 終了 をクリックします。
例によってモジュールの依存関係を定義します。 MySampleJSFを右クリック > プロパティ > Java EE モジュール依存関係 でMySampleEJBClient.jarとMySampleJPA.jarにチェックを入れます。
JSF用のBeanを作成します。
MySampleJSF を右クリックし、新規作成 > クラス を選択します。
新規Javaクラス ウィンドウに
パッケージ:test.beans
名前:MySampleBean
と入力し「終了」をクリックします。
MySampleBean を以下のように作成します。
package test.beans;
import java.io.Serializable;
public class MySampleBean implements Serializable {
private static final long serialVersionUID = 1L;
int id;
String value;
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() {
if (id == 0) {
return "success";
} else {
return "failure";
}
}
}
■web.xmlにFacesサーブレットを定義します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>
MySampleJSF</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
■/WEB-INF/faces-config.xml を作成します。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
<managed-bean-name>mySampleBean</managed-bean-name>
<managed-bean-class>test.beans.MySampleBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/search.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/success.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
次にJSPです。
■index.jsp
<% response.sendRedirect("search.faces"); %>
■search.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}" />
<h:commandButton value="検索実行"
action="#{mySampleBean.checkInput}" />
</h:form>
</CENTER>
</body>
</html>
</f:view>
■/WEB-INF/results/success.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>
OK
</body>
</html>
■/WEB-INF/results/failure.jsp
success.jspの"OK"を"NG"に変更するだけ。
これで動作確認をしてみましょう。"0"を入力すれば画面に"OK"が、"0"以外だと"NG"が表示されるはずです。
次にEJBと連携させます。
実はここまでくれば簡単です。
MySampleBean を以下のように変更します(太字部分)。
package test.beans;
import java.io.Serializable;
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";
}
}
}
次にsuccess.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>
Found bean.<br>
id -> ${ mySampleBean.id }
value -> ${ mySampleBean.value }
</body>
</html>
以上。
.
RAD v7.5 試用版 を使ってJSFとEJB3.0・・・(2)
今回の手順は以下のページほとんどそのままです。
Building Java EE applications with IBM Rational Application Developer V7.5 ... (IBM dWの記事)
が、若干違う+dWの手順では上手く行かないところがあるのでご注意ください。
手順
1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
(前回はここまで)
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
(今回はここまで)
5. JSFを作成(参照のみ)
6. EJBに挿入メソッドを作成する
7. JSFを作成(挿入)
8. EJBに更新メソッドを作成する
9. JSFを作成(更新)
3. JPA/EJBを作成(findメソッドのみ)
一旦サーバーは止めましょう。重いし(私の環境ではハングすることもありました)。
(1)JPAプロジェクトを作成します。
ファイル > 新規 > その他 > JPAプロジェクト をクリックし 「新規 JPA プロジェクト」ウィンドウを起動します。以下の情報を入力します(MySampleEARは存在していません)
プロジェクト名:MySampleJPA
EARメンバーシップのEAR プロジェクト名:MySampleEAR
「終了」をクリックします。
(2)エンティティ(≒DBとマップされたBean)を作成します
「MySampleJPA」フォルダを右クリックし、新規作成 > エンティティー を選択します。
「新規 JPA エンティティー・エンティティークラス」ウィンドウで以下の情報を入力します。
Java パッケージ:test
クラス名:MySample
「次へ」をクリックします。
「新規 JPA エンティティー・エンティティープロパティ」のエンティティ・フィールドを埋めます。
追加をクリックしてエンティティーフィールドダイアログを表示
タイプ:int
名前:myid
としてOKをクリック。
「鍵」カラムにチェックを入れておきます。
再び「追加」をクリック。以下の情報を入力します。
タイプ:String 要注意!!タイプは char ではありません!!
名前:myFlag (敢えてテーブルのカラム名と異なるものを使っています)
「終了」をクリックすると以下のソースが生成されます。
アノテーションを追加します。(太字部分)
次にJPAのpersistent.xmlにデータソース名指定します。
「MySampleJPA」フォルダ > 「JPAコンテンツ」 > persistence.xml をクリックします。
左ペインの「パーシスタンス・ユニット」を選択し、右側のペインのJTAデータ・ソースに 2.(3)で指定した jdbc/learning を入力します。
以上でJPAの作成が完了です。(残念ながらここでは動作検証は出来ません)
次にEJBプロジェクトを作成します。
ファイル > 新規 > EJBプロジェクト を選択して「新規 EJB プロジェクト・EJB プロジェクト」ウィンドウを起動します。
プロジェクト名に MySampleEJB と入力します。EJBモジュールバージョンが3.0であること、EARメンバーシップのEARプロジェクト名が MySampleEAR であることを確認し、「終了」をクリックします。
MySampleEJBフォルダを右クリックし プロパティ > Java EE モジュール依存関係 をクリックします。「選択可能な従属JAR」で「MySampleJPA.jar」にチェックを入れ、OKをクリックします。
MySampleEJB > MySampleEJB > セッションBean を右クリックします。コンテキストメニューから 新規 > セッションBean を選択します。
「EJB 3.0 セッションBean の作成ウィンドウ」に以下の情報を入力し、「ビジネス・インターフェースの作成」が「ローカル」になっていることを確認して終了をクリックします。
Javaパッケージ:test
クラス名:MySampleSession
生成されたEJBソースに下記の太字部分を追記します。
次にメソッドをプロモートします。
(重要 dWの記事には欠けていますが、以下の手順が必要です)
MySampleEJBClientフォルダを右クリックして、コンテキストメニューからプロパティを選択、次にJava EE モジュール依存関係 をクリックして「選択可能な従属JAR」で「MySampleJPA.jar」にチェックを入れます。
次に「アウトライン」ビューでfindMySampleを右クリック、コンテキストメニューから「Java EEツール」>「メソッドのプロモート」を実行します。
以上でEJBの作成が完了しました。
ここでユニバーサルクライアントを利用して動作確認をしてみます。
RADのサーバービューでWASサーバを起動します。
サーバーを右クリックし プロジェクトの追加および除去 を選択、MySampleEARを追加します。
公開が完了し、同期済みステータスになったら、サーバーを右クリックし、Universal Test Client > 実行 をクリックします。UTCが起動するのでログインします。(プロジェクトの追加以前にUTCを起動したことがあれば、一度「再起動」をクリックしてください)
「JNDIエクスプローラー」リンクをクリックします。
test.MySampleSessionLocalが表示されるのでクリックします。
※ そもそも表示されない場合はどこかで手順を間違っている可能性があります。プロジェクトがサーバに追加(デプロイ)されているかどうか等、手順を確認して下さい。
※ リンクではなく単にテキストが表示されている場合は、UTCの再起動を試して下さい。それでも出来ない場合はやはり手順を見直して下さい。
左側のペインに
MySampleSessionLocal
- MySampleSessionLocal
- メソッドの可視性
- MySample findMySample(int)
と表示されます。MySample findMySample(int) をクリックして下さい。
右側のペインに
test.MySample findMySample(int)
パラメーター 値
int: 0
と表示されています。そのまま「起動」をクリックします。
test.EJSLocal0SLMySampleSession_af305597.findMySample()
test.MySample@1ee01ee0 (test.MySample)
などと表示されれば成功です。「オブジェクトの使用」> String getMyFlag() ('a'が返る)などで遊んでみてください。
以上でEJBの作成が完了です。(しかしEJB簡単になったなあ)
RAD内のサーバーを止めてから、次のステップに行きます。
.
Building Java EE applications with IBM Rational Application Developer V7.5 ... (IBM dWの記事)
が、若干違う+dWの手順では上手く行かないところがあるのでご注意ください。
手順
1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
(前回はここまで)
3. JPAプロジェクトを作成
4. EJBを作成(findメソッドのみ)
(今回はここまで)
5. JSFを作成(参照のみ)
6. EJBに挿入メソッドを作成する
7. JSFを作成(挿入)
8. EJBに更新メソッドを作成する
9. JSFを作成(更新)
3. JPA/EJBを作成(findメソッドのみ)
一旦サーバーは止めましょう。重いし(私の環境ではハングすることもありました)。
(1)JPAプロジェクトを作成します。
ファイル > 新規 > その他 > JPAプロジェクト をクリックし 「新規 JPA プロジェクト」ウィンドウを起動します。以下の情報を入力します(MySampleEARは存在していません)
プロジェクト名:MySampleJPA
EARメンバーシップのEAR プロジェクト名:MySampleEAR
「終了」をクリックします。
(2)エンティティ(≒DBとマップされたBean)を作成します
「MySampleJPA」フォルダを右クリックし、新規作成 > エンティティー を選択します。
「新規 JPA エンティティー・エンティティークラス」ウィンドウで以下の情報を入力します。
Java パッケージ:test
クラス名:MySample
「次へ」をクリックします。
「新規 JPA エンティティー・エンティティープロパティ」のエンティティ・フィールドを埋めます。
追加をクリックしてエンティティーフィールドダイアログを表示
タイプ:int
名前:myid
としてOKをクリック。
「鍵」カラムにチェックを入れておきます。
再び「追加」をクリック。以下の情報を入力します。
タイプ:String 要注意!!タイプは char ではありません!!
名前:myFlag (敢えてテーブルのカラム名と異なるものを使っています)
「終了」をクリックすると以下のソースが生成されます。
package test;
import java.io.Serializable;
import javax.persistence.*;
/**
* Entity implementation class for Entity: MySample
*
*/
@Entity
public class MySample implements Serializable {
@Id
private int myid;
private char myFlag;
private static final long serialVersionUID = 1L;
public MySample() {
super();
}
public int getMyid() {
return this.myid;
}
public void setMyid(int myid) {
this.myid = myid;
}
public char getMyFlag() {
return this.myFlag;
}
public void setMyFlag(char myFlag) {
this.myFlag = myFlag;
}
}
アノテーションを追加します。(太字部分)
package test;
import java.io.Serializable;
import javax.persistence.*;
/**
* Entity implementation class for Entity: MySample
*
*/
@Entity
// ここでスキーマ名を指定します
@Table(schema="learning", name="mysample")
public class MySample implements Serializable {
@Id
private int myid;
// ここで変数名とは異なるカラム名を指定します。
@Column(name="mychar")
private char myFlag;
private static final long serialVersionUID = 1L;
public MySample() {
super();
}
public int getMyid() {
return this.myid;
}
public void setMyid(int myid) {
this.myid = myid;
}
public char getMyFlag() {
return this.myFlag;
}
public void setMyFlag(char myFlag) {
this.myFlag = myFlag;
}
}
次にJPAのpersistent.xmlにデータソース名指定します。
「MySampleJPA」フォルダ > 「JPAコンテンツ」 > persistence.xml をクリックします。
左ペインの「パーシスタンス・ユニット」を選択し、右側のペインのJTAデータ・ソースに 2.(3)で指定した jdbc/learning を入力します。
以上でJPAの作成が完了です。(残念ながらここでは動作検証は出来ません)
次にEJBプロジェクトを作成します。
ファイル > 新規 > EJBプロジェクト を選択して「新規 EJB プロジェクト・EJB プロジェクト」ウィンドウを起動します。
プロジェクト名に MySampleEJB と入力します。EJBモジュールバージョンが3.0であること、EARメンバーシップのEARプロジェクト名が MySampleEAR であることを確認し、「終了」をクリックします。
MySampleEJBフォルダを右クリックし プロパティ > Java EE モジュール依存関係 をクリックします。「選択可能な従属JAR」で「MySampleJPA.jar」にチェックを入れ、OKをクリックします。
MySampleEJB > MySampleEJB > セッションBean を右クリックします。コンテキストメニューから 新規 > セッションBean を選択します。
「EJB 3.0 セッションBean の作成ウィンドウ」に以下の情報を入力し、「ビジネス・インターフェースの作成」が「ローカル」になっていることを確認して終了をクリックします。
Javaパッケージ:test
クラス名:MySampleSession
生成されたEJBソースに下記の太字部分を追記します。
package test;
import javax.ejb.Stateless;
/**
* Session Bean implementation class MySampleSession
*/
@Stateless
public class MySampleSession implements MySampleSessionLocal {
/**
* Default constructor.
*/
public MySampleSession() {
// TODO Auto-generated constructor stub
}
@PersistenceContext(unitName="MySampleJPA")
EntityManager em;
public MySample findMySample(int myid) {
MySample ret = (MySample)em.find(MySample.class, myid);
return ret;
}
}
次にメソッドをプロモートします。
(重要 dWの記事には欠けていますが、以下の手順が必要です)
MySampleEJBClientフォルダを右クリックして、コンテキストメニューからプロパティを選択、次にJava EE モジュール依存関係 をクリックして「選択可能な従属JAR」で「MySampleJPA.jar」にチェックを入れます。
次に「アウトライン」ビューでfindMySampleを右クリック、コンテキストメニューから「Java EEツール」>「メソッドのプロモート」を実行します。
以上でEJBの作成が完了しました。
ここでユニバーサルクライアントを利用して動作確認をしてみます。
RADのサーバービューでWASサーバを起動します。
サーバーを右クリックし プロジェクトの追加および除去 を選択、MySampleEARを追加します。
公開が完了し、同期済みステータスになったら、サーバーを右クリックし、Universal Test Client > 実行 をクリックします。UTCが起動するのでログインします。(プロジェクトの追加以前にUTCを起動したことがあれば、一度「再起動」をクリックしてください)
「JNDIエクスプローラー」リンクをクリックします。
test.MySampleSessionLocalが表示されるのでクリックします。
※ そもそも表示されない場合はどこかで手順を間違っている可能性があります。プロジェクトがサーバに追加(デプロイ)されているかどうか等、手順を確認して下さい。
※ リンクではなく単にテキストが表示されている場合は、UTCの再起動を試して下さい。それでも出来ない場合はやはり手順を見直して下さい。
左側のペインに
MySampleSessionLocal
- MySampleSessionLocal
- メソッドの可視性
- MySample findMySample(int)
と表示されます。MySample findMySample(int) をクリックして下さい。
右側のペインに
test.MySample findMySample(int)
パラメーター 値
int: 0
と表示されています。そのまま「起動」をクリックします。
test.EJSLocal0SLMySampleSession_af305597.findMySample()
test.MySample@1ee01ee0 (test.MySample)
などと表示されれば成功です。「オブジェクトの使用」> String getMyFlag() ('a'が返る)などで遊んでみてください。
以上でEJBの作成が完了です。(しかしEJB簡単になったなあ)
RAD内のサーバーを止めてから、次のステップに行きます。
.
Rational Application Developer(以下RAD) v7.5 試用版 でJSFとEJB3.0を使ってCRUDアプリ作成(1)
試用版のダウンロード先です。IBM IDが必要です。(誰でも作成できると思います。)ダウンロードには丸一日かかります。
DBはMySQL v5.0を使いました。
IBM dWのBuilding Java EE applications with IBM Rational Application Developer V7.5 and WebSphere Application Server V7.0をベースに発展させて行きます。
手順
1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
(初回はここまで)
3. JPA/EJBを作成(findメソッドのみ)
4. JSFを作成(参照のみ)
5. EJBに挿入メソッドを作成する
6. JSFを作成(挿入)
7. EJBに更新メソッドを作成する
8. JSFを作成(更新)
1. サンプルDBを作成
2. WAS v7のデータソースに登録
RAD上にまだWAS v7 サーバが存在しない場合は作成して下さい。サーバービューを右クリックして「新規作成」を選択してテキトーに入力すれば出来ると思います。
WASを起動します。(重い・・・)
起動が完了したらServer view の サーバーを右クリックして「管理」>「管理コンソール」をクリック。
管理コンソールにログインします。
(1)JDBCを登録
メインメニュー Resources > JDBC > JDBC Providers > New >
ウィザード形式で入力を求められます。以下の情報を入力。
Database type -> User-defined
Implementation class name -> com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
Name -> MySQL JDBC Driver
次のページで
ClassPath: c:/path/to/mysql-connector-java-5.1.6-bin.jar
以上。
(2)認証情報を登録
メインメニュー Security > Global security > Authenticationエリアにある Java Authentication and Authorization Service を展開 > J2C authentication data > New
ここで
Alias -> MySQL_Learning
Userid, password -> DBに接続するときのID、パスワード
と入力する。
(3)データソースを作成
メインメニュー Resources > JDBC > Data source
Scope : 適切なスコープを設定(分からなければ'...Server = server1'とあるものを選びます)
> New
ウィザード形式で入力を求められるので下記情報を適宜入力します。
Data source name -> MySQL_Learning
JNDI name -> jdbc/learning(JPAに教えるので覚えておくこと)
> Next
Select an existing JDBC provider で MySQL JDBC Driver を選択
> Next
(何もしない)
> Next
Component-managed authentication alias
で、先ほど作成した認証情報(ノード名/MySQL_Learning)を選択。(JPAから参照するため、その他のaliasは不要。多分ServletからID/Passwordなしで利用するときはContainer-managed...が必要。Mapping-configurationは何か知らない・・・)
> Next
内容を確認
> Finish
次にカスタムプロパティを設定します。
JDBC providers > MySQL JDBC Driver > Data sources > MySQL_Learning > Connection pools > Custom properties > New
以下の情報を入力します。
Name -> url
Value -> jdbc:mysql://localhost:3306/learning
テスト接続。Warningが出ますが無視して問題ありません。
(注意:カスタムプロパティを設定しなくてもテスト接続は成功する。でもこのプロパティを定義しておかないと実際には使えない。認証情報をContainer-managedのみにしても成功するが、JPAからは使えない。すなわちテスト接続が成功しても油断しないで下さい)
まずは以上です。
.
DBはMySQL v5.0を使いました。
IBM dWのBuilding Java EE applications with IBM Rational Application Developer V7.5 and WebSphere Application Server V7.0をベースに発展させて行きます。
手順
1. サンプルDBを作成
2. DBをWAS v7のデータソースに登録
(初回はここまで)
3. JPA/EJBを作成(findメソッドのみ)
4. JSFを作成(参照のみ)
5. EJBに挿入メソッドを作成する
6. JSFを作成(挿入)
7. EJBに更新メソッドを作成する
8. JSFを作成(更新)
1. サンプルDBを作成
create database learning;
use learning; -- このコマンドはMySQL独自。
drop table mysample;
create table mysample(
myid integer primary key,
mychar char(1)
);
delete from mysample;
insert into mysample values(0,'a');
insert into mysample values(1,'b');
insert into mysample values(2,'c');
2. WAS v7のデータソースに登録
RAD上にまだWAS v7 サーバが存在しない場合は作成して下さい。サーバービューを右クリックして「新規作成」を選択してテキトーに入力すれば出来ると思います。
WASを起動します。(重い・・・)
起動が完了したらServer view の サーバーを右クリックして「管理」>「管理コンソール」をクリック。
管理コンソールにログインします。
(1)JDBCを登録
メインメニュー Resources > JDBC > JDBC Providers > New >
ウィザード形式で入力を求められます。以下の情報を入力。
Database type -> User-defined
Implementation class name -> com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
Name -> MySQL JDBC Driver
次のページで
ClassPath: c:/path/to/mysql-connector-java-5.1.6-bin.jar
以上。
(2)認証情報を登録
メインメニュー Security > Global security > Authenticationエリアにある Java Authentication and Authorization Service を展開 > J2C authentication data > New
ここで
Alias -> MySQL_Learning
Userid, password -> DBに接続するときのID、パスワード
と入力する。
(3)データソースを作成
メインメニュー Resources > JDBC > Data source
Scope : 適切なスコープを設定(分からなければ'...Server = server1'とあるものを選びます)
> New
ウィザード形式で入力を求められるので下記情報を適宜入力します。
Data source name -> MySQL_Learning
JNDI name -> jdbc/learning(JPAに教えるので覚えておくこと)
> Next
Select an existing JDBC provider で MySQL JDBC Driver を選択
> Next
(何もしない)
> Next
Component-managed authentication alias
で、先ほど作成した認証情報(ノード名/MySQL_Learning)を選択。(JPAから参照するため、その他のaliasは不要。多分ServletからID/Passwordなしで利用するときはContainer-managed...が必要。Mapping-configurationは何か知らない・・・)
> Next
内容を確認
> Finish
次にカスタムプロパティを設定します。
JDBC providers > MySQL JDBC Driver > Data sources > MySQL_Learning > Connection pools > Custom properties > New
以下の情報を入力します。
Name -> url
Value -> jdbc:mysql://localhost:3306/learning
テスト接続。Warningが出ますが無視して問題ありません。
(注意:カスタムプロパティを設定しなくてもテスト接続は成功する。でもこのプロパティを定義しておかないと実際には使えない。認証情報をContainer-managedのみにしても成功するが、JPAからは使えない。すなわちテスト接続が成功しても油断しないで下さい)
まずは以上です。
.
2008年10月22日水曜日
RAD7.5(Rational Application Developer v7.5)でJSFを試す
RAD7.5の試用版を半日がかりでダウンロードしました。WebSphere Applicaition Server v7.0一式が含まれているせいでむちゃくちゃサイズ大きいです。インストールは思ったよりも早く出来たかな。2時間はかかってないように思います。
例のJSFのチュートリアルを試しました。最初のところだけですけどね。しかし意外や意外。全く問題なし。少しは引っ掛かってくれないと記事にならないんですが。
さすが標準仕様の威力でしょうか。MyFacesと全く同じコードが動いています。素晴らしい。
以下メモです。
▽ JSFプロジェクトとかにする必要はありません。素の動的Webプロジェクトでも問題ありません。
▽ JSFの実装はWASのj2ee.jarに含まれています。つまり*.jarをlibに入れる必要はありません。
▽ "java.lang.Object を解決できません"というエラー発生。
プロジェクトの「プロパティ」>「Javaのビルド・パス」-ライブラリー(L)タブ>「JREシステム・ライブラリー」を選択して「編集(E)」ボタンをクリック>「代替JRE WAS v7.0なんとか」ラジオボタンが選択されているので「ワークスペースのデフォルト JRE(D)」を選択で解決しました。
以上。
.
例のJSFのチュートリアルを試しました。最初のところだけですけどね。しかし意外や意外。全く問題なし。少しは引っ掛かってくれないと記事にならないんですが。
さすが標準仕様の威力でしょうか。MyFacesと全く同じコードが動いています。素晴らしい。
以下メモです。
▽ JSFプロジェクトとかにする必要はありません。素の動的Webプロジェクトでも問題ありません。
▽ JSFの実装はWASのj2ee.jarに含まれています。つまり*.jarをlibに入れる必要はありません。
▽ "java.lang.Object を解決できません"というエラー発生。
プロジェクトの「プロパティ」>「Javaのビルド・パス」-ライブラリー(L)タブ>「JREシステム・ライブラリー」を選択して「編集(E)」ボタンをクリック>「代替JRE WAS v7.0なんとか」ラジオボタンが選択されているので「ワークスペースのデフォルト JRE(D)」を選択で解決しました。
以上。
.
登録:
投稿 (Atom)