JavaのバージョンとAxis2

以前Java1.6、Axis1.4.1でクライアントアプリでSORP通信を行っていたときには問題なかったが、
Java1.5にしたら「java.lang.NoClassDefFoundError: javax/xml/stream/XMLStreamException」が発生してしまった。

どうやらJava1.6の標準ライブラリにあってJava1.5には無いものらしい。
んで、「geronimo-stax-api_1.0_spec-1.0.1.jar」、「activation.jar」、「wstx-asl-3.2.4.jar」をクラスパスに通したらうまくいった。
activation.jarはJAFから落とします。


いらないと思ったjarを除去したからいけないんだけどね・・・( -_-)


ちなみにXML作成して、SORP通信して、レスポンスを解析するだけのアプリなら以下で十分のはず

Java 1.5Java 1.6
axiom-api-1.2.7.jaraxiom-api-1.2.7.jar
axiom-dom-1.2.7.jaraxiom-dom-1.2.7.jar
axiom-impl-1.2.7.jaraxiom-impl-1.2.7.jar
axis2-kernel-1.4.1.jaraxis2-kernel-1.4.1.jar
backport-util-concurrent-3.1.jarbackport-util-concurrent-3.1.jar
commons-codec-1.3.jarcommons-codec-1.3.jar
commons-httpclient-3.1.jarcommons-httpclient-3.1.jar
geronimo-stax-api_1.0_spec-1.0.1.jar不要
activation.jar不要
neethi-2.0.4.jarneethi-2.0.4.jar
wsdl4j-1.6.2.jarwsdl4j-1.6.2.jar
wstx-asl-3.2.4.jar不要
XmlSchema-1.4.2.jarXmlSchema-1.4.2.jar

PostGISを利用してみる。

使用するのは
 PostgreSQL8.2.3
 PostGIS1.2

PostgreSQLPostGISのインストール手順は省きます。


PostGISを利用するにはデータベース作成時に「template_postgis」をテンプレートに指定します。

createdb -U postgres -E UTF-8 -T template_postgis SampleDB


つづいて以下のようなテーブルを作成します。

カラム名
idserial
pointgeometry
linegeometry
polygongeometry

まずはテーブルを作成します。

CREATE TABLE SAMPLE (id SERIAL);


上記ではidのみを作成しました。
次にジオメトリを使用する場合は

AddGeometryColumn(table_name, column_name, srid, type, dimension)

を使用します。

引数は以下の通り
table_name : 追加するテーブル名
column_name : 追加するカラム名
srid : SPATIAL_REF_SYSテーブルに存在する値(不明時には-1)
type : 型
dimension : 次元


上記を参考にAddGeometryColumn関数を使用するとSAMPLEテーブルにカラムが追加されます。

SELECT AddGeometryColumn('sample', 'point', 4326, 'POINT', 2);
SELECT AddGeometryColumn('sample', 'line', 4326, 'LINESTRING', 2);
SELECT AddGeometryColumn('sample', 'polygon', 4326, 'POLYGON', 2);

次にINSERT文

INSERTする際に以下の関数を使用して、文字列からgeometry型に変換します。

GeomFromText("文字列", srid)


INSERT文のサンプルです。

INSERT INTO SAMPLE (point, line, polygon) VALUES (GeomFromText('POINT(50 50)', 4326), GeomFromText('LINESTRING(1 1, 99 99)', 4326), GeomFromText('POLYGON((25 25, 75 25, 75 75, 25 75, 25 25))', 4326));


ここで

GeomFromText('POLYGON((25 25, 75 25, 75 75, 25 75, 25 25))', 4326)

ポリゴンだけが小括弧2つで囲まれていますが

GeomFromText('POLYGON((25 25, 75 25, 75 75, 25 75, 25 25), (30 30, 70 30, 70 70, 30 70, 30 30))', 4326)

のように複数書くことが出来るらしいです。
ちなみに小括弧を1つにするとエラーが発生します。(ここではまった><)


登録したジオメトリを取得します。

SELECT AsText(polygon) AS polygon FROM SAMPLE;


AsText関数を使用します。

AsText(カラム名)


AsText関数を使用しないと以下のようになってしまいます。

SELECT polygon AS polygon FROM SAMPLE;

polygon
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0103000020E61000000100000005000000000000000000394000000000000039400000000000C0524000000000000039400000000000C052400000000000C0524000000000000039400000000000C0524000000000000039400000000000003940
ST_Intersects(geometry1, geometry2)

この関数を使用することで一定の領域に含まれているか調べます。

geometry1とgeometry2が共通領域を持っていればTrueを返します。(geometry1∩geometry2が存在する場合True)

SELECT CASE WHEN ST_Intersects(point, polygon)
            THEN '含まれている'
            ELSE '含まれていない'
       END
  FROM SAMPLE;

上記のSQLを実行すれば「含まれている」が表示されると思います。

GoogleMapsの右上、左下の緯度経度を取得する。

var map;
・
・
・
function sample() {
    var bounds = map.getBounds();
    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();

    window.alert("右上緯度:" + ne.lat());
    window.alert("右上経度:" + ne.lng());

    window.alert("左下緯度:" + sw.lat());
    window.alert("左下経度:" + sw.lng());
}

以上です。

Struts2とTiles

Struts2でTilesを使用する方法

必要なjarファイルは以下のもの

  • commons-beanutils-1.7.0.jar
  • commons-collections-3.2.jar
  • commons-digester-1.8.jar
  • struts2-tiles-plugin-2.1.6.jar
  • tiles-api-2.0.6.jar
  • tiles-core-2.0.6.jar
  • tiles-jsp-2.0.6.jar


そしてweb.xmlに以下のフィルターを記述

<listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>


ついでといっては何だがstruts.xmlにも以下を記述

<result-types>
    <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
</result-types>


基本設定は以上で終了。
続いて使用するレイアウト用のJSPと設定ファイルのtiles.xml


tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>
    <definition name="default.layout" template="/WEB-INF/classes/sample/tiles/layout.jsp">
        <put-attribute name="header" value="/WEB-INF/classes/sample/tiles/header.jsp"/>
        <put-attribute name="content" value="/WEB-INF/classes/sample/tiles/content.jsp"/>
        <put-attribute name="footer" value="/WEB-INF/classes/sample/tiles/footer.jsp"/>
    </definition>
</tiles-definitions>
<definition name="default.layout" template="/WEB-INF/classes/sample/tiles/layout.jsp">

でレイアウト用のJSPの指定をし、「default.layout」という名前で宣言します。

<put-attribute name="header" value="/WEB-INF/classes/sample/tiles/header.jsp"/>

でレイアウト用JSP内で使用するJSPを「header」という名前で宣言します。


layout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"
%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <meta name="author" content="shhirose">
    <title>Insert title here</title>
</head>
<body>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="content"/>
<tiles:insertAttribute name="footer"/>
</body>
</html>

まずはレイアウト用のJSP

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>

Tilesのタグを使用するためにタグリブ宣言をします。

<tiles:insertAttribute name="header"/>

「header」という名前で設定してあるJSPをこれが記載されている位置に表示します。(tiles.xmlを参照)


main.jsp

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"
%><%@ taglib uri="/struts-tags" prefix="s"
%><tiles:insertDefinition name="default.layout"/>

DOCTYPEやHTMLタグはlayout.jspに記載されているので省略します。

<tiles:insertDefinition name="default.layout"/>

「default.layout」という名前で宣言されているJSPをこれが記載されている位置に表示します。(tiles.xmlを参照)


header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><div style="border-style:solid;border-color:#00FF00;border-weight:5px;">ヘッダー</div>

とりあえず簡単なものを。
main.jspと同じようにDOCTYPE等は記述しません。
この要領でcontent.jsp、footer.jspを記述していきます。


content.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><div style="border-style:solid;border-color:#0000FF;border-weight:5px;">コンテンツ</div>


footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><div style="border-style:solid;border-color:#FF0000;border-weight:5px;">フッター</div>


あとはmain.jspを呼んでください。
そうするとヘッダー、コンテンツ、フッターという文字が表示されたページが表示されると思います。



呼び出しは以下の順?

  1. main.jsp
  2. tiles.xml(default.layout)
  3. layout.jsp
  4. tiles.xml(header)
  5. header.jsp
  6. tiles.xml(content)
  7. content.jsp
  8. tiles.xml(footer)
  9. footer.jsp


直接呼び出せるのはtile.xmlで「definition」タグで指定したものしかできないらしい。
「put-attribute」タグで宣言したものは「definition」タグで指定したJPSを経由しないとエラーになってしまう。
直接layout.jspは呼べないものか・・・。

Struts2の利用(1)

Struts2.1.6

Struts2で最低限使用するjarは

  • commons-logging-1.0.4.jar
  • freemarker-2.3.13.jar
  • ognl-2.6.11.jar
  • struts2-core-2.1.6.jar
  • xwork-2.1.2.jar
  • commons-fileupload-1.2.1.jar

あとは


Struts2ではStruts1での設定ファイル(struts-config.xml)を記載しないZero Configuration(ゼロコンフィグレーション)が可能です。

とりあえず設定ファイルを記載する方法でも可能なのでStruts1からの移行も簡単な方

設定ファイル
struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <!-- プロパティファイル名 -->
    <constant name="struts.custom.i18n.resources" value="MessageResources"/>
    <!-- デフォルトロケール -->
    <constant name="struts.local" value="ja"/>
    <!-- ファイルアップロード時のディレクトリ
    <constant name="struts.multipart.saveDir" value="C:\"/> -->
    <!-- ファイルアップロード時の最大ファイルサイズ
    <constant name="struts.multipart.maxSize" value="2097152"/> -->
    <!-- 拡張子 -->
    <constant name="struts.action.extension" value="html"/>
    <!-- URLでのメソッド指定
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/> -->
    <!-- デバックモード有無
    <constant name="struts.devMode" value="true"/> -->
    <!-- HTTPポート
    <constant name="struts.url.http.port" value="80"/> -->
    <!-- HTTPSポート
    <constant name="struts.url.https.port" value="443"/> -->
    <!-- UIタグのテーマ
    <constant name="struts.ui.theme" value="xhtml"/> -->
    <!-- UIタグのテンプレートディレクトリ
    <constant name="struts.ui.templateDir" value="template"/> -->

    <!-- パッケージ -->
    <package name="Sample1" namespace="/" extends="struts-default">
        <!-- インターセプター -->
        <interceptors>
            <!-- 独自インターセプター -->
            <interceptor name="accessLog" class="org.struts2.interceptor.AccessLogIntegerceptor"/>
            <interceptor name="sqlmapp"   class="org.struts2.interceptor.SqlMapInterceptor"/>

            <!-- インターセプタースタック -->
            <interceptor-stack name="interceptorStack">
                <interceptor-ref name="accessLog"/>
                <interceptor-ref name="sqlmap"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>

        <!-- インターセプタースタック設定 -->
        <default-interceptor-ref name="interceptorStack"/>

        <global-results>
            <result name="index">/</result>
        </global-results>

        <action name="Top" class="example.TopAction">
            <result name="success">WEB-INF/classes/example/Top.jsp</result>
            <result name="error">WEB-INF/classes/example/Top.jsp</result>
        </action>

    </package>

</struts>

Struts2からはstruts.xmlに変更なりました。

interceptorタグでインターセプターの指定をして
interceptor-stackタグのinterceptor-refタグでスタックに入れます。

interceptor-refにあるdefaultStackはstruts-core.jarでstruts-default.xmlで指定されています。


あとは記述方法が変わっている部分もあるけど基本はStruts1のstruts-config.xmlと同じです。

Struts2のActionInvocationから取得できる情報

Struts2のインターセプターでアクセスログを出力する際の利用メソッド


アクション名

ActionInvocation#getProxy()#getConfig()#getClassName()

classes以下のフルパスなのでアクション名のみを取得するならsubStringなどを利用


メソッド名

ActionInvocation#getProxy()#getMethod()


実行結果

ActionInvocation#getResultCode()

これはexecuteメソッドなどでの戻り値


遷移先のJSPパスなんかは取れないんだろうか?

Apacheを使用したDigest認証

仕事でダイジェスト認証を調査することになったので・・・。

1、Apache2.2.11をインストール
2、設定ファイル(httpd.conf)の変更


1は他のサイトを参照してください。
2の設定ファイルについてちょっとはまったので。

前提としてApacheのインストールディレクトリを

C:\Program Files\Apache Software Foundation\Apache2.2\

とし、ダイジェスト認証を行うためのディレクトリを

C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test

とします。


httpd.confの

#LoadModule auth_digest_module modules/mod_auth_digest.so

のコメントをはずします。


次に

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

の部分を以下のように変更します。

<Directory "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test">
    AuthType Digest
    AuthName aaa
    AuthUserFile C:\.htdigest
    Require user secret
</Directory>

ここでApache2.2以前だとAuthDigestFileとなっていたところがAuthUserFileとなっています。
コレのせいで結構時間を奪われた;


次にID、パスワードの設定
コマンドプロンプトを開いて

cd "C:\Program Files\Apache Software Foundation\Apache2.2\bin"

binフォルダまで移動します。

C:\Program Files\Apache Software Foundation\Apache2.2\bin>htdigest -c C:\.htdigest aaa secret

上のコマンドを入力します。
C:\.htdigestはパスワードのダイジェストファイル(httpd.confのAuthUserFile)を指定します。
aaaはhttpd.confのAuthNameの値を。
secretはIDを指定します。

そうすると

Adding password for secret in realm aaa.
New password: ****
Re-type new password: ****

となるのでNew passwordとRe-type new passwordにパスワードを入力してください。

以上の設定が終わったらApacheを再起動し、http://localhost:8080/test/ファイル名にアクセスしてみてください。
うまくいけばIDとパスワードを聞かれるはずです(=ω=)