本帖最後由 hanmin888 於 2010-9-29 14:00 編輯
在經過一番折騰之後
終於把基本的JNDI與struts2設定完成
另外我還抄了網路上的log4j 的設定.是為了要看struts2的錯誤,
在這邊先不分享,因為我還沒搞清楚log4j的設定與用法.
我先分享一下設定 tomcat6 的 connetion連接池 設定
我的資料庫是 ibm as400 裡的 db2/400
環境如下
Tomcat 6.0.29
jdk 官網最新版
struts 2.2.1 目前apache網站上最新版
設定JNDI如下
1. 先準備好 jdbc 的jar , 各種資料庫都有各自的jdbc jar, as400的話, 請用ibm出的 jt400.jar
可以到http://findjar.com/index.x 去找到
2.把 jt400.jar 放在 tomcat\lib 下
3.設定web.xml如下 , 在適當的位置放入
<description>AS400/db2</description>
<resource-ref>
<description>DB2Connection</description>
<res-ref-name>jdbc/ty400</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4. <res-ref-name> 是你要抓connection的參數 , 到時會用到 , 先自己取一個容易記的名稱
5.設定 context.xml:
(1)在tomcat6, 不必在你的目錄下創建 META-INF , 因為你設定了context.xml 在META-INF時
tomcat6會在 Tomcat\conf\Catalina\localhost\ 產生一個 "網站名.xml"
裡面的內容就是你在META-INF\context.xml 的內容.
當你把tomcat關掉重開之後, 就會出現
[警告] 該目錄已經被佈屬, 將會略過 .... 的訊息
原因就是那個"網站名.xml"在亂.
(2) 在這裡, 我是直接設定 Tomcat\conf\context.xml , mysql資料庫的部分大家可以參考一下
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/tycons" reloadable="true"
docBase="D:\Tomcat\webapps\tycons"
workDir="D:\Tomcat\webapps\tycons\WEB-INF\work"
antiResourceLocking="false" privileged="true" >
<!-- mysql JNDI -->
<!--
<Resource name="jdbc/db" auth="Container" type="javax.sql.DataSource"
maxActive="200" maxIdle="30" maxWait="10000"
username="帳號" password="密碼" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db?autoReconnect=true" />
-->
<!-- as400 db2 JNDI -->
<Resource name="jdbc/ty400" auth="Container" type="javax.sql.DataSource"
maxActive="300" maxIdle="30" maxWait="10000"
username="帳號" password="密碼" driverClassName="com.ibm.as400.access.AS400JDBCDriver"
url="jdbc:as400://你的as400主機ip" />
</Context>
如此一來,就設定完成了
接下來就是測試 ,在你的網站下創一個 jnditest.jsp
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page language="java" contentType="text/html;charset=Big5" %>
<%
Connection con=null;
try
{
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/ty400");
con = ds.getConnection();
if(!con.isClosed()){
out.println("跟db有連線!!\n");
}
}
catch(Exception e){
out.println("e="+e.getMessage());
e.printStackTrace();
}
finally
{
con=null;
}
%>

接下來, 來設定struts 2
1. 先到apache下載 struts 2.2.1 的jar
2. 到http://findjar.com/index.x 找 javassist-3.7.ga.jar
3. 把圖中的jar 都放到 WEB-INF\lib\

4. 在WEB-INF\ 建立一個 classes 資料夾 , 並且把elipse的輸出資料夾指向 WEB-INF\classes
如圖所示, 最下面有個預設輸出資料夾:

5.在WEB-INF\classes\ 創立一個 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.devMode" value="false" />
<!-- Add packages here -->
<package name="helloWorld" extends="struts-default">
<action name="hello" class="com.hello">
<result name="success">/helloWorld.jsp</result>
</action>
</package>
</struts>
6.在WEB-INF\ 創立一個 web.xml 檔案 , 範例內容如下
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
web.xml裡的<filter-class> , 在struts 2.1版以上, 是用
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
這個class, 所以別設錯了
基本上這樣就設定完成了, 接下來要寫一些程式來測試
在struts.xml 裡 , 我的執行程式是 con.hello
package com;
import com.opensymphony.xwork2.ActionSupport;
public class hello extends ActionSupport { //需要繼承ActionSupport 類別
public static final String MESSAGE = "Struts 2 is up and running ...";
private String message;
private String name; //從from送過來的
private String msg; //從from送過來的
public String execute() throws Exception { //覆寫 ActionSupport的 execute方法
setMessage(MESSAGE);
return SUCCESS; //回傳 ActionSupport的 變數,會對應到struts.xml裡的 <result name="success">
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
送出的jsp , 這裡注意到 action='hello' 這是對應 strust.xml 裡的 <action name="hello" class="com.hello"> 意思就是遇到action='hello'時, 就呼叫 con.hello 這隻class來處裡.
你也可以指定要執行的method, 這個後面再說
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%>
<html>
<form name='helloWorld' action='hello'>
名字:<input type='text' name='name'/><br>
要說的話:<input type='text' name='msg'/><br>
<input type='submit' value='送出'/>
</form>
</html>
接收結果的helloWorld.jsp , taglib這個部分先不講, 因為我也還在研究
<%@ page language="java" pageEncoding="BIG5"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2><s:property value="message" /></h2><br>
你的名字是:<s:property value="name" /><br>
你說的話是:<s:property value="msg" />
</body>
</html>
測試結果如下

 |