ブログ アーカイブ

ラベル Tomcat の投稿を表示しています。 すべての投稿を表示
ラベル Tomcat の投稿を表示しています。 すべての投稿を表示

2008年6月10日火曜日

Tomcat上でJBossSeamを動かす

Tomcat上でJBossSeamのサンプルを動かしてみます。

筆者の環境
  • JDK1.6.0_05
  • Tomcat6.0.16
  • Apache Ant1.7.0
  • Maven Ant Tasks2.0.9
  • JBoss Seam2.0.2.SP1
Maven Ant TasksはMaven ProjectからダウンロードしてAntのlibフォルダにコピーしておきます。

手順
※ $SEAM_HOMEはJBossSeamのフォルダ、$CATALINA_HOMEはTomcatのフォルダです。
$ cp $SEAM_HOME/lib/hsqldb.jar $CATALINA_HOME/lib
$ cd $SEAM_HOME/examples/jpa
$ ant tomcat6
$ cp dist-tomcat6/jboss-seam-jpa.war $CATALINA_HOME/webapps
これでサンプルのデプロイ完了です。
Tomcatを起動してhttp://localhost:8080/jboss-seam-jpa/をブラウザで開けばサンプルアプリケーションが表示されます。


Login NameとPasswordはともにdemoでログインできます。


次回は自作のサンプルを動かしてみます。

Tomcat上でEJB3を動かす

Embeddable EJB 3.0を使用してTomcat上でEJB3.0を動かしてみます。

筆者の環境
  • JDK1.6.0_05
  • Tomcat6.0.16
  • Eclipse 3.3.1.1

Embeddable EJB3.0をダウンロードして解凍します。
※Preview RC9はTomcatデプロイ時にエラーとなってしまうためRC8を取得してください。

まずはEmbeddable EJB3.0の動作確認を行います。


はじめにEmbeddable EJBのjarファイルをUser LibraryとしてEclipseに定義してしまいます。



EclipseでDynamic Web Projectを作成します。今回はプロジェクト名をEJB3OnTomcatにしました。
srcにEmbeddable EJB3.0のconfフォルダにあるファイルを全てコピーします。


ProjectのPropertiesのJava Build Pathで、Libraryに先ほど定義したEmbeddable EJBのライブラリを追加します。



さらにJ2EE Module DependenciesでもEmbeddable EJBのライブラリを選択します。



上記の操作が終わったらTomcatにデプロイして起動してみます。
例外が無く正常に起動できればOKです。ちょっと警告が出ますが、とりあえず気にしないでおきます。

次にプログラムを書きます。

まずはEJBのプログラムです。EJBはjarファイルにしてWEB-INF/libに配置する必要があるので、別プロジェクトに作成します。
EclipseでJava Projectを作成します。プロジェクト名はEJB3OnTomcatEJBにしました。
Webプロジェクトと同様に、ProjectのPropertiesのJava Build Pathで、Embeddable EJBのライブラリを追加します。

プロジェクトのsrcディレクトリに以下の4つのファイルを作成します。

META-INF/persistence.xml
永続化定義です。defaultの永続化機構をjava:/DefaultDSにマップします。java:/DefaultDSの定義は、Webプロジェクトのembedded-jboss-beans.xmlに記述してあります。
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="default">
<jta-data-source>java:/DefaultDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>


tekit/ejb3tomcat/ejb/Car.java
Entity Beanです。
package tekit.ejb3tomcat.ejb;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Integer price;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}


tekit/ejb3tomcat/ejb/CarDAO.java
SessionBeanのインターフェイスです。
package tekit.ejb3tomcat.ejb;

import java.util.List;
import javax.ejb.Local;
import javax.ejb.Remote;

@Local
@Remote
public interface CarDAO {
public abstract void create(String name, Integer price);
public abstract List getList();
}


tekit/ejb3tomcat/ejb/CarDAOBean.java
SessionBeanの実装です。
package tekit.ejb3tomcat.ejb;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class CarDAOBean implements CarDAO{
@PersistenceContext
private EntityManager em;

public void create(String name, Integer price) {
Car car = new Car();
car.setName(name);
car.setPrice(price);
em.persist(car);
}

public List getList(){
return em.createQuery("select c from Car c").getResultList();
}
}



次にWebのプログラムを書きます。EJBを参照するのでProjectのPreferencesにて、J2EE Module Dependenciesの設定でEJB3OnTomcatEJBプロジェクトを選択します。


EJBを呼び出すロジックはJSPに書いてしまいます。
WebContent/index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="tekit.ejb3tomcat.ejb.Car"%>
<%@page import="java.util.Hashtable"%>
<%@page import="tekit.ejb3tomcat.ejb.CarDAO"%>
<%@page import="javax.naming.InitialContext"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Tomcat上でEJB3.0を動かすサンプル</title>
</head>
<body>

<%
// EJBを取得する
Hashtable<String, String> props = new Hashtable<String, String>();
props.put("java.naming.factory.initial", "org.jnp.interfaces.LocalOnlyContextFactory");
props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
CarDAO dao = (CarDAO)new InitialContext(props).lookup("CarDAOBean/local");

// 作成ボタンからの遷移ならエンティティを作成する
if("create".equals(request.getParameter("command"))){
dao.create(request.getParameter("name"), new Integer(request.getParameter("price")));
}

// エンティティを列挙する
for(Car car : dao.getList()){
%>
<%= car.getName() %> / <%= car.getPrice() %><br/>
<%
}
%>

<form action="./index.jsp" method="post">
名前<input name="name" type="text"/>
価格<input name="price" type="text"/>
<input name="command" value="create" type="submit" title="作成"/>
</form>

</body>
</html>

以上でプログラムは終了です。


Tomcatにデプロイして実行してみると、こんな感じで動作確認できます。


アルファ版なのですがEntityBeanとSessionBeanを使う分には問題なさそうです。
非力なPCで開発する際にJBossが重い場合は、Tomcat+EJBで開発してみるのも良いかもしれませんね。

次はTomcat上でJBoss Seamを動かしてみます。

2008年6月9日月曜日

Tomcat上でWebServiceを動かす

JBossやGlassFishも良いですが、開発時に使うには重たいです。
そこでTomcat上でWebServiceを使えるようにしてみます。


筆者の環境
  • JDK1.6.0_05
  • Tomcat6.0.16

Tomcat側でWebServiceを提供するためにJAX-WSのRI(リファレンス インプリメンテーション)を使用します。
ダウンロードしたjarを実行すると解凍されます。
$ wget https://jax-ws.dev.java.net/2.1.4/JAXWS2.1.4-20080502.jar
$ java -jar JAXWS2.1.4-20080502.jar

libフォルダにWebServiceの提供に必要なjarファイルが格納されています。

続いてプログラムの作成に進みます。まずはサーバー側です。
作成するのは
  • サービスを提供するクラス
  • web.xmlファイル
  • sun-jaxws.xmlファイル
の3つです。

サービスを提供するクラスです。
package tekit.wstomcat;
import javax.jws.WebService;

@WebService
public class SimpleWS {
public String echo(String message){
return message;
}
}


web.xmlはこんな感じです。サーブレットリスナとサーブレットにJAX-WS RIのクラスを使用しています。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>WebServiceOnTomcat</display-name>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>WSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<url-pattern>*.ws</url-pattern>
</servlet-mapping>
</web-app>


sun-jaxws.xmlはこんな感じです。このファイルはJAX-WS RI固有のファイルで、サービスを提供するクラスとそのURLをマップします。
※ ちなみにJBossの場合はsun-jaxws.xmlにあたるファイルは不要です。
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint implementation="tekit.wstomcat.SimpleWS" name="simpleWS" url-pattern="/simpleWS.ws"/>
</endpoints>


これでプログラムは揃ったので、先ほど解凍したJAX-WS RIのlibフォルダにあるjarファイルをWEB-INF/libにコピーし、warファイルを作成してTomcatにデプロイします。

Tomcatを起動してSimpleWSのwsdlを見てみます。
正常に起動できていれば、http://localhost:ポート/Webアプリ名/simpleWS.ws?wsldでwsdlを取得することができます。
URLの/simpleWS.wsの部分はweb.xmlとsun-jaxws.xmlの定義によって決まります。

次にこのWebServiceを呼び出すクライアント側を作成します。
まずはWebServiceを利用するためのクラス群(ポータブルアーティファクトと言うらしい)をwsdlから生成します。
パッケージ名とURLは適当に読み変えてください。
$ $JAVA_HOME/bin/wsimport.exe -keep -p tekit.wstomcat http://localhost:8080/WebServiceOnTomcat/simpleWS.ws?wsdl

コマンドが成功すると、classファイルとjavaファイルが生成されます。
これを使ってWebServiceを呼び出すプログラムを作成します。サーバーとクライアントでエンコーディングを揃えれば日本語も通ります。
import tekit.wstomcat.SimpleWS;
import tekit.wstomcat.SimpleWSService;

public class WSClient {
public static void main(String[] args) {
SimpleWS ws = new SimpleWSService().getSimpleWSPort();
System.out.println(ws.echo("ほげ"));
}
}

簡単ですね。動作も軽いのでストレス無く開発できます。
次回はTomcat上でEJB3を動かしてみようと思います。