Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで - アップデート編

Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)までの方法です。

Struts2.3にアップデート

以前、紹介した「Struts2.3+S2JDBCのインストールからDBアクセス(ORACLE)まで」のページでは、Dolteng を使ってプロジェクトの作成して、動作するところまで確認しました。

今回は、Struts2.3 にバージョンアップしたいと思います。

Mavenを使えばもっと簡単にバージョンアップできます。


バージョンアップに必要なもの

まず 公式ページ から必要なものをダウンロードします。

Welcome to the Apache Struts project

Struts公式ページ

Full Distribution をクリックします。

Struts2.3ダウンロードページ

ダウンロードしたら、Zip ファイルを解凍して、「struts-2.3.16.3」-「lib」の中から以下の jarファイル を取り出します。

>>圧縮・解凍に便利なツールはこちら<<

  • asm-3.3.jar
  • asm-commons-3.3.jar
  • asm-tree-3.3.jar
  • commons-fileupload-1.3.1.jar
  • commons-io-2.2.jar
  • commons-lang3-3.1.jar
  • commons-logging-1.1.3.jar
  • freemarker-2.3.19.jar
  • javassist-3.11.0.GA.jar
  • ognl-3.0.6.jar
  • struts2-codebehind-plugin-2.3.16.3.jar
  • struts2-core-2.3.16.3.jar
  • xwork-core-2.3.16.3.jar

これを、前回作成したプロジェクト strtus2-s2jdbc 内、「src」-「main」-「webapp」-「WEB-INF」-「lib」の中にコピーします。

struts2.3ライブラリ

次に、プロジェクトを選択して右クリックメニューから「プロパティ」を選択し、「Java のビルド・パス」を選択します。

ライブラリタブを選択し、一旦、全てのライブラリを除去します。

JRE システムライブラリは除去しないように注意してください!

struts2.3不要ライブラリ除去

JAR の追加ボタンを押下して、ライブラリを追加します。

struts2.3 jarの追加

strtus2-s2jdbc 内、「src」-「main」-「webapp」-「WEB-INF」-「lib」から、以下のライブラリを選択します。

  • aopalliance-1.0.jar
  • asm-3.3.jar
  • asm-commons-3.3.jar
  • asm-tree-3.3.jar
  • commons-fileupload-1.3.1.jar
  • commons-io-2.2.jar
  • commons-lang3-3.1.jar
  • commons-logging-1.1.3.jar
  • freemarker-2.3.19.jar
  • geronimo-annotation_1.0_spec-1.0.jar
  • geronimo-jpa_3.0_spec-1.0.jar
  • geronimo-jta_1.1_spec-1.0.jar
  • h2-1.0.69.jar
  • javassist-3.11.0.GA.jar
  • log4j-1.2.13.jar
  • ognl-3.0.6.jar
  • poi-3.0-FINAL.jar
  • s2-extension-2.4.46.jar
  • s2-framework-2.4.46.jar
  • s2-tiger-2.4.46.jar
  • s2-xwork2-1.0.0.jar
  • struts2-codebehind-plugin-2.3.16.3.jar
  • struts2-core-2.3.16.3.jar
  • struts2-seasar-plugin-1.0.0.jar
  • xwork-core-2.3.16.3.jar

不要になったライブラリはこちらです。

  • commons-fileupload-1.2.1.jar
  • commons-io-1.3.2.jar
  • commons-logging-1.1.jar
  • freemarker-2.3.8.jar
  • javassist-3.4.ga.jar
  • ognl-2.6.9-patch-20090427.jar
  • struts2-core-2.0.11.2.jar
  • xml-apis-1.3.03.jar
  • xwork-2.0.5.jar

これらのライブラリは不要ですので、strtus2-s2jdbc 内、「src」-「main」-「webapp」-「WEB-INF」-「lib」から削除してください。残っていると、Tomcat 起動時にエラーが出ます。

Web.xml の変更

Web.xml を開き、以下のように修正します。

DOCTYPE タグ


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="sakaen" version="2.5" 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_5.xsd">

Filter タグ


  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
      org.apache.struts2.dispatcher.FilterDispatcher
    </filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>sakaen.action</param-value>
    </init-param>
  </filter>

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>sakaen.action</param-value>
    </init-param>
  </filter>

全体


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="sakaen" version="2.5" 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_5.xsd">
  <filter>
    <filter-name>hotdeployfilter</filter-name>
    <filter-class>
      org.seasar.framework.container.hotdeploy.HotdeployFilter
    </filter-class>
  </filter>
  <filter>
    <filter-name>s2filter</filter-name>
    <filter-class>
      org.seasar.framework.container.filter.S2ContainerFilter
    </filter-class>
  </filter>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
      org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>sakaen.action</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>hotdeployfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>s2filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>
      org.seasar.framework.container.servlet.S2ContainerListener
    </listener-class>
  </listener>

  <servlet>
    <servlet-name>s2servlet</servlet-name>
    <display-name>Seasar2 Servlet</display-name>
    <servlet-class>
      org.seasar.framework.container.servlet.S2ContainerServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>s2servlet</servlet-name>
    <url-pattern>/s2servlet/*</url-pattern>
  </servlet-mapping>

</web-app>

Struts.xml の変更

Struts.xml を開き、以下のように変更します。


<!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.locale" value="ja_JP" />
  <constant name="struts.i18n.encoding" value="UTF-8" />
  <constant name="struts.action.extension" value="action" />

  <package name="default" extends="struts-default">
    <default-interceptor-ref name="defaultStack" />
  </package>
</struts>

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
</struts>

動作確認

Tomcat を起動して、動作確認しましょう。

http://localhost:8080/struts2-s2jdbc/index.action」にアクセスし、ページが表示されることを確認します。

Struts2.3 動作確認

画像では、ポート 8888 となっていますが、通常は 8080 です。

おお、動いた。よかったよかった♪

では、index.action へのアクセスがあったら、login.action へ Redirect し、ログインページを表示してみます。ログインページでログインできたらメインページへ遷移します。

IndexAction.java

IndexAction.java を開き、以下のように変更します。


package sakaen.action;

import org.apache.struts2.config.Result;
import org.apache.struts2.views.freemarker.FreemarkerResult;

import com.opensymphony.xwork2.ActionSupport;

@Result(type = FreemarkerResult.class, value = "index.ftl")
public class IndexAction extends ActionSupport {
  public String getMessage(){
    return "Seasar2";
  }
}

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


package sakaen.action;

import org.apache.struts2.config.Result;
import org.apache.struts2.dispatcher.ServletRedirectResult;

import com.opensymphony.xwork2.ActionSupport;

@Result(type = ServletRedirectResult.class, name="login", value = "login.action")
public class IndexAction extends ActionSupport {

  public String execute() throws Exception {
    return "login";
  }
}

LoginAction.java

次に、sakaen.action パッケージ内に、LoginAction.java を作成します。


package sakaen.action;

import java.util.Map;

import org.apache.struts2.config.Result;
import org.apache.struts2.dispatcher.ServletRedirectResult;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

@Result(type = ServletRedirectResult.class, name="main", value = "main.action")
public class LoginAction extends ActionSupport implements SessionAware {

  public String userId;
  public String password;
  public String message;
  public Map<String, Object> sessionMap;

  public String execute() throws Exception {
    this.sessionMap.put("userId", null);
    return "success";
  }

  public String login()  throws Exception {
    System.out.println("userId: " + this.userId);
    System.out.println("password: " + this.password);
    this.message = "";
    if ( !"saka-en".equals(this.userId) ) {
      message = "UserId は saka-en と入力してください。";
      return "error";
    }
    if ( !"password".equals(this.password) ) {
      this.message += "Password は password と入力してください。";
      return "error";
    }
    this.sessionMap.put("userId", this.userId);
    return "main";
  }

    public void setSession(Map<String, Object> sessionMap) {
        this.sessionMap = sessionMap;
    }

}

MainAction.java

次に、sakaen.action パッケージ内に、MainAction.java を作成します。


package sakaen.action;

import java.util.Map;

import org.apache.struts2.config.Result;
import org.apache.struts2.dispatcher.ServletRedirectResult;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

@Result(type = ServletRedirectResult.class, name="main", value = "main.action")
public class MainAction  extends ActionSupport implements SessionAware {

  public String userId;
  public Map<String, Object> sessionMap;

  public String execute() throws Exception {
    userId = (String)this.sessionMap.get("userId");
    return "success";
  }
  public void setSession(Map<String, Object> sessionMap) {
        this.sessionMap = sessionMap;
    }
}

Java のソースの配置としては以下のようになります。

Struts2.3 サンプルソース配置

login.jsp

[src]-[main]-[webapp]内に、login.jsp を作成します。


<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Struts2 ver 2.3.16</title>
</head>
<body>
    <p id="container">
        <p id="page-header">
            <h1>Struts2 <small>ver 2.3.16</small></h1>
        </p>
        <s:form action="login.action">
            <s:textfield label="UserId" name="userId" />
            <s:textfield label="Password" name="password" type="password" />
            <s:submit method="login" value="Login" />
        </s:form>
        <small><s:property value="message" /></small>
    </p>
</body>

main.jsp

[src]-[main]-[webapp]内に、main.jsp を作成します。


<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Welcome Struts2 ver 2.3.16</title>
</head>
<body>
    <p id="container">
        <p id="page-header">
            <h1>Welcome Struts2 <small>ver 2.3.16</small></h1>
        </p>
        <ul>
            <li>UserId: <s:property value="userId"  /></li>
        </ul>
    </p>
</body>

検証

それでは「http://localhost:8080/struts2-s2jdbc/index.action」にアクセスしてみましょう。

struts2.3 ログイン画面検証

おお、ログインページが表示されましたね。

ログインボタンを押下してみると、エラーメッセージが表示されます。

struts2.3 ログイン画面エラーメッセージ検証

おおお、エラーメッセージがが表示されましたね。

では、UserId に saka-en、Password に password と入力してみましょう。

struts2.3 メイン画面検証

おおおお、メインページに遷移しましたね。

まとめ

sturts.xml で、DynamicMethodInvocation を true と定義し、規約ベースで動作させています。アクセスの方法としては、index.action であれば、IndexAction を .action パッケージの中に配置すれば、自動で Redirect されます。ページを遷移する場合は、アノテーション @Result で value に定義します。アクションクラスに遷移させるのであれば、xxxx.action と指定し、jsp であれば、jsp のパスを記述します。Action クラスは ActionSupport を継承することと、セッションを利用する場合は、SessionAware を implements する必要があります。

また、Strtus2 では、ActionForm がなくなりました。Actionクラス内に、タグの名前が一致しているプロパティがあれば、値を取得することができます。

次回はいよいよ S2JDBC を使って、ORACLE にアクセスします。

Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで – DBアクセス編

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。