金曜日, 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-ийн тохиргооны файлаар явагдана.

月曜日, 12月 18, 2006

Jakarta POI гэж юу вэ?

Jakarta POI төсөл нь Microsoft-ийн Word, Excel гэх мэтийн баримтуудыг JAVA орчинд бүтээх зорилготой юм. Доор байгаа пакеж болон компонентууд нь POI төсөлд агуулагдана.
POIFS (Энэ нь болохоор JAVA-г ашиглаад OLE2 нийлмэл баримтын бүтцийг унших болон бичихэд зориулсан API багц юм)
HSSF (Мөн JAVA-г ашиглаад Microsoft Excel 97(-XP)-ийн sheet-ийг уншиж, бичихэд зориулсан API багц юм)
HWPF (Мөн JAVA-г ашиглаад Microsoft Word 97(-XP)-ийн баримтыг уншиж, бичихэд зориулсан API багц юм)
HPSF (JAVA дээр Property багцийг уншиж, бичихэд зориулсан API багц юм)


Дээрхээс миний хэрэглэж үзсэн нь HSSF юм. Жишээнүүдийг ашиглахын өмнө Jar файлыг өөрийн санд хуулах шаардлагатай. JAR Download
Мөн Eclipse ашиглан жишээг ажиллуулбал тохиромжтой. Жишээнд Import хийдэг хэсгийг хассан тул анхаараарай.
HSSF нь JAVA дээрээс Excel 97(-XP) файлын форматтай ажилладаг POI төслийн нэг хэсэг юм.
HSSF-ийг хэрэглэж Excel-ийн Sheet-нд өгөгдөл бичих, Sheet-ээс өгөгдөл унших, Sheet үүсгэх, засварлах зэрэг үйлдлийг хийж болно. Доорх жишээнүүдийг харна уу.


Шинэ Workbook үүсгэх
HSSFWorkbook wb = new HSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Шинэ Sheet үүсгэх
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet1 = wb.createSheet("new sheet");
HSSFSheet sheet2 = wb.createSheet("second sheet");
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Нүднүүд үүсгэх
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short)0);
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short)0);
cell.setCellValue(1);
// Or do it on one line.
row.createCell((short)1).setCellValue(1.2);
row.createCell((short)2).setCellValue("This is a string");
row.createCell((short)3).setCellValue(true);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Date Cell-үүдийг үүсгэх
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short)0);
// Create a cell and put a date value in it. The first cell is not styled
// as a date.
HSSFCell cell = row.createCell((short)0);
cell.setCellValue(new Date());
// we style the second cell as a date (and time). It is important to
// create a new cell style from the workbook otherwise you can end up
// modifying the built in style and effecting not only this cell but other cells.
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
cell = row.createCell((short)1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

cell-үүдийн ялгаатай төрлүүдтэй ажиллах
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
HSSFRow row = sheet.createRow((short)2);
row.createCell((short) 0).setCellValue(1.1);
row.createCell((short) 1).setCellValue(new Date());
row.createCell((short) 2).setCellValue("a string");
row.createCell((short) 3).setCellValue(true);
row.createCell((short) 4).setCellType(HSSFCell.CELL_TYPE_ERROR);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Demonstrates various alignment options
public static void main(String[] args)
throws IOException
{
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
HSSFRow row = sheet.createRow((short) 2);
createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER);
createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_CENTER_SELECTION);
createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_FILL);
createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_GENERAL);
createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_JUSTIFY);
createCell(wb, row, (short) 5, HSSFCellStyle.ALIGN_LEFT);
createCell(wb, row, (short) 6, HSSFCellStyle.ALIGN_RIGHT);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
}
/**
* Creates a cell and aligns it a certain way.
*
* @param wb the workbook
* @param row the row to create the cell in
* @param column the column number to create the cell in
* @param align the alignment for the cell.
*/
private static void createCell(HSSFWorkbook wb, HSSFRow row, short column, short align)
{
HSSFCell cell = row.createCell(column);
cell.setCellValue("Align It");
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(align);
cell.setCellStyle(cellStyle);
}

Хүрээнүүдтэй ажиллах
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short) 1);
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short) 1);
cell.setCellValue(4);
// Style the cell with borders all around.
HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(HSSFColor.GREEN.index);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(HSSFColor.BLUE.index);
style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
style.setTopBorderColor(HSSFColor.BLACK.index);
cell.setCellStyle(style);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Дүүргэлт болон өнгүүд
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short) 1);
// Aqua background
HSSFCellStyle style = wb.createCellStyle();
style.setFillBackgroundColor(HSSFColor.AQUA.index);
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);
HSSFCell cell = row.createCell((short) 1);
cell.setCellValue("X");
cell.setCellStyle(style);
// Orange "foreground", foreground being the fill foreground not the font color.
style = wb.createCellStyle();
style.setFillForegroundColor(HSSFColor.ORANGE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
cell = row.createCell((short) 2);
cell.setCellValue("X");
cell.setCellStyle(style);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Нүднүүдийг нэгтгэх
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
HSSFRow row = sheet.createRow((short) 1);
HSSFCell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of merging");
sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Фонттой ажиллах
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short) 1);
// Create a new font and alter it.
HSSFFont font = wb.createFont();
font.setFontHeightInPoints((short)24);
font.setFontName("Courier New");
font.setItalic(true);
font.setStrikeout(true);
// Fonts are set into a style so create a new one to use.
HSSFCellStyle style = wb.createCellStyle();
style.setFont(font);
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of fonts");
cell.setCellStyle(style);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Тогтсон өнгүүд
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow((short) 0);
HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("Default Palette");
//apply some colors from the standard palette,
// as in the previous examples.
//we'll use red text on a lime background
HSSFCellStyle style = wb.createCellStyle();
style.setFillForegroundColor(HSSFColor.LIME.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
HSSFFont font = wb.createFont();
font.setColor(HSSFColor.RED.index);
style.setFont(font);
cell.setCellStyle(style);
//save with the default palette
FileOutputStream out = new FileOutputStream("default_palette.xls");
wb.write(out);
out.close();
//now, let's replace RED and LIME in the palette
// with a more attractive combination
// (lovingly borrowed from freebsd.org)
cell.setCellValue("Modified Palette");
//creating a custom palette for the workbook
HSSFPalette palette = wb.getCustomPalette();
//replacing the standard red with freebsd.org red
palette.setColorAtIndex(HSSFColor.RED.index,
(byte) 153, //RGB red (0-255)
(byte) 0, //RGB green
(byte) 0 //RGB blue
);
//replacing lime with freebsd.org gold
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);
//save with the modified palette
// note that wherever we have previously used RED or LIME, the
// new colors magically appear
out = new FileOutputStream("modified_palette.xls");
wb.write(out);
out.close();

Workbook-үүдийг Унших болон дахин бичих
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("workbook.xls"));
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row = sheet.getRow(2);
HSSFCell cell = row.getCell((short)3);
if (cell == null)
cell = row.createCell((short)3);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("a test");
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Нүдэнд шинэ нүд хэрэглэх
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet s = wb.createSheet();
HSSFRow r = null;
HSSFCell c = null;
HSSFCellStyle cs = wb.createCellStyle();
HSSFFont f = wb.createFont();
HSSFFont f2 = wb.createFont();
cs = wb.createCellStyle();
cs.setFont( f2 );
//Word Wrap MUST be turned on
cs.setWrapText( true );
r = s.createRow( (short) 2 );
r.setHeight( (short) 0x349 );
c = r.createCell( (short) 2 );
c.setCellType( HSSFCell.CELL_TYPE_STRING );
c.setCellValue( "Use \n with word wrap on to create a new line" );
c.setCellStyle( cs );
s.setColumnWidth( (short) 2, (short) ( ( 50 * 8 ) / ( (double) 1 / 20 ) ) );
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );
wb.write( fileOut );
fileOut.close();

Data Formats HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("format sheet");
HSSFCellStyle style;
HSSFDataFormat format = wb.createDataFormat();
HSSFRow row;
HSSFCell cell;
short rowNum = 0;
short colNum = 0;
row = sheet.createRow(rowNum++);
cell = row.createCell(colNum);
cell.setCellValue(11111.25);
style = wb.createCellStyle();
style.setDataFormat(format.getFormat("0.0"));
cell.setCellStyle(style);
row = sheet.createRow(rowNum++);
cell = row.createCell(colNum);
cell.setCellValue(11111.25);
style = wb.createCellStyle();
style.setDataFormat(format.getFormat("#,##0.0000"));
cell.setCellStyle(style);
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Нэг хуудсанд Sheet-ийг багтаах
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("format sheet");
HSSFPrintSetup ps = sheet.getPrintSetup();

sheet.setAutobreaks(true);

ps.setFitHeight((short)1);
ps.setFitWidth((short)1);
// Create various cells and rows for spreadsheet.
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Хэвлэлтийн бүсийг тохируулах
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Sheet1");
wb.setPrintArea(0, "$A$1:$C$2");
//sets the print area for the first sheet
//Alternatively:
//wb.setPrintArea(0, 0, 1, 0, 0) is equivalent to using the name reference (See the JavaDocs for more details)
// Create various cells and rows for spreadsheet.
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Хуудасны дугаарыг Footer-т тохируулах
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("format sheet");
HSSFFooter footer = sheet.getFooter()

footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );

// Create various cells and rows for spreadsheet.
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Headers and Footers
Example is for headers but applies directly to footers.
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
HSSFHeader header = sheet.getHeader();
header.setCenter("Center Header");
header.setLeft("Left Header");
header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +
HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();