2009年1月アーカイブ



Java Servlet 3.0 Specification

Public Review Ballotのフェーズを賛成多数で通過したが、

ASF(Apache Software Foundation)は、反対票を投じている。

しかし、ASFの反対票は技術的な問題ではなく、

政治的な問題によるものだといわれている。

 

Java Servlet 3.0 機能概要

次期Servletとなる3.0でどういった機能が実現されるのかの概要で、

特に興味深いトピックをまとめると次のとおりである。

 

  • Servlet 3.0 は、現在のServlet 2.5のアップデートバージョンであり、
    Java EE 6に取込まれる
  • Webフレームワークにプラガブル性や拡張性を提供する
  • 非同期処理のサポート登場
    (JDBC/Wev Service等リソース待ち機能。非同期レスポンス、非同期関連クラス導入)
  • 新しいアノテーションの導入によるEoDの推進
  • 単一のweb.xmlファイルから複数のファイルを含めるweb-fragment.xmlファイルの導入
  • HTTPServletRequestを拡張。ログインとログアウトのプログラマティックな処理を実現
  • Servletおよびフィルタを追加するメソッドの登場
    (ServletContext#addFilter, ServletContext#addServlet)

 

機能詳細ピックアップ

  • プラグインの容易性(Pluggability)
    web.xmlのモジュール化(ファイルの分割)
    ServletContextにServletとFilterの宣言とマッピングを定義するメソッドが追加
  • 開発の容易性(Ease of development)
    Servletは、アノテーション@Servletにより定義可能。これにより大幅に記述量を
    減らす事ができる。また@GET、@PUTを指定する事で、任意のメソッドをhttpの
    GETやPUT時のメソッドに指定する事ができる
    FilterとFilterのマッピングについては、@ServletFilterと@FilterMappingの
    アノテーションで宣言する事が可能
    Context Listnerについても、@ServletContextListnerアノテーションで宣言可能
  • 非同期Servletのサポート(Async servlet support)
    非同期Servletは、Cometスタイルのアプリケーションや、非同期Webプロキシー、
    非同期Webサービスでの利用が想定されており、requestのsuspendや
    resumeを可能にする。ServletRequest、RequestListner、ServletResponseへ
    非同期メソッドの追加
  • セキュリティのエンハンス(Security enhancements)
    セキュリティとして、ログイン、ログアウトを可能にするため、loginとlogoutのメソッド
    を次のクラスに追加する。HttpServletRequest 、HttpServletRequestWrapper、
    HttpSession (logout only)
  • HttpOnlyCookieのサポート
    クライアントサイドスクリプティングからのcookieへのアクセスを防ぎ、また、
    クロスサイトスクリプティング攻撃を防ぐ
  • session tracking cookieの設定を可能
    session tracking cookieの設定を可能にし、多数のsession trackingの
    サポートも行う

 

 ドキュメント、API

Servlet 3.0 の草案段階にあるAPIマニュアルと解説ドキュメントはJSR 315 から

ダウンロードできるようになっている。

Servlet 3.0 JSR315

 

Fedora

Fedora は、最先端のフリーソフトウェアやオープンソースソフトウェアを提供する、

Linux ベースのオペレーティングシステムです。誰でも自由に使用し、改変し、

そして配布することができます

Fedora Projectより)

 

最新の技術を積極的に取り入れている、Linuxディストリビューション、Fedora は、

現在バージョン10(Fedora 10)をリリースしている。

 

Fedora 10 リリースの特徴

  • ワイヤレス接続共有は、随時にネットワーク共有を有効にします
  • 管理ツールの改善を通じて、プリンターのより便利な設定と使用
  • ローカルとリモート接続の為の仮想化ストレージ供給は今回 簡素化されました
  • SecTool は新しいセキュリティ監査と侵入検出のシステムです
  • RPM 4.6 は強力で柔軟なソフトウェア管理ライブラリへの主要更新です
  • 欠陥のないオーディオとより良いパフォーマンスが PulseAudio サウンドサーバーの
    書き換えで達成されており、タイマーベースのオーディオスケジュールが使用できます
  • Improved webcam サポート
  • 赤外線リモート制御へのサポートの改善が接続を簡単にして、多くのアプリケーション
    と共に 機能するようにします
  • /usr/local/sbin:/usr/sbin:/sbin へのパスが 普通のユーザーの為に PATH に追加され、
    コマンドライン管理タスクを 簡素化します

Fedora 11

Fedora 11 のリリース予定が以下のとおり、発表されています。

  • 2009-02-03  Alpha Release
  • 2009-03-24  Beta Release
  • 2009-04-28  Preview Release
  • 2009-05-26  Fedora 11 Final Release

 

ファイルシステムにはデフォルトで「ext4」が採用されるとのことです。

「ext4」は、Fedora 9 の段階で、オプションとして既に使用できる環境ではあったが、

UbuntuOS 9.04 のインストーラでも「ext4」がサポートされるなど、気軽に使用できる

環境になってきたと言えそう。

 

そのほかの機能・特徴としては、

  • 「起動時間を短縮し,20秒以内にログイン画面を表示すること(20SecondStartup)」を目標
  • DeviceKit: 一部HALの置き換え、電力管理も含めたデバイスのプラグアンドプレイ。
    特にストレージ
  • 音量制御の改善: Fedora 8 で導入されたPulseAudioが古い。 マルチ入力・マルチ出力
    に対応し、マイクの入力も確認しながら、 簡単にボリューム制御できるようにする
  • Windowsクロスコンパイル: MinGWを利用して、Fedora 11からWindowsバイナリを
    コンパイルできる
  • RPM差分ファイルのサポート: yumのPrestoプラグインを利用して、 RPMの差分ファイル
    による更新が可能。Fedora の BodhiシステムがRPMの 差分を生成する
  • マルチシート環境: マルチモニタ、マルチキーボード、マルチマウスの 環境。
    X上でのマルチ・ディスプレイ・マネージャ (MDM)などを サポートする。

などが挙げられているようです。

 

コードネームは、「Leonidas」 に決定したそうです。

※「Leonidas」 は、紀元前480年にテルモピュライの戦いで戦死したスパルタ王の名で、

古代ギリシアの英雄だそうです。

 

 

 

あらゆる組織にOpenPNEを

"ソーシャルコンピューティング時代をひらく最良のコミュニケーションソフト"と表現

され、オープンソースで提供されているソーシャルネットワーキングサービス(SNS)エンジン

の「OpenPNE(オープン・ピーネ)」に最新版「OpenPNE3.0」が登場した。

 

バージョン2.0から2年9か月ぶりのメジャーバージョンアップとなる。

OpenPNEは手嶋屋が中心となって開発するオープンソースのSNSエンジンです。

 

ホームページより引用すると、

 

OpenPNEは、誰もが無料で自由に利用できるオープンソースのSNSソフトウエアです。

社内SNSやサークル、ソーシャルメディアやファンサイトなど、現在、30,000以上の組織が

OpenPNEを利用。多様な環境・組織に対応する柔軟性が高いソフトウェアです。

OpenPNEはダウンロードとホスティングのどちらでも利用可能。あらゆるサービスを

「ソーシャル」にできるOpenPNEを使って、コミュニティを活性化させましょう。

 

とのことです。

 

利用状況

"OpenPNE"は、手嶋屋が中心となって開発しているオープンソースのSNSエンジンで、

現在同社が把握しているだけで3万サイト、300万ID(ユーザー)での利用実績があり、

月間の平均ダウンロード数も7000程度とかなりの利用状況になっている。

 

機能・特徴

最新版になっての最大の特徴としては、6万行のコードをすべて書き直したとされている

「モジュール化」の機構である。

当初は、GREE、mixiに代表される、エンターテイメント向けのSNSと同様の機能を実装

してきたが、ユーザーの拡大に伴い、"OpenPNE"は様々な組織・組織形態で利用される

様になってきた。

 

「モジュール化」では、OpenPNEのエンジンを大きく、プラットフォーム部分の

「Social Graph Layer」とアプリケーション部の「Social Application Layer」に分離

させている。

 

アプリケーション部にて、「日記」「メッセージ」「レビュー」「メール投稿」「イベント」

「OpenPNEOfice」などの、機能が提供され、プラットフォーム部ではそれぞれの

機能のAPIとなるプラグインや認証機能、またコアとなるDBや、Core Application

(管理画面、プロフィール、コミュニティなど)で構成されている。

 

効果

モジュール化の効果として、プラグイン化、API化によるアプリケーション単位での

カスタマイズ、開発の手間を大幅に削減できることがあげられる。また複数のAPI

に対応することで、カスタマイズ、機能追加が非常に簡単にできるようになった。

 

今後

今後は、基本のシステムに対し、PayPalに対応した、決済アプリケーションを

はじめ各種のアプリケーションの提供をしていくとのこと。また、ビジネス向けには

捜査速度の向上(チューニング)とビジネス向けのアプリケーションの提供も予定

しているとのこと。

 

OpenPNE3.0の詳しいリリース情報はこちらから!

 

 

 

 

  • PHP5.3

PHPの次期バージョンの機能について。

2009年1月25日現在の安定板リリースは、php-5.2.8であるが、

次期バージョンとして、php-5.3.0alpha3が公開されている。

 

PHP6のリリースが遅れているということもあって、

PHP5.3では様々な機能追加がされているようなので

その内容について調べてみた。

 

機能

  • Pharアーカイブ
    標準機能として対応(Javaでいう.jarアーカイブのようなもの)
  • 高速化
    GCにてのメモリ効率の大幅な改善、循環参照の検出機構
  • 字句解析(スキャナ)の高速化
    flexからre2cへ
  • Namespace
    namespaceおよびclassを定義し、同名クラスの使い分けが可能
  • ?演算子
    A?:B 3項演算子の拡張形
  • Late Static Binding
    コンパイル時でなく実行時にスタティックイベントを処理する
  • MSQL ND
    DBにIFをネイティブ実装、メモリ・キャッシュ管理wpPHP側で可能
    使用メモリ40%低減、高速化
  • NOWDOC
    変数の展開をしないHEREDOC
    <<<'EOD' ...シングルクォートで囲む
  • goto文の採用

最後のgoto文は興味深い

いまさら感のあるgoto文。

いろいろな記事で、このgoto文について触れられているが

おおむね好意的にとらえられていそう。

(別にあったからどうってこともなく使わなければいいだけなので当然かもしれないが)

 

ただ、その昔からgoto文は絶対使ってはいけないなどの禁止令があったりと

いう事も聞くので、おのずと議論になるのでしょう。

goto文に限らずどのような命令・関数でもタブーな使い方はあるが、確かに

goto文はタブーをおかしてしまう可能性が高いと思う。

したがって、できる限り使用せずスマートなフローになるように考えるのが

プロフェッショナルかなと。その上でgoto文を採用するなら良し。

※教育にもよるが新人や経験の少ないひとは、まずはgoto文でフローを制御

せず自然な流れで処理を書けるように考えるのが実力アップにも繋がると思う。

 

php5.3 goto文について

 

参照

PHPに押し寄せるリスクと国際化

 

 

PDT2.0とは?

「PDT2.0」とは、Eclipse Foundation(ソフトウエア開発ツール関連の業界団体)が

開発している、Eclipse上で動作しPHPアプリケーションの開発に着手するために

必要とされる基本的なコード編集機能などを備えるオープンソースの開発ツール。

 

Eclipseについては特に説明する必要はないと思いますが、Javaの開発環境を

はじめ様々なシステム開発環境に対応できる統合開発環境(IDE)です。

Eclipse(エクリプス)を利用するためのわかりやすい情報はこちらを参照

 

Eclipse上で動作するPHPプラグインについては、他にも、「PHPeclipse」や

「TruStudio」なども存在します。

 

ダウンロード・インストール

私はEclipseは利用はしていますが、PHPをメインで利用していないので、

詳細は以下を参照してください。

私も機会があればPHP開発環境を構築してみようと思います。

※個人的には、Delphi for PHP2.0 が、3万円程度で購入できるので、そっち

がいいかなぁーと思ってますが...(試用版」もダウンロードできます)

 

PDT2.0の導入は、PDTプロジェクトのサイトよりダウンロードすることができます。

PDTの導入は、All-in-Oneパッケージにて解凍するだけでeclipseを含め、全て

利用できるパッケージがありますが、既存のeclipseへプラグインを追加して、

環境を構築することもできるようです(追加するプラグインが多いようなので少し

手間がかかるようです)

ここ、インストールについて詳しく書かれてます。

http://www.kabosu100.net/archives/2008/06/pdtxamppzenddebugger.html

 

機能・特徴(2.0での追加機能も含む)

  • 基本的なコード編集機能・コード補完機能
  • 関数定義位置へのジャンプ
  • PHP 組込み関数支援
  • ローカルヒストリー

  • リアルタイムエラー申告
  • オブジェクト指向機能をサポート
  • タイプの階層ビュー
  • タイプの情報を基にPHPコードを検索する機能
  • 上書きされたPHPメソッドにタグを付ける機能
  • 新しいインデックスおよびキャッシュ・エンジンを追加
  • PHPの変数の型に基づいたコード補完オプション

 

参照

 

JANコード

JANコードとは、ご存じのとおり、日本で最も普及している、

商品識別コードおよびバーコードの規格のひとつです。

 

商品のパッケージや梱包された箱に印刷されたり、シールが貼付けられ、

商品を識別するための情報として、POSシステムや、販売管理・在庫管理等、

様々なシステムで利用されています。

 

構成

JANのコード体系(構成)は以下のようになっている。

標準の13桁のコードまたは、8桁の短縮のコードが存在する。

13桁

 国コード(2桁) + メーカコード(5桁) + 商品コード(5桁) + チェックデジット(1桁)

 国コード(2桁) + メーカコード(7桁) + 商品コード(3桁) + チェックデジット(1桁)

8桁

 国コード(2桁) + メーカコード(4桁) + 商品コード(1桁) + チェックデジット(1桁)

 

日本の国コードは、"49"または"45"となっている。

 

チェックデジット

チェックデジットは、コードの入力誤りや、バーコードの読み取りミスを防止するために、

12桁のコードから算出した、誤り検出用の付加コードです。

コードを読みとった際に、再度チェックデジットを計算し、読み取ったチェックデジットと

相違がないかで確認をすることができる。

 

JANコードの作成

上記のように、JANコードは決められたルールを基に作成されていることがわかる。

特に、チェックデジットについては、作成した12桁のコードからさらに計算をおこない

13桁目のコードを算出することになる。

※チェックデジットの算出についてはここを参照。

 

そこで、簡単ではあるが、JANコード作成用のプログラムを作成してみた。

国コードは、"49"または"45"より選択し、メーカコード(5桁)、商品コード(5桁)の

タイプで入力し、"作成"ボタンを押すと、チェックデジットを計算し、13桁のJAN

コードを表示するという単純なものです。

※とりあえず最低限の対応をしてみました。

 

20090124.jpg

 

[JANコード作成]

 

(注)

C#でのプログラミングは慣れていないので、とりあえず動作するように、

調べつつ作成しています。より洗練されたプログラム記述あれば、

コメントください。

 

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace JanCodeMaker
{
    public partial class frmJan : Form
    {
        public frmJan()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cmbCountry.SelectedIndex = 1;
            txtMaker.Text = "";
            txtSyohin.Text = "";
            txtJan13.Text = "";
        }

        private void frmJan_Shown(object sender, EventArgs e)
        {
            txtMaker.Focus();

        }

        private void frmJan_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) {
                bool forward = e.Modifiers != Keys.Shift;
                this.SelectNextControl(this.ActiveControl, forward, true, true, true);
                e.Handled = true;
            }

        }

        //チェックディジットを計算する
        private void btnMake_Click(object sender, EventArgs e)
        {
            string source = cmbCountry.Text + txtMaker.Text + txtSyohin.Text;
            if (source.Length != 12) {
                MessageBox.Show("12桁で入力してください。");
            }

            int chk1 = 3 * (Int16.Parse(source.Substring( 1, 1)) +
                            Int16.Parse(source.Substring( 3, 1)) +
                            Int16.Parse(source.Substring( 5, 1)) +
                            Int16.Parse(source.Substring( 7, 1)) +
                            Int16.Parse(source.Substring( 9, 1)) +
                            Int16.Parse(source.Substring(11, 1)));
            int chk2 = 1 * (Int16.Parse(source.Substring( 0, 1)) +
                            Int16.Parse(source.Substring( 2, 1)) +
                            Int16.Parse(source.Substring( 4, 1)) +
                            Int16.Parse(source.Substring( 6, 1)) +
                            Int16.Parse(source.Substring( 8, 1)) +
                            Int16.Parse(source.Substring(10, 1)));
            int chk3 = 10 - ((chk1 + chk2) - (((chk1 + chk2) / 10) * 10));
           
            if (chk3 == 10) { chk3 = 0; }
            txtJan13.Text = source + chk3.ToString();
            //MessageBox.Show(chk1.ToString() + "/" + chk2.ToString() + "/" + chk3.ToString());
        }

    }
}

無線LAN子機新製品

2009年1月15日、バッファローより、無線LAN規格 11nドラフト2.0対応の無線LAN

子機の新製品が発表された。

 

USBタイプ(可動式アンテナ、超小型タイプ)2種と、ExpressCard用の合計3種だ。

 

可動式アンテナの、WLI-UC-G300HP は、従来製品より、電波の強度が約1.5倍

になっており、実測値も、11n無線LANを内蔵しているパソコンと比較して、約3.9倍

高速で高信頼性を大幅に向上させている。

また、本体には「感度レベルメーター」が搭載されており、電波状況を視覚的に確認

でき、確認しながらのアンテナの角度や場所などの調整が可能。

2月上旬出荷予定で、標準価格が4,935円となっている。

 

超小型アンテナの、WLI-UC-GN も、USB2.0用となっており、サイズは、幅16mm

×長さ33mm×厚さ8mmとなっており、従来の製品よりも大幅に小型化されている。

無線LANの子機としての使用だけでなく、パソコン上にソフトをインストールすると、

無線LANの親機としても動作させることができる。

こちらも2月上旬出荷予定で、標準価格が2,205円となっている。

 

ExpressCard用の、WLI-EXC-AG300N は、11a/g/b/nドラフト2.0に対応しており、

11nは2.4GHz帯、5GHz帯両方で利用できる無線LAN子機となっている。

幅34mmの形状をしているExpressCard/34だが、幅54mmのExpressCard/54にも

装着することが可能になっている。

こちらも2月上旬出荷予定で、標準価格は6,615円となっている。

 

家庭内での無線LANネットワークで、電波状態が悪かったり、繋がりにくい場合や、

有線LANの配線が煩わしい、すっきりさせてい場合にも、十分なパフォーマンスを

発揮できるようになってきているのではないだろうか?

 

詳しい情報は、バッファローの無線LAN子機のページ

※11nの親機がない場合は、合わせて親機の導入も必要になります。

 

 

Zero Configuration

それでは、Struts2での最初のアプリケーションを作成してみたいと思います。

Struts2の特徴の一つに"Zero Configuration"があります。

これは、Struts1で、xml地獄と呼ばれた、一連のアクションを実行するため、

各コンポーネントを連携するために必要な設定を、xmlの設定ファイルで記述し、

その設定ファイルが膨大になってしまいがちになる短所を改善するための機構

です。

 

Struts1で、JSP-ActionForm-Action-JSPの連携を全てstruts-config.xmlで設定

していたものを、Struts2では、JSP-POJO-JSPの最小構成で、連携の設定を

記述することなく動作させることができます。

 

では具体例を見ていきましょう。

 

Hello World!!

例の如く、簡単なHello World!!アプリケーションを作成していきます。

ポイントを絞って説明しますので不足点あればコメント欄で質問ください。

(環境)

eclipse3.4.1(tomcatPlugin)

jdk1.6.0_02

tomcat-6.0.14

struts2.0.14

 

20090118.jpg

  1. プロジェクトの作成
    "動的Webプロジェクト"を選択しプロジェクトを作成します。
    注)デフォルトの、classesディレクトリがWEB-INFの外にあり、そこに後述の
    struts.xmlを配置しても認識されなかったので、classesは、WEB-INFの下に
    設定してください。

    ライブラリを配置します。struts2のファイルの中から以下をlibに配置します。
    ・commons-logging-1.0.4.jar
    ・freemarker-2.3.8.jar
    ・ognl-2.6.11.jar
    ・struts2-codebehind-plugin-2.0.14.jar
    ・struts2-core-2.0.14.jar
    ・xwork-2.0.7.jar
    ※codebehindプラグインが、Zero Configurationのミソで、JSPが配置されている
    ディレクトリとアクション名より自動的にアクションクラス(POJOでも可)を探します。
    またアクションクラス名と戻り値にて自動的にJSPファイルを探します。

  2. Web.xml
    ポイントは、Struts1と同様、フィルターおよびパターンにてリクエストをStruts2で処理
    できるように設定を書いている点と、またまたZero Configurationの肝になる、
    actionPackagesというパラメータ設定です。ここにパッケージ名を記述しますが、
    指定したパッケージが、Webアプリケーションのトップディレクトリと同じ階層となり
    JSPとアクションの自動での紐づけの対象となります。
    例えば、/webapp/index.jsp の中で、"index.action"を呼び出すと、
    (actionPackages).IndexAction クラスの execute メソッドを実行しようとします。
    下の私の例では、com.pg2se.sample.action を指定していますので、
    com.pg2se.sample.action.IndexAction#executeメソッドが呼び出されます。
    ※何も設定していなければ"execute"メソッドが呼び出されます。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" 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">
     
    <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
      <init-param>
        <param-name>actionPackages</param-name>
        <param-value>com.pg2se.sample.action</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>


  3. Struts.xml
    Struts.xmlは、classesの直下に置くことで認識されます。冒頭で書いたように、
    WEB-INF以下に配置しないとうまく動作しませんでしたので適宜設定を変更
    してください。
    ※Zero Configurationで作成するため、記述は最低限の以下だけでOKです。

    <?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.enable.DynamicMethodInvocation" value="true" />
        <constant name="struts.devMode" value="false" />
    </struts>


  4. index.jsp
    今回は、Webアプリケーションのトップディレクトリのindex.jspにアクセスし、ボタンを
    押すと、"Hello World!!"のメッセージが表示される簡単なアプリケーションにしています。
    ポイントは、Struts2のタグライブラリ(プレフィックス:s)の宣言をしている点と、
    Formのアクション設定に"index.action"を設定している点、プロパティ"message"を
    表示している点です。最初にJSPにアクセスした場合はプロパティは設定されていま
    せんのでボタンのみ表示されます。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!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">
        <title>Struts2</title>
      </head>
      <body>
        <s:form action="index.action" theme="simple">
          <s:property value="message"/><br/>
          <s:submit value="メッセージ"/>
        </s:form>
      </body>
    </html>


  5. IndexAction.java
    ここでのポイントは、パッケージの設定を、actionPackagesパラメータに
    合わせている点と、Actionの実行設定をしていない際のデフォルトで実行
    される、executeメソッドを実装している点と、ActionFormが無くなった
    代わりに、このクラスにプロパティを設定し、executeメソッドで、プロパティ
    に値をセットしている点、そしてクラスがPOJOである点です。
    ここまでの設定が正しければ、JSPよりボタンが押されると、execute
    メソッドが実行されるはずです。

    package com.pg2se.sample.action;

    public class IndexAction {
     
      private String message;

      public String getMessage() {
        return message;
      }

      public void setMessage(String message) {
        this.message = message;
      }
     
      public String execute() {
        message = "hello world!!";
        return "success";
      }

    }


  6. 最後に
    Actionが実行した最後に"success"を戻り値で返していますが、今回の場合、
    index-success.jspが優先で呼ばれるのですが、ファイルが存在しない場合は、
    次にindex.jspが呼ばれます。(結果的に再度呼び出し元のJSPが実行される
    ことになります)
    この際に、今度はActionでmessageプロパティが設定されていますので、その
    内容が、JSPの、

    <s:property value="message"/>

    の部分で表示されます。

    以上で、超簡単Struts2アプリが完成しました。

    次回は、より実践的にシンプルな掲示板アプリを作成して見たいと思います。