月曜日, 1月 29, 2007

Seasar2.3.X + Ajax(Teeda)

Seasar2.3.x-ийг Ajax-тай хамт яаж хэрэглэхийг хялбархнаар тайлбарлая. Teeda-ийн талаар эндээс харна уу.
Ajax-ийг хэрэглэхийн тулд дараах файлууд хэрэгтэй.
  • Teeda-ajax-xx.jar
  • ajax.js
Гол гол хийх шаардлагатай үйлдлүүдийг тайлбарлая.
Өөрийн application-ийхаа WEB-INF/lib директорт Teeda-ajax-xx.jar файлыг хуулна.

Web.xml файлд AjaxServlet-ийг тодорхойлж өгнө.









Load-on-startup-д нь дурын утга тавиарай.

Ajax.js-ийг хэрэглэх арга:
Хэрэглэх гэж буй HTML файлдаа ajax.js файлыг include хийнэ. жишээ нь:




"Kumu.Ajax.executeTeedaAjax" функцийг дуудаж Ajax-ийг хэрэгжүүлнэ. Энэ функцийг ашиглах үед дараах зүйлийг тодорхойлж өгнө.
  • Буцаалтын функц
  • Параметр
Буцаалтын функц гэдэг нь Ajax-ийг хэрэгжүүлсэний дараагаар буцаж ирэх үр дүнг нь хүлээн авах функц юм. Буцаалтын функц нь доорх дүрэмтэй төстэй байдлаар тодорхойлогдох ба автоматаар дуудах компонент болон функцийн нэрийг шийднэ.
function hoge_foo(response){
// response-д Ajax-ын хариу хадгалагдах юм
alert(response);
}
Kumu.Ajax.executeTeedaAjax(hoge_foo, {"параметр нэр" : "утга"});
"Дуудах компонентийн нэр _ дуудах функцийн нэр" гэсэн байдлаар нэрийг тодорхойлно. Дээрх байдлаар тодорхойлсон үед Dicon-д hoge компонентийн foo функцийг зарласан байх шаардлагатай. Мөн доорх байдлаар тодорхойлж болно.
// Дурын нэрээр тодорхойлох
function test(response){
}
Kumu.Ajax.executeTeedaAjax(test, { "component" : "hoge", "action" : "foo" });

Дүрмийг хэрэглэхгүй тохиолдолд, параметрт компонент, action-ийг тодорхойлно.
Жишээнд hoge компонентийн foo функцийг дуудсан байна.

Параметр:







Дээрх байдлаар HTML-д teeda, kumu гэсэн параметрүүдийг тодорхойлсон байна.

Одоо Сервер талд хийгдэх зүйлийг тайбарлая. Дээр хэрэглэгдэж буй Hoge нь ямар нэг Dicon
файлд дараах байдлаар тодорхойлогдсон байна.







teeda-extension-ийн Ajax нь Dicon-д тодорхойлогдсон дурын POJO-г хэрэглэж чадна.

Дээр ашиглаж буй HogeBean-ний доторхыг харвал:

package examples.ajax;

public class HogeBean {

private String teeda;
private String kumu;

public void setTeeda(String teeda) {
this.teeda = teeda;
}
public void setKumu(String kumu) {
this.kumu = kumu;
}

public String foo() {
return "{ teeda :'" + this.teeda + "', kumu : '" + this.kumu + "' }";
}

}


Kumu.Ajax.executeTeedaAjax-аар тодорхойлогдсон параметрын нэртэй адилхан setter-т
параметрыг автоматаар онооно. Түрүүн Teeda, kumu гэсэн нэртэй параметрыг тодорхойлсон
учраас тэдгээр тус бүрийн Setter-т параметрын утгыг тодорхойлж өгнө. Дуудах функцийн
буцах утга нь String байх параметргүй байна. Foo функц нь Javascript-д буцаах String-ийг
үүсгэх юм. Буцах утгын үндсэн формат нь JSON боловч дурын форматтай байж болно.
  • JSON
  • HTML
  • XML
  • TEXT
Дурын форматаар дамжуулах талаар "teeda-ajax-demo"-ийн "example.html" болон "ExampleBean.java"-ийг заавар болгоно уу. JSON-ийн талаар Эндээс харна уу.
Япон хэлний параметрын талаар гэвэл, Tomcat5.x хувилбарыг ашиглаж байгаа бол server.xml-ийн Connector элементийн useBodyEncodingForURI аттрибутад "true" гэж тохируулна.

Жишээ кодыг эндээс авна уу.

金曜日, 1月 12, 2007

Windows 2003 Server-ийн Active Directory-т аттрибут нэмэх

Япон Windows 2003 Server дээр тайлбарласан болно.

Шинэ аттрибут нэмэхийн тулд дараах алхмыг хийгээд үзээрэй. Хэрвээ Server дээр [Active Directory Schema]-г суулгаагүй бол суулгах шаардлагатай. Суулгахад:

1. Command Prompt-ийг нээх.

2. Дараах командыг оруулна.

regsvr32 schmmgmt.dll

Энэ команд нь компъютерт schmmgmt.dll-ийг бүртгэнэ.

3. Start->「ファイル名を指定して実行」 дээр [mms/ a] гэж оруулаад [OK]-г дарна.














4.[File] цэсний [スナップインの追加と削除]-г сонгоно.















5.Дараах дэлгэцнээс 「追加(Нэмэх)」-г дарна. 「利用できるスタンドアロン スナップイン」 гэдгээс 「ActiveDirectoryスキーマ」 дээр 2 товшоод 「閉じる」-ийг дараад、өмнөх цонхны 「OK」-г дарна.


















6.Хадгалахдаа 「File」 цэсний 「保存(save)」-г сонгоно.
7.「保存する場所(Хадгалах газар)」で<システムルートディレクトリ(System directory)>¥system32 директорт хадгална.
8.「ファイル名(file name)」 хэсэгт 「schmmgmt.msc」 гэж оруулаад、「保存(save)」-г дарна.

Үүнээс хойш аттрибут нэмэх талаар тайлбарлъя.
1.「ActiveDirectoryスキーマ」の「属性(attribute)」-ийг сонгоод、хулганы баруун товчийг дарна. Түүний дараагаар 「属性の作成」 гэснийг сонгоно.

2. Дараагийн дэлгэцэнд аттрибутын нэр, тайлбар, OID, синтакс зэргийг оруулаад 「OK」-г дарна. OID нь давхардахгүй учир өөрөө шийдээд оруулчих.
3.Start->「ファイル名を指定して実行」-ийг дарж 「cmd」 гэж оруулаад 「OK」-г дарна.
4.「ldifde –i –f c:\Update.ldf」 гэсэн командыг ажиллуулна. c:\update.ldf файлын доторх нь доор байна.
dn:
changetype: modify
replace: schemaupdatenow
schemaupdatenow: 1
-
хуулж аваад ажиллуулна уу. Аттрибут нэмсэний дараагаар заавал ажиллуулна.
5.Класст нэмсэн аттрибутыг бүртгэхийн тулд 「ActiveDirectoryスキーマ」-ийн 「クラス」-г сонгож 、түүн дотроос классыг сонгоно. Дараах зурганд 「Person」 классыг сонгосон байна.
6.Сонгосон класст хулганы баруун товчийг дараад、「プロパティ(property)」-г сонгоно. 「属性(attribute)」 тав-ийг сонгоно.
7.「追加(add)」 товчийг дарж 、「スキーマオブジェクトの選択」 гэсэн дэлгэц дээр аттрибутыг сонгоод 「OK」 товчийг дарж 「Personのプロパティ」 гэсэн дэлгэцийн 「OK」-г дарна.
8.Command prompt дээр 「ldifde –i –f c:\Update.ldf」 гэсэн командыг ажиллуулна.
9.Аттрибутад утга онооход 、Command prompt дээр 「ldifde –i –f c:\Modify.ldf」 гэсэн командыг ажиллуулна. Modify.ldf файлын доторхыг доор харуулав.

dn: CN=Bat Bold, OU=TokyoOU, DC=ad,DC=networktest,DC=local //Хэрэглэгчийг заана
changetype: modify 
replace: testAttribute //Аттрибут нэр
testAttribute: 1 //Утга
-
10.Мөн 8-р алхамыг хийнэ.
11.「schmmgmt.msc」 гэсэн файлаа хадгална.

水曜日, 1月 10, 2007

S2Flex

S2Flex-ийг хэрэглэхэд S2Container-д бүртгэгдсэн байгаа компонентуудын method-ийг Flex-ээс амархнаар дуудаж болдог.

Шаардлагатай зүйлс:
JDK1.4-өөс дээш, S2FlexVx.x.x.zip-ийг татаж аваад задлаад eclipse-тээ импорт хийж оруулж өгнө.
[File->Import->General->Existing Projects into Workspace] flashgateway.jar энэ файл байхгүй учраас ажиллуулахад алдаа гарна. Учир нь Flex-ийн jar файлыг хамаагүй тараадаггүй ба Flex нь үнэтэй програм юм. Гэхдээ 30 хоногийн Trial Flex-үүд байдаг. Компайл хийхийн тулд "S2flex/lib" директорт "flashgateway.jar" файлыг хуулж өгнө.
Эндээс Trial хувилбарыг татаж авч болно. Жишээнд, Tomcat, Tomcat Plugin
болон Flex нь JRun Integration mode гэлтгүй, Macromedia Flex mode-өөр суулгагдана. $FLEX_HOME нь Flex-ийг суулгасан газрын зам. Жишээ кодыг татаж аваад задалсны дараагаар Flex-ийн орчинг бэлдэнэ. "$FLEX_HOME/flex.war" энэ файлыг тохиромжтой газар нь задлана(jar xf flex.war). Задалсны дараагаар "s2flex-example/WEB-INF" директорт хуулна. S2Container-ийг ажиллуулахын тулд "Web.xml" файлд дараах өөрчлөлтийг хийнэ.

Flex-ийн AMFGateway нь S2Container-дах Компонентийн method-ийг дуудахын тулд s2flex-example/WEB-INF/flex/gateway-config.xml-д Seasar2-т зориулж тааруулж өгнө.




Application-д log4j-ээр логийг гаргахын тулд
WEB-INF/flex/jars-д байгаа commons-loging.jar-ийг WEB-INF/lib-д зөөнө.
JavaBeans болон ActionScript-ийн классыг тодорхойлох
JavaBeans болон ActionScript-ийн классыг тодорхойлсноор Java болон Flex-ийн хооронд өгөгдөл солилцож чадна. Жишээнд дараах байдлаар тодорхойлсон байна.

package examples.flex;

import java.io.Serializable;

public class AddDto implements Serializable {

private int arg1;
private int arg2;
private int result;

public int getArg1() {
return arg1;
}

public void setArg1(int arg1) {
this.arg1 = arg1;
}

public int getArg2() {
return arg2;
}

public void setArg2(int arg2) {
this.arg2 = arg2;
}

public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}

}
Мөн үүнд харгалзах ActionScript-ийг үүсгэнэ.
class examples.flex.AddDto {
var _remoteClass:String;
var arg1:Number;
var arg2:Number;
var result:Number;

function AddDto() {
_remoteClass = "examples.flex.AddDto";
}
}


Гол цэг нь дараах зүйлс юм.
  • ActionScript-ийн классын нэр Java классын нэртэй таарч байх
  • _remoteClass гэсэн шинж чанарыг тодорхойлох
  • Байгуулагч дээр _remoteClass-д классын нэрийг зааж өгөх
  • Шинж var-аар хувьсагчуудыг зарлах
  • MXML файлыг root болгож package бүрээр директорт хуваана. Жишээ нь: examples.flex.AddDto гэдэг класс нь examples/flex/AddDto.as гэж тавигдах болно. Мөн WEB-INF/flex/user_classes-г root директор болгож package бүрээр директорт салгаж болно. Ерөнхийдөө user_classes гэ сэн аргаар хэрэглэх нь дээр.
Үүний дараагаар, Flex талд "var"-ээр классын нэрийг тогтоод хувьсагчуудыг зарлах уу?, эсвэл дараах байдлаар классын нэрийг таг нэрээр зарлана. xmlns аттрибутаар package-ийн нэрийг тодорхойлно.



Мессэжийг олон хэл дээр дэмжих
Java дээр property файлыг ашиглаж олон хэл дээр мессэжийг гаргаж чаддаг ба тэр property файлыг Flex-ээс ашиглах функц S2Flex-д бэлтгэгдсэн болно. Жишээ нь дараах маягийн property файлыг WEB-INF/classes-д бэлтд
сэн гэвэл:

FLXMessages_ja.properties

EFLX0001=({0})は入力必須です
EFLX0002=バリデーションエラーです。エラーを修正してもう一度入力してください。

FLXMessages.properties

EFLX0001=({0}) is mandatory
EFLX0002=Please enter valid data in the fields with errors and try again.
Eclipse дээрээ Япон хэлээр property удирд ахыг хүсвэл эндээс property editor-ийг татаж аваад ашиглавал тохиромжтой. Дараа нь энэ property файлаа Flex талаас хэрэглэхийн тулд компонентийг dicon файлд бүртгэнэ.


Мөн уг компонентийг Flex-ээс хэрэглэхийн
тулд WEB-INF/flex/flex-config.xml-д бүртгэх шаардлагатай.







Java талаас бэлтгэл дууслаа. Дараа нь Flex талын бэлтгэлийг хийнэ. Эхлээд "
s2flex/as2/org" директорыг "WEB-INF/flex/user_classes"-нд бүгдийг нь хуулна. Дараа нь messageLogic-ийг дуудахын тулд RemoteObject таг-ийг тодорхойлно. Сервэр талаас буцах утга нь буцаж ирсэн үеийн процесс болгож "processMessageManager()"-ийг дуудна. "event.result"-д "MessageManager" орж ирнэ.
messageLogic нь програм ажиллах үед дуудагдана.






import org.seasar.flex.message.*;
function initApp() {
messageLogic.getMessageManager("FLXMessages", "ja");
}

processMessageManager()-д цуглуулсан MessageManager объектыг MessageManager
классын static хувьсагчид(instance)-д хадгалж байна.

import org.seasar.flex.message.*;

class org.seasar.flex.message.MessageManager {
static var instance:MessageManager;
...
}

function processMessageManager(messageManager:MessageManager) {
MessageManager.instance = messageManager;
}

Үүнээс гадна, Validator-ийг үүсгэнэ. Validator нь, mx.validators.Validator-ээс удамшиж,
doValidation(value)-ийг гүйцэтгэнэ. Value-д орж ирсэн утга байна. Алдаа тохиолдсон үед,
Validator#validationError()-аар алдааны мэдээллийг гаргана. MessageManager объект нь
MessageManager.instance-аар зааварчлагдана. Дараа нь,
getMessage(messageCode, аргументын олонлог)-ийг зөвхөн дуудна.

import org.seasar.flex.message.*;
class RequiredFieldValidator extends mx.validators.Validator {
var fieldName:String;


function doValidation(value) : Void {
if (value == undefined || value == "") {
var args:Array = new Array();
args[0] = fieldName;
validationError("required", MessageManager.instance.getMessage("EFLX0001", args));
}
}
}

Энэ жишээнд, s2flex-example/validation-нд хадгалагдаж байна. Browser-аас
http://localhost:8080/s2flex-example/validation/ValidationApp.mxml-руу хандаад үзээрэй. Юу ч
оруулаагүй үед "validator" товчийг дарахад алдааны мессэж харагдана. Дараах байдлаар
алдааны мэдээлэл харагдах болно.



















Жишээ:

Java тал дээрээ interface болон хэрэгжүүлэгчийг бэлдэнэ.

examples.flex.AddLogic

package examples.flex;

public interface AddLogic {

public int calculate(int arg1, int arg2);

public AddDto calculate2(AddDto addDto);
}

examples.flex.AddLogicImpl

package examples.flex;

public class AddLogicImpl implements AddLogic {

public int calculate(int arg1, int arg2) {
return arg1 + arg2;
}

public AddDto calculate2(AddDto addDto) {
return addDto.setResult(addDto.getArg1() + addDto.getArg2());
}
}


Компонентийг dicon файлд бүртгэнэ.












Бүртгэгдсэн компонентийг Flex-ээс дуудахаар "s2flex-example/WEB-INF/flex/flex-config.xml"-
ийн "flex-config/remote-objects/whitelist"-д дараах тэмдэглэлийг нэмнэ.









Object таг-аар компонентуудыг тодорхойлно. Source таг-аар тодорхойлох нь S2Container-р
тодорхойлсон компонентийн нэр юм. name аттрибут нь source аттрибуттай адилхан байх нь
ойлгоход хялбар боловуу. Компонентийг нэмэх тохиолдолд, object таг-г нэмнэ. Flex1.0-ийг
хэрэглэх үед, дээрх агуулгыг бичсэн файл нь
"s2flex-example/WEB-INF/flex/flex-config-s2flex.xml"-д аль хэдийн бэлтгэгдсэн учраас
"flex-config.xml"-д хуулна. Flex1.5-ийг хэрэглэх үед, адилхнаар "flex-config-s2flex15.xml"-ийг
хуулна.

Хамгийн сүүлд нь Flex програмын код. Add.mxml,Add2.xml файлыг төслийн эх директорт
хийнэ.














"RemoteObject" таг-аар Java-ийн компонентийг тодорхойлно. named аттрибутад
flex-config.xml-ийн object таг-ийн name аттрибутаар тодорхойлсон утгыг заана. id аттрибут нь,
named аттрибуттай адил байх нь ойлгоход хялбар. Дараа нь, ActionScript-ийн дотроос
компонентийн нэр, method-ийн нэрээр дуудаж чадна. {addLogic.calculate.result} байдлаар хийж
calculate method-ийн дуудан үр дүнг Label-ийн value-д автоматаар өгдөг байдлаар тохируулж
болно.

Ингээд дууслаа.
Tomcat-ийг restart хийж, Browser-с "http://localhost:8080/s2flex-example/Add.mxml"-руу хандана.

Доор JavaBeans-ийг хэрэглэсэн жишээг харуулав.
















Browser-аас "http://localhost:8080/s2flex-example/Add2.mxml"-руу хандана уу.

Жишээнүүдийг эндээс татна уу.


日曜日, 1月 07, 2007

S2JSF

S2JSF(Java Server Faces) нь Web application-ийг бүтээхэд зориулагдсан presentation давхрагын framework юм. JSF-тэй хамгийн ойрхон framework нь нэлээн алдартай Struts байх юм. Хэрвээ JSP-ийг ашиглан хуудасны загварыг өөрчлөхөд application серверийн эхлүүлж deploy хийхгүй бол болохгүй билээ. Энэ нь төвөгтэй байдал үүсгэж байна. Үүний оронд S2JSF-ийг хэрэглэвэл харагдац хэсэг нь HTML учраас дээрх жишээ дурьдсан ажлуудыг хийх шаардлагагүй болж хуудасны загварыг өөрчлөхөд хялбар болох юм. Жишээг харна уу.

hello.html









Эхний мөрөнд xmlns:m=http://www.seasar.org/maya S2JSF-ийн namespace-ийн тодорхойлолт юм. Үүнийг заавал тодорхойлж өгнө.

m:extends="/WEB-INF/layout/layout.html энэ нь layout(хуудасны загвар)-ийг тодорхойлно. Үүнд: header, footer, body, menu зэрэг хуудсуудыг нийлүүлсэн хуудас юм. 7-р мөрөнд байгаа “layoutTitle” нь layout.html хуудсанд хуудасны гарчигийг харуулахад ашиглана. Үндсэн хуудасруу параметр дамжуулахад f:param тагийг ашиглана. 8-10р мөр нь үндсэн хуудсын body хэсэгт харагдах зүйлс. 9-р мөрний #{} гэсэн хэсэгт хувьсагчийг тавьж өгвөл түүний утгыг HTML хуудсанд харуулах болно. Span тагийг ашиглана.

layout.html



















4-р мөрөнд байдаг CSS файлыг дуудсан байна. Inject аттрибутад s:link-ийг олгосноор дуудагдах юм.
5-р мөрөнд түрүүний хуудаснаас дамжуулсан хуудасны гарчигыг харуулах хэсэг байна. S угтвар нь WEB-INF/classes/jsf.dicon(эсвэл WEB-INF/src) гэсэн файлд тодорхойлогдох юм. S угтвар нь http://www.seasar.org.jsf URI-тай холбогдоно.
17-р мөр нь их биеийн хэсгийг харуулна.
jsf.dicon (Энэ жишээний)










Layout.html-ийн 10-р мөрөнд хуудасны толгой хэсгийг оруулж байгаа ба доор толгой файлыг үзүүлсэн байна. Мөн зураг хэрхэн дуудсаныг харна уу.

header.html



menu.html












6-р мөрөнд байгаа линкний action-д hello гэж байна. Үүнийг үсрэх хуудсыг WEB-INF/faces-config.xml файлд тодорхойлж өгнө.

faces-config.xml












add.html











10-р мөр нь алдааг гаргах үйлдэл. 11-р мөрөндэх Input tag нь javabean-ий property-тэй холбогдсон байна. Оролтын утга нь Javabean-ий Property-д олгогдох юм. Доор байгаа examples/jsf/dicon/add.dicon файлд addDto-г тодорхойлж өгнө.

add.dicon


instance аттрибут нь request гэж тодорхойлогдсон нь addDto нь request байдлаар зохион байгуулагдана.app.dicon файлын root элементэд add.dicon файлыг оруулж өгнө.

app.dicon


14-р мөрөнд байгаа код нь товчлуурыг дарахад addAction-ий calculate() method-ийг дуудна.

add.dicon файлд addAction-ийг тодорхойлно.

add.dicon



package examples.jsf.action;
public interface AddAction {

public String calculate();

}

package examples.jsf.action.impl;

import examples.jsf.action.AddAction;
import examples.jsf.dto.AddDto;

import examples.jsf.logic.AddLogic;

public class AddActionImpl implements AddAction {

private AddDto addDto;
private AddLogic addLogic;

public void setAddDto(AddDto addDto) {

this.addDto = addDto;

}

public void setAddLogic(AddLogic addLogic) {
this.addLogic = addLogic;

}

public String calculate() {

int result = addLogic.calculate(addDto);

addDto.setResult(result);

return null;

}}

Оруулсан утгыг хүлээн авахын тулд addDto-ий setter method-ийг тодорхойлж өгнө. S2JSF нь ямар нэг property-ийн setter method тодорхойлогдсон эсэхийг шалгадаг. request аттрибутууд, parameter-үүд, session аттрибутууд, мөн S2Containter-үүдэд ямар нэгэн хувьсагчийн property-тай адил property байвал S2JFS нь шалгаад хэрвээ таарч байвал S2JSF нь автоматаар setter method-ийг нь дуудаж хувьсагчид утга олгоно.

Property-ийн төрөл нь Interface байхад addLogic-ийн хувьсагч нь хаана нэгтээ тодорхойлогдоогүй бол S2Container нь автоматаар Interface-ийн хэрэгжүүлэгч класст автоматаар set хийдэг.

add.dicon файлд AddLogic хэрэгжүүлэгч классыг тодорхойлсон байна.




MethodBinding-аар дуудагдсан method нь null-ийг буцаана. Энэ нь өөрлүүгээ буцна.

forEachList.html
















8аас 24-р мөр хүртэл span элементийн forEach-ийг ашиглаж давталт хийж байна. Items аттрибут нь хэрхэн давтахыг, var аттрибут давталтанд дамжуулах утгаруу хандсан хувьсагчийн нэр, varIndex аттрибут нь давталтыг хянах хувьсагч гэж тус тус заасан байна.
Var аттрибут-д тодорхойлсон хувьсагчийн нэрийн property-оор давталтанд элементийн утгыг авна.
Жишээ нь: 11 болон 12 мөрүүдэд, давталтандах элементүүдийн нэр болон key-ийн утгыг авсан байна.
13-р мөр, href аттрибут болон action аттрибутуудыг тодорхойлсон байна. Ийм тохиолдолд, ажиллаж байх явцад href-ийг алгасна. href аттрибут нь хэдийгээр тийм боловч web browser-оос уг html файлыг нээхэд ямар нэг хуудасруу үсрэнэ.
14-р мөр, param-ийг хэрэглэж параметрыг дамжуулж байна. Параметр нь дамжуулах URI-лүү дамжих болно.
18-р мөр, action аттрибут болон onclick аттрибуттай товчлуурын жишээг харуулсан байна.
20-р мөр, товчлуур дарагдсан үед параметрыг хуудасруу дамжуулна.

forEachResult.html












2-р мөрөнд action аттрибутаар initialization method-ийг заасан байна. Action класс нь доор тодорхойлогдсон байна.
package examples.jsf.action.impl;

import java.util.List;

import examples.jsf.action.ForEachResultInitAction;

import examples.jsf.dto.ForEachDto;

public class ForEachResultInitActionImpl implements ForEachResultInitAction {

private int index;

private List forEachDtoList;

private ForEachDto forEachDto;
public void setIndex(int index) {

this.index = index;

}

public void setForEachDtoList(List forEachDtoList) {

this.forEachDtoList = forEachDtoList;

}

public ForEachDto getForEachDto() {

return forEachDto;

}
public String initialize() {

forEachDto = (ForEachDto) forEachDtoList.get(index);

return null;

}}

examples/jsf/dicon/foreach.dicon файлд forEachDtoList-ийг тодорхойлно.initMethod таг-г ашиглаж дурын method-ийг дуудаж болно.

initialize() method-д forEachDto property-ийн index-ийг set хийсэн байна. Initialize() method гүйцэтгэсний дараагаар S2JSF нь автоматаар forEachDto property-д утгыг Set хийнэ. Дараах байдлаар, тогтмолоор request -ийн оронд session-ийг set хийж болно.
public static final String property name_EXPORT = "session";

水曜日, 1月 03, 2007

S2Dao

S2Dao нь ерөнхийдөө өгөгдлийн сантай ажилладаг хэсэг юм.S2Dao-г хэрэглэхийн тулд дараах файлуудыг үүсгэх хэрэгтэй.

- JavaBeans
- Dao (.java)
- Dicon файл
- SQL файл (.sql)

Зохион байгуулалтыг дүрслэвэл дараах байдалтай болох юм.












JavaBean нь өгөгдлийн сангийн хүснэгттэй холбогдоно. Доорх жишээг харна уу.

public static final String TABLE = "table name";

public static final String Property name_COLUMN = "column name";

public static final int Property name_RELNO = value;

гэх мэтчилэн өгөгдлийн сангийн хүснэгтийн талбаруудыг зарлана. Түүний дараагаар эдгээр зарласан хувьсагчуудын утгыг хүлээн авах хувьсагчуудыг Bean класстаа зарлаад Getter, Setter-ийг тодохойлж өгөх хэрэгтэй. Жишээ нь: EMP гэдэг хүснэгт нь EMPNO, ENAME, DEPTNUM гэсэн талбаруудтай, мөн DEPT гэдэг хүснэгт нь DEPTNO, DNAME гэсэн талбаруудтай байхад EMP хүснэгтийн Bean класс нь дараах байдалтай болох юм.

import java.io.Serializable;

public class Employee implements Serializable {

public static final String TABLE = "EMP";

public static final int department_RELNO = 0;

public static final String department_RELKEYS = "DEPTNUM:DEPTNO";

private long empno;

private String ename;

private Short deptnum;

private Department department;

public Employee() { }

public Department getDepartment() {

return department;

}

public void setDepartment(Department department) {

this.department = department;

}

public Short getDeptnum() {

return deptnum;

}

public void setDeptnum(Short deptnum) {

this.deptnum = deptnum;

}

public long getEmpno() {

return empno;

}

public void setEmpno(long empno) {

this.empno = empno;

}

public String getEname() {

return ename;

}

public void setEname(String ename) {

this.ename = ename;

}}


Dao нь Interface байдлаар үүсэх ба дотор нь өгөгдлийн сантай ажиллах method-уудаа зарлана. Method-уудаа ашиглан SQL файлуудтайгаа холбогдож query-ийгээ ажиллуулна. Жишээг харна уу. “class name_method name.sql” гэсэн нэртэйгээр SQL файлын нэр нь тодорхойлогдоно. Учир нь Dao interface-д зарлагдсан method-ийн нэрээрээ SQL файлаа хайж олоод ажиллуулдаг учраас. Жишээ нь:

LoginDao_find.sql

SELECT
ID_SHOKUIN,
KENGEN,
NM_SHOKUIN
FROM M_SHOKUIN WHERE
ID_SHOKUIN = /*dto.idShokuin*/ AND
PASSWORD = /*dto.password*/ AND
KENGEN = 0

Мөн Interface класс-т :

public static final Class BEAN = JavaBeans name.class;

Мөн query-рүү дамжуулах аргументыг тодорхойлно.

public static final String method name_ARGS = " argument name";


S2Dao файлыг ажиллуулах

Дараах 3-н алхамаар ажиллуулна.

1. S2Container-ийн байгуулагчийг ашиглаж үүсгэсэн Dicon файлын замыг зааж өгнө.

2. Үүсгэсэн Container-ийн getComponent method-ийг дуудаж бүртгэгдсэн Dao-г авна.

3. Хүлээн авсан Dao-н method-уудыг дуудаж ажиллуулна.

Жишээ нь:

package examples.dao;

import org.seasar.framework.container.S2Container;

import org.seasar.framework.container.factory.S2ContainerFactory;

public class EmployeeDaoClient {

private static final String PATH = "examples/dao/EmployeeDao.dicon";

public static void main(String[] args) {

S2Container container = S2ContainerFactory.create(PATH); /* step 1 */

container.init();

try {

EmployeeDao dao = (EmployeeDao) container.getComponent(EmployeeDao.class);/*step 2*/

System.out.println(dao.getAllEmployee(7788));/* step3 */

} finally {

container.destroy();

}

}}


Dicon файлд доорх 3 зүйлсийг бүртгэж өгнө.

1. Dao.dicon-ийг агуулах.

2. Үүсгэсэн Dao-ийн компонентыг тодорхойлно.

3. dao.interceptor-ийг хэрэглэх.









Dao.dicon


j2ee.dicon файлд өгөгдлийн сантай холбогдох хэсгийг тохируулж өгнө. Жишээг татаж аваад харна уу.

DI болон DI Container гэж юу вэ? (vргэлжлэл)

Доорх жишээг харна уу.

Greeting.java
Greeting interface.

public interface Greeting {
String greet();
}

GreetingImpl.java
Greeting-ийн хэрэгжүүлэх класс

public class GreetingImpl implements Greeting {
public String greet() {
return "Hello World!";
}}

GreetingClient.java
Greeting -г ашиглах Client interface

public interface GreetingClient {
void execute();
}

GreetingClientImpl.java
Greeting-ийг хэрэглэх Client хэрэгжүүлэгч.

public class GreetingClientImpl implements GreetingClient {
private Greeting greeting;
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
public void execute() {
System.out.println(greeting.greet());
}}

GreetingMain.java
public class GreetingMain {
public static void main(String[] args) {
Greeting greeting = new GreetingImpl();
GreetingClientImpl greetingClient = new GreetingClientImpl();
greetingClient.setGreeting(greeting);
greetingClient.execute();
}}

Үр дүн:
Hello World!

GreetingMain-дэх хэсгийн кодыг DI Container-ийн тохиргооны файлд оруулж өгвөл ямар нэг кодны өөрчлөлтөөс зугтаж болох юм. DI Container-ийн тохиргооны файл нь .dicon өргөтгөлтэй байна. Одоо жишээгээ өөрчлөн DI Container-луу оруулъя. (Зурган дээр дарж томоор харна уу)











Дээрх хэсгийг тайлбарлая.
4-р мөр нь Greeting greeting = new GreetingImpl(); гэсэн кодтой адил юм.
5, 6, 7-р мөр нь 4-р мөрөнд зарласан greeting компонентын нэрийг Property таг-д ашиглаж байна. Доорх хэсгийн код юм.

GreetingClientImpl greetingClient = new GreetingClientImpl();
greetingClient.setGreeting(greeting);

Main функц нь доорх байдлаар өөрчлөгдөнө.

GreetingMain2.java

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
public class GreetingMain2 {
private static final String PATH = " GreetingMain2.dicon";
public static void main(String[] args) {
S2Container container = S2ContainerFactory.create(PATH);
GreetingClient greetingClient = (GreetingClient) container.getComponent("greetingClient");





greetingClient.execute();
}}

AOP(Aspect Oriented Programming) нь DI-тай олонтаа хэрэглэгддэг. Жишээ нь одоо GreetingImpl, GreetingClientImpl классаас лог гаргаж үзье. Гэхдээ эх кодыг өөрчлөлгүйгээр лог гаргана. Үүний тулд .dicon файлд дараах өөрчлөлтийг хийнэ. (Зурган дээр дарж томоор харна уу)




















Илүү дэлгэрэнгүй үргэлжлүүлэн үзэхийг хүсвэл энд дарна уу.

Мөн жишээнүүдийг эндээс үзнэ үү.

DI болон DI Container гэж юу вэ?

DI гэж юу вэ?
DI буюу Dependency Injection гэдэг нь ямар нэг объектод утга оноох үйлдэл юм. Үндсэндээ DI-ийн төрөл нь дараах 3 байх юм.
  1. Байгуулагчаар дамжуулан
  2. Setter функцээр
  3. Interface-ийг ашиглан
DI-г хэрэгжүүлэх, объект болон түүний хамаарлыг удирдах нь DI Container юм.
Объект нь шаардлагатай зүйлийг өөрөө авах бус DI Container дамжуулах юм. Ямар объектод юуг дамжуулах вэ гэдэг нь DI Container-н тохиргооны файлд заагдана.

DI-ийн үндсэн үйлдэл
Хялбархан кодоор жишээ авч DI-ийн үндсэн үйлдлийг үзье.
Доорх код нь, Hello класс нь ConsolePrinter-ийг ашиглаж дэлгэцэнд “Hello” гэж хэвлэх програм юм. Ажиллуулах нь Main классын main method юм. Эхлээд DI-г хэрэглээгүй жишээ.

Source code 1-1
Main.java
public class Main {
public static void main(String a[]) {
Hello hello = new Hello();
hello.sayHello();
}
}

Hello.java
public class Hello {
private ConsolePrinter printer = new ConsolePrinter(“say: ”);
Public void sayHello() {
Printer.print(“hello”);
}
}

ConsolePrinter.java
Public class ConsolePrinter {
Private String lineHead;
Public ConsolePrinter(String lineHead) {
This.lineHead = lineHead;
}
Public void print(String messange) {
System.out.println(lineHead + message);
}
}

DI-г хэрэглэвэл
Source code 1-2

Main.java
public class Main {
public static void main(String a[]) {
Printer printer = new ConsolePrinter(“say: ”);
Hello hello = new Hello(printer);
hello.sayHello();
}
}

Hello.java
public class Hello {
private Printer printer;
public Hello(Printer printer) {
this.printer = printer;
}
public void sayHello() {
printer.print(“hello”);
}
}

Printer.java
public interface Printer {
public void print(String message);
}

ConsolePrinter.java
Public class ConsolePrinter {
Private String lineHead;
Public ConsolePrinter(String lineHead) {
This.lineHead = lineHead;
}
Public void print(String messange) {
System.out.println(lineHead + message);
}
}

Source code 1-2ийн жишээнд DI нь, main method-д Hello-ийн instance-д ConsolePrinter-ийн instance-ийг дамжуулж байгаа явдал юм.
Printer гэдэг Interface-ийг хэрэглэхэд Hello класс нь хэрэгжүүлэгч класс(ConsolePrinter)-д хамаарахгүй болж байна. Хэрэв текст файлруу бичдэг TextFilePrinter гэх классыг хэрэглэхээр өөрчилвөл, өөрчлөх шаардлагатай нь Main класс л юм. DI Container-ийг хэрэглэх тохиолдолд тохиргооны файлыг зөвхөн өөрчлөх ба эх кодыг өөрчлөх шаардлагагүй юм.

DI-аар бүх классуудын хамаарлыг удирдаад явахад нэлээн төвөгтэй Application болно. Иймээс компонентыг оруулж ирэх хэрэгтэй. Компонент нь application болон классуудын дунд байрлах ба application нь компонентуудаа комбинац хийж үүсгэх, харин компонент нь классуудаа комбинац хийж үүсгэх гэсэн хэлбэртэй болох юм.

DI Container-ийн үүрэг
1. Компонентын instance-г үүсгэх
2. Үүссэн байгаа instance-д бусад instance-г дамжуулах
3. Хийх арга болон комбинацыг DI Container-ийн тохиргоогоор удирдах

1 ба 2 нь DI-г гүйцэтгэлийг харуулж байна. Компонентын instance-г үүсгэх үед тохиргооны дагуу DI-ийн анхны утга олгох процессыг явуулна.
3 дахь нь DI container-ийн үүргийн чухал хэсэг юм. Тохиргоо нь ерөнхийдөө DI container-ийн тохиргооны файлаар явагдана.