Webフレームワークモジュール

2006年01月24日

1 Mayaaを使ってみる

ここではMayaaのモジュールを作ってみます。

1.1 Mayaaとは

Seasarプロジェクトで開発中のプレゼンテーションフレームワークです。
JSPの代わりに使えて、JSPみたいにHTMLじゃないものが混ざらないようにしたものです。
http://mayaa.sandbox.seasar.org/

MayaaのダウンロードサイトからBlank War(Mayaa-1.0.0.war)をダウンロードして展開しておいてください。
拡張子をzipに変えれば、そこらへんの解凍ツールが使えます。

1.2 ライブラリの登録

Mayaaで必要なライブラリファイルをライブラリマネージャーに登録します。
メニューの「ツール > ライブラリマネージャ」を選びます。


ライブラリマネージャが開くので「新規ライブラリ」ボタンを押します。


ライブラリ名には「Mayaa1.0」と入力して「了解」ボタンを押します。


ライブラリマネージャーに「Mayaa1.0」が追加されます。「クラスパス」タブを選択して「JAR/フォルダを追加」ボタンを押します。


Mayaa-1.0.0.warを展開したフォルダの「WEB-INF/lib」の中のjarファイルをすべて選択します。


追加されました。


ついでにソースファイルも追加します。「ソース」タブを開いてください。


srczipフォルダからmayaa-src1.0.0.zipを選択します。


JavaDocがあるときは、JavaDocも登録しておきます。このときindex_all.htmlかindex_filesフォルダが必要になるのですが、MayaaのJavaDocには含まれていないので登録できません。


必要なファイルの登録が終わったら「了解」ボタンを押してください。

1.3 Mayaaを試してみる

ちょっとMayaaを試してみましょう。

プロジェクトの作成

Webアプリケーションを作成します。
メニューから「ファイル > 新規プロジェクト」を選択してください。


「新規プロジェクト」でカテゴリ「Web」の「Webアプリケーション」プロジェクトを作成します。


「新規Webアプリケーション」で「プロジェクト名」に「MayaaSample」と入力して、プロジェクトの場所を適当に選んで「完了」ボタンを押します。


ライブラリの追加

プロジェクトのツリーの「ライブラリ」で右クリックしてメニューから「ライブラリを追加」を押します。


「ライブラリを追加」に先ほど登録したMayaaライブラリが表示されているので「Mayaa1.0」を選択して「ライブラリを追加」ボタンを押します。


ライブラリが登録されました。


web.xmlの編集

次にweb.xmlを開いてください。
「サーブレット」ビューを開いて「サーブレット要素を追加」ボタンを押します。


「サーブレットを追加」ダイアログで、サーブレット名に「MayaaServlet」、サーブレットクラスに「org.seasar.mayaa.impl.MayaaServlet」、URLパターンに「*.html」を入力して「了解」ボタンを押します。


「起動順序」に「1」を入力しておきます。


「XML」ビューを開くとこんな感じのServletマッピングが生成されています。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=
      "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>MayaaServlet</servlet-name>
        <servlet-class>org.seasar.mayaa.impl.MayaaServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        </servlet>
    <servlet-mapping>
        <servlet-name>MayaaServlet</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
	<welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>

ファイルを作成

HTMLファイルを作成します。
メニューから「新規 > HTML」を作成します。


HTMLファイル名に「index」を入力して「完了」ボタンを押します。


このファイルには次のように入力します。

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=EUC-JP">

<title>Welcome!</title>

</head> <body>

<p> <span id="message">Mayaa engine suspended.</span> </p>

</body> </html>

このファイルにはidにmessageが設定されたspanタグがあります。Mayaaではこのようなタグに値を流し込みます。
そこで、このタグに値を設定するmayaaファイルを作成します。
「新規 > 空のファイル」を作成してください。


ファイル名に「index.mayaa」と入力して「完了」ボタンを押してください。


このファイルには次のように入力します。

index.mayaa

<?xml version="1.0" encoding="iso-8859-1"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">

    <m:write m:id="message" 
        value="Welcome to the Mayaa's template driven development!"/>

</m:mayaa>

それでは実行してみます。
「index.html」ファイルを右クリックしてメニューから「ファイルを実行」を選択してください。


実行が始まります。


ブラウザで次のように表示されます。mayaaファイルに指定したメッセージがhtmlファイルに流し込まれています。

2 サンプルプロジェクト

先ほど試しに動かすために使ったプロジェクトをサンプルプロジェクトにしてみましょう。

2.1 モジュールの作成

モジュールプロジェクトを作成します。


プロジェクトの名前に「MayaaModule」、プロジェクトの場所を適当に選んで、「スタンドアローンモジュール」を選択して「次へ」ボタンを押して下さい。


コード名ベースにはパッケージ名を入力します。今回は「mayaa」とします。モジュール表示名は「Mayaa Module」としておきます。
「完了」ボタンを押すとプロジェクトの生成が始まります。

2.2 ライブラリの登録

まず、Mayaa用ライブラリをモジュールに組み込んでおきます。
新規ファイルで「J2SEライブラリ記述子」を選択して「次へ」ボタンを押します。


「ライブラリ」として先ほどの「Mayaa1.0」を選択して「次へ」ボタンを押します。


ライブラリ名、表示名には「Mayaa1.0」としておきます。パッケージは使われないので「mayaa」のままで、「完了」ボタンを押します。

2.3 プロジェクトの登録

それではプロジェクトを登録しましょう。
新規ファイルで「プロジェクトテンプレート」を選択して「次へ」ボタンを押します。


「プロジェクト」として先ほどの「MayaaSample」を選択して「次へ」ボタンを押します。


テンプレート名に「MayaaSample」、表示名に「Mayaa Sample」、カテゴリに「サンプル」、パッケージに「mayaa.sampleproject」を入力して「完了」ボタンを押します。


mayaa.sampleprojectパッケージにプロパティーファイルを「Bundle」という名前で作成してください。


次のように入力します。

mayaa/sampleproject/Bundle.properties

Templates/Project/Samples/MayaaSampleProject.zip=Mayaa Sample

2.4 実行

それでは実行してみましょう。


別のNetBeansの起動が始まります。


新規プロジェクトのサンプルカテゴリーに「Mayaa Sample」が追加されています。


「次へ」を押すと次のように表示されます。ここで「完了」ボタンを押すとサンプルプロジェクトが生成されます。



3 mayaaファイルの登録

mayaaファイルをファイル種別として登録しましょう。

3.1 ファイルの種類を登録

新規作成で「ファイルの種類」を選びます。


MIMEタイプは今回は「text/x-mayaa」とします。「ファイル名拡張子による」を選んで、拡張子に「mayaa」を入力して「次へ」ボタンを押します。


クラス名の接頭辞に「MayaaFile」、パッケージに「mayaa.filetype」を入力します。


アイコンは今回はhttp://mayaa.sandbox.seasar.org/favicon.icoをGIFに変換して使います。


新規作成のテンプレートファイルが作成されるので、次のように編集しておきます。

mayaa/MayaaFileTemplate.mayaa

<?xml version="1.0" encoding="iso-8859-1"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">


</m:mayaa>

3.2 実行

それでは実行してみます。
適当にプロジェクトを開いて新規ファイルダイアログを開くと「その他」カテゴリーに「空のMayaaFileファイル」というファイルが追加されています。


ファイル名に「test」と入力して作成してみます。


次のようなファイルが作成されます。



4 Webフレームワークとして登録

最後に、Webアプリケーションプロジェクトを作成するときに登録できるWebフレームワークとして登録します。

4.1 ライブラリ

ライブラリに
を登録します

4.2 ウィザードの作成

新規ファイルから「ウィザード」を選択して「次へ」ボタンを押します。


ウィザードの種類では、ウィザードパネルの数に「1」を入力して「次へ」を押します。


クラス名の接頭辞に「MayaaWebModule」、パッケージに「mayaa.webmodule」を入力して「完了」ボタンを押します。


SampleAction.javaは不要なので消しておきます。

登録

mayaa.webmoduleパッケージにBundleという名前でプロパティーファイルを作成して次のように入力します。

mayaa/webmodule/Bundle.properties

# Sample ResourceBundle properties file
Mayaa_Name=Mayaa 1.0
Mayaa_Desc=Mayaa 1.0

mayaa.webmoduleパッケージにJavaクラスを「MayaaWebModule」という名前で作成して次のように入力します。

mayaa/webmodule/MayaaWebModule.java

package mayaa.webmodule;

import java.io.File; import java.util.Set; import org.netbeans.modules.web.api.webmodule.WebModule; import org.netbeans.modules.web.spi.webmodule.FrameworkConfigurationPanel; import org.netbeans.modules.web.spi.webmodule.WebFrameworkProvider; import org.openide.util.NbBundle;

/** * * @author kishida */

public class MayaaWebModule extends WebFrameworkProvider{

/** Creates a new instance of MayaaWebModule */ public MayaaWebModule() {

super( NbBundle.getMessage(MayaaWebModule.class, "Mayaa_Name"), //NOI18N NbBundle.getMessage(MayaaWebModule.class, "Mayaa_Desc")); //NOI18N

} public Set extend(WebModule wm) {

return null;

} public boolean isInWebModule(WebModule wm) {

return true;

} public File[] getConfigurationFiles(WebModule wm) {

return null;

} public FrameworkConfigurationPanel getConfigurationPanel(WebModule wm) {

return new MayaaWebModuleWizardPanel1(true);

} }

layer.xmlにフレームワークとして登録します。

layer.xml

<folder name="j2ee"> <folder name="webtier"> <folder name="framework"> <file name="mayaa-webmodule-MayaaWebModule.instance"/> </folder> </folder> </folder>

<folder name="org-netbeans-api-project-libraries"> <folder name="Libraries"> <file name="Mayaa1.0.xml" url="Mayaa1.0.xml"/> </folder> </folder> </filesystem>


試しに実行

試しに実行してみます。
Webアプリケーションのプロパティを開くと次のようにフレームワークが表示されます。今のところMayaaが組み込まれているかどうかを判定していないので、どんなWebアプリケーションでも使用フレームワークにMayaa1.0が表示されます。


Webアプリケーションプロジェクトの新規作成時にも表示されますが、生成時の処理も記述していないのでなにも起こりません。


4.3 Webアプリケーションへの登録処理

それでは、Mayaaが組み込まれているかどうかの判定と、フレームワークの組み込み時の処理を行います。

mayaa/webmodule/MayaaWebModule.java

package mayaa.webmodule;

import java.io.File;

import java.io.IOException; import java.math.BigInteger;

import java.util.Set;

import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.netbeans.api.project.libraries.Library; import org.netbeans.api.project.libraries.LibraryManager; import org.netbeans.modules.j2ee.dd.api.web.DDProvider; import org.netbeans.modules.j2ee.dd.api.web.Servlet; import org.netbeans.modules.j2ee.dd.api.web.ServletMapping; import org.netbeans.modules.j2ee.dd.api.web.WebApp;

import org.netbeans.modules.web.api.webmodule.WebModule; import org.netbeans.modules.web.spi.webmodule.FrameworkConfigurationPanel; import org.netbeans.modules.web.spi.webmodule.WebFrameworkProvider;

import org.netbeans.spi.java.project.classpath.ProjectClassPathExtender; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileStateInvalidException; import org.openide.filesystems.FileSystem; import org.openide.filesystems.FileSystem.AtomicAction;

import org.openide.util.NbBundle; /** * * @author kishida */ public class MayaaWebModule extends WebFrameworkProvider{ /** Creates a new instance of MayaaWebModule */ public MayaaWebModule() { super( NbBundle.getMessage(MayaaWebModule.class, "Mayaa_Name"), //NOI18N NbBundle.getMessage(MayaaWebModule.class, "Mayaa_Desc")); //NOI18N }

public static final String MAYAA_SERVLET = "org.seasar.mayaa.impl.MayaaServlet";

public Set extend(WebModule wm) {

FileObject fo = wm.getDocumentBase(); Project project = FileOwnerQuery.getOwner(fo); //Mayaaライブラリの取得 Library lib = LibraryManager.getDefault().getLibrary("Mayaa1.0"); if(lib == null) return null; //ライブラリの追加 ProjectClassPathExtender pcpe = (ProjectClassPathExtender)project.getLookup().lookup(ProjectClassPathExtender.class); if(pcpe == null) return null; try { pcpe.addLibrary(lib); } catch (IOException ex) { return null; } //web.xml操作 FileSystem fs; try { fs = wm.getWebInf().getFileSystem(); } catch (FileStateInvalidException ex) { return null; } try { fs.runAtomicAction(new CreateMayaaConfig(wm)); } catch (IOException ex) { return null; }

return null; }

/** 一連のweb.xml操作 */ class CreateMayaaConfig implements FileSystem.AtomicAction{ WebModule wm; public CreateMayaaConfig(WebModule wm){ this.wm = wm; } public void run() throws IOException { //Web.xmlを取得 FileObject dd = wm.getDeploymentDescriptor(); WebApp wa = DDProvider.getDefault().getDDRootCopy(dd); if(wa == null) return; try { //Servletタグを追加 Servlet serv = (Servlet)wa.createBean("Servlet"); serv.setServletName("MayaaServlet"); serv.setServletClass(MAYAA_SERVLET); serv.setLoadOnStartup(new BigInteger("1")); wa.addServlet(serv); //Servletマッピングの追加 ServletMapping mapping = (ServletMapping)wa.createBean("ServletMapping"); mapping.setServletName(serv.getServletName()); mapping.setUrlPattern("*.html"); wa.addServletMapping(mapping); //書き込み wa.write(dd); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } }

/** Webモジュールで使われているかどうか判定 サーブレット定義があれば使われていると判定する */

public boolean isInWebModule(WebModule wm) {

//web.xmlの取得 FileObject dd = wm.getDeploymentDescriptor(); WebApp wa; try { wa = DDProvider.getDefault().getDDRoot(dd); } catch (IOException ex) { return false; } //サーブレットの検索 Servlet serv = (Servlet)wa.findBeanByName("Servlet", "ServletClass", MAYAA_SERVLET); return serv != null;

} public File[] getConfigurationFiles(WebModule wm) { return null; } public FrameworkConfigurationPanel getConfigurationPanel(WebModule wm) { return new MayaaWebModuleWizardPanel1(true); } }

実行

Webアプリケーションプロジェクトを作成して、フレームワークにMayaaを選択します。


Mayaaが組み込まれました。web.xmlにservletタグも追加されています。このservletタグを削除すると使用フレームワークから表示されなくなります。




Copyright (c) 2001-2006 Naoki Kishida All Rights Reserved.
http://www.fk.urban.ne.jp/home/kishida/