Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)まで - アップデート編
Struts2.3+S2JDBCのセットアップからDBアクセス(ORACLE)までの方法です。
以前、紹介した「Struts2.3+S2JDBCのインストールからDBアクセス(ORACLE)まで」のページでは、Dolteng を使ってプロジェクトの作成して、動作するところまで確認しました。
今回は、Struts2.3 にバージョンアップしたいと思います。
目次
バージョンアップに必要なもの
まず 公式ページ から必要なものをダウンロードします。
・Welcome to the Apache Struts project
Full Distribution をクリックします。
ダウンロードしたら、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」の中にコピーします。
次に、プロジェクトを選択して右クリックメニューから「プロパティ」を選択し、「Java のビルド・パス」を選択します。
ライブラリタブを選択し、一旦、全てのライブラリを除去します。
JRE システムライブラリは除去しないように注意してください!
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」にアクセスし、ページが表示されることを確認します。
画像では、ポート 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 のソースの配置としては以下のようになります。
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」にアクセスしてみましょう。
おお、ログインページが表示されましたね。
ログインボタンを押下してみると、エラーメッセージが表示されます。
おおお、エラーメッセージがが表示されましたね。
では、UserId に saka-en、Password に password と入力してみましょう。
おおおお、メインページに遷移しましたね。
まとめ
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アクセス編
おつかれさまでした。