之前的 JBoss 的 JBoss EAP6 Domain Mode Setup 與 JBoss EAP6.x Standalone Mode Cluster Configuration 都在 Windows 平台上作測試,現在起將拋棄 微軟 擁抱 Linux,因為後續的資料庫也是使用 Oracle DataBase,因此 Linux 平台選擇 Oracle Linux,大致的安裝過程可以查看 Oracle Linux Install Using LVM

安裝檔下載:

1. Oracle Linux 的來源可從下面取得:

https://edelivery.oracle.com/linux

 

2. 下載JDK:

Oracle的官網可以下載到最新的JDK版本,官網網址如下:http://www.oracle.com/technetwork/java/javase/downloads/index.html

所有的版本:http://www.oracle.com/technetwork/java/archive-139210.html

3. 指令:

會使用到 rpm 或 yum 的安裝移除令,可以參考 yum 基本介紹和參數說明

安裝 JDK 方法一開始(建議以此方法為主):

1. 查詢 Oracle Linux 預設的 openJDK : OracleLinux7.1_x86_64 所搭配的 Java 是 openJDK ,用 rpm -qa | grep java 查詢後將它移除

[root@localhost ~]# rpm -qa | grep java
java-1.7.0-openjdk-1.7.0.75-2.5.4.2.0.1.el7_0.x86_64
python-javapackages-3.4.1-6.el7_0.noarch
javapackages-tools-3.4.1-6.el7_0.noarch
tzdata-java-2015a-1.el7.noarch
java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.0.1.el7_0.x86_64

2. 移除 openJDK ,可以使用 yum remove java* 或者 rpm -e package_name 指令

[root@localhost ~]# yum remove java*
Loaded plugins: langpacks
Resolving Dependencies
--> Running transaction check
---> Package java-1.7.0-openjdk.x86_64 1:1.7.0.75-2.5.4.2.0.1.el7_0 will be erased
--> Processing Dependency: java-1.7.0-openjdk for package: icedtea-web-1.5.2-0.el7.x86_64
---> Package java-1.7.0-openjdk-headless.x86_64 1:1.7.0.75-2.5.4.2.0.1.el7_0 will be erased
---> Package javapackages-tools.noarch 0:3.4.1-6.el7_0 will be erased
--> Processing Dependency: jpackage-utils for package: rhino-1.7R4-5.el7.noarch
--> Processing Dependency: jpackage-utils for package: rhino-1.7R4-5.el7.noarch
--> Processing Dependency: jpackage-utils for package: tagsoup-1.2.1-8.el7.noarch
--> Processing Dependency: jpackage-utils >= 1.6 for package: tagsoup-1.2.1-8.el7.noarch
--> Processing Dependency: jpackage-utils for package: jline-1.0-8.el7.noarch
--> Running transaction check
---> Package icedtea-web.x86_64 0:1.5.2-0.el7 will be erased
---> Package jline.noarch 0:1.0-8.el7 will be erased
---> Package rhino.noarch 0:1.7R4-5.el7 will be erased
---> Package tagsoup.noarch 0:1.2.1-8.el7 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                Arch   Version                      Repository     Size
================================================================================
Removing:
 java-1.7.0-openjdk     x86_64 1:1.7.0.75-2.5.4.2.0.1.el7_0 @anaconda/7.1 493 k
 java-1.7.0-openjdk-headless
                        x86_64 1:1.7.0.75-2.5.4.2.0.1.el7_0 @anaconda/7.1  90 M
 javapackages-tools     noarch 3.4.1-6.el7_0                @anaconda/7.1 155 k
Removing for dependencies:
 icedtea-web            x86_64 1.5.2-0.el7                  @anaconda/7.1 1.8 M
 jline                  noarch 1.0-8.el7                    @anaconda/7.1  72 k
 rhino                  noarch 1.7R4-5.el7                  @anaconda/7.1 1.0 M
 tagsoup                noarch 1.2.1-8.el7                  @anaconda/7.1 140 k

Transaction Summary
================================================================================
Remove  3 Packages (+4 Dependent packages)

Installed size: 94 M
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Erasing    : icedtea-web-1.5.2-0.el7.x86_64                               1/7
  Erasing    : rhino-1.7R4-5.el7.noarch                                     2/7
  Erasing    : jline-1.0-8.el7.noarch                                       3/7
  Erasing    : tagsoup-1.2.1-8.el7.noarch                                   4/7
  Erasing    : 1:java-1.7.0-openjdk-1.7.0.75-2.5.4.2.0.1.el7_0.x86_64       5/7
  Erasing    : 1:java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.0.1.el7_0.x   6/7
  Erasing    : javapackages-tools-3.4.1-6.el7_0.noarch                      7/7
  Verifying  : 1:java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.0.1.el7_0.x   1/7
  Verifying  : icedtea-web-1.5.2-0.el7.x86_64                               2/7
  Verifying  : tagsoup-1.2.1-8.el7.noarch                                   3/7
  Verifying  : rhino-1.7R4-5.el7.noarch                                     4/7
  Verifying  : 1:java-1.7.0-openjdk-1.7.0.75-2.5.4.2.0.1.el7_0.x86_64       5/7
  Verifying  : jline-1.0-8.el7.noarch                                       6/7
  Verifying  : javapackages-tools-3.4.1-6.el7_0.noarch                      7/7

Removed:
  java-1.7.0-openjdk.x86_64 1:1.7.0.75-2.5.4.2.0.1.el7_0
  java-1.7.0-openjdk-headless.x86_64 1:1.7.0.75-2.5.4.2.0.1.el7_0
  javapackages-tools.noarch 0:3.4.1-6.el7_0

Dependency Removed:
  icedtea-web.x86_64 0:1.5.2-0.el7         jline.noarch 0:1.0-8.el7
  rhino.noarch 0:1.7R4-5.el7               tagsoup.noarch 0:1.2.1-8.el7

Complete!

3. 使用 rpm 指令安裝 jdk-8u45-linux-x64.rpm

[root@localhost tmp]# rpm -ivh jdk-8u45-linux-x64.rpm
正在準備…                       ################################# [100%]
Updating / installing...
   1:jdk1.8.0_45-2000:1.8.0_45-fcs    ################################# [100%]
Unpacking JAR files...
    rt.jar...
    jsse.jar...
    charsets.jar...
    tools.jar...
    localedata.jar...
    jfxrt.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
[root@localhost tmp]# java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
[root@localhost tmp]# javac -version
javac 1.8.0_45

利用 rpm 安裝完的 JDK,根目錄會在 /usr/java/jdk1.8.0_45

[root@localhost java]# pwd
/usr/java
[root@localhost java]# ls -l
總計 4
lrwxrwxrwx. 1 root root   16  8月 17 16:36 default -> /usr/java/latest
drwxr-xr-x. 9 root root 4096  8月 17 16:36 jdk1.8.0_45
lrwxrwxrwx. 1 root root   21  8月 17 16:36 latest -> /usr/java/jdk1.8.0_45

4. 編輯「/etc/profile」檔案。這個profile檔案裡寫的指令在系統開機時會自動執行。

 使用「export」指令來設定Java相關的系統環境變數。要設定的變數有「JAVA_HOME」、「JRE_HOME」、「PATH」、 「CLASSPATH」。「JAVA_HOME」為JDK的目錄,就是剛剛複製到「/usr/lib」目錄中的JDK目錄,「JRE_HOME」為 JRE(Java Runtime Environment)的目錄,JDK有包含JRE,位置就在JDK目錄下的「jre」目錄。「PATH」變數為系統尋找指令(檔案)的路徑,將 「JAVA_HOME」變數和「JRE_HOME」變數加進原先的「PATH」變數前。「CLASSPATH」變數為Java尋找Java程式所使用到的 Class路徑,路徑可以是目錄也可以是.jar檔案,將目前的目錄「.」和「$JAVA_HOME/lib」與「$JAVA_HOME/jre /lib」加進變數中吧!

 範例如下:

export JAVA_HOME=/usr/java/jdk1.8.0_45
export JRE_HOME=/usr/java/jdk1.8.0_45/jre
export ANT_HOME=/opt/apache-ant-1.7.0
export JBOSS_HOME=/opt/jboss-eap-6.3

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$ANT_HOME/bin
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib

重新關機後,就可以生效。

 

安裝 JDK 方法二開始(特殊需求時使用):

Step 01:將 jdk-8u45-linux-x64.tar.gz 解壓縮在 /opt/jdk1.8.0_45

Linux_JDK.png  

 

 Step 02:編輯「/etc/profile」檔案。這個profile檔案裡寫的指令在系統開機時會自動執行。

export ANT_HOME=/opt/apache-ant-1.7.0
export JAVA_HOME=/opt/jdk1.8.0_45_x64
export JRE_HOME=/opt/jdk1.8.0_45_x64/jre
export JBOSS_HOME=/opt/jboss-eap-6.3

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$ANT_HOME/bin
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib

 重新關機後,就可以生效。

 

安裝 JBoss EAP 開始:

1. 到 https://access.redhat.com/downloads/ 下載 jboss-eap-6.3 的 zip 檔,並解壓縮放在 /opt/jboss-eap-6.3

2. 執行 /opt/jboss-eap-6.3/bin/add-user.sh 增加管理 JBoss EAP Server 的帳號

3. 執行 /opt/jboss-eap-6.3/bin/standalone.sh 就可以手動啟動 JBoss EAP , 並可以在本機輸入網址 http://localhost:9990/console/ 進入管理.

在 Oracle Linux 上建立 JBoss EAP 的 Service

1. 編輯 $JBOSS_HOME/bin/init.d/jboss-as.conf   ,檔案內容至要少有 JBOSS_HOME & JBOSS_USER 這兩個變數的設定。

範例如下:

# General configuration for the init.d scripts,
# not necessarily for JBoss AS itself.

# The username who should own the process.
#
JBOSS_USER=root
JBOSS_HOME=/opt/jboss-eap-6.3

2. 將 $JBOSS_HOME/bin/init.d/jboss-as.conf 複制到 /etc/jboss-as 目錄,與 $JBOSS_HOME/bin/init.d/jboss-as-standalone.sh 複制到 /etc/init.d

Copy the modified configuration file to the /etc/jboss-as directory.

[user@host init.d]$ sudo mkdir /etc/jboss-as

[user@host init.d]$ sudo cp $JBOSS_HOME/bin/init.d/jboss-as.conf /etc/jboss-as/

Copy the start-up script to the /etc/init.d directory.

[user@host init.d]$ sudo cp $JBOSS_HOME/bin/init.d/jboss-as-standalone.sh /etc/init.d

3. 修改 /etc/init.d/jboss-as-standalone.sh 內容,如紅色標注部份,因為 JAVA_HOME 已在前面有設定了, 所以不用再作判斷。

#!/bin/sh
#
# JBoss standalone control script
#
# chkconfig: - 80 20
# description: JBoss AS Standalone
# processname: standalone
# pidfile: /var/run/jboss-as/jboss-as-standalone.pid
# config: /etc/jboss-as/jboss-as.conf

# Source function library.
. /etc/init.d/functions

# Load Java configuration.
#[ -r /etc/java/java.conf ] && . /etc/java/java.conf
#export JAVA_HOME

# Load JBoss AS init.d configuration.
if [ -z "$JBOSS_CONF" ]; then
  JBOSS_CONF="/etc/jboss-as/jboss-as.conf"
fi

[ -r "$JBOSS_CONF" ] && . "${JBOSS_CONF}"

# Set defaults.

if [ -z "$JBOSS_HOME" ]; then
  JBOSS_HOME=/opt/jboss-eap-6.3
fi
export JBOSS_HOME

.

.

.

 

4. 註冊 JBoss 為 Service

[user@host init.d]$ sudo chkconfig --add jboss-as-standalone.sh

 5. 執行指令 setup 檢查 JBoss EAP 的服務是否有設為自動啟動( [*] jboss-as-standalone.sh),若沒有則按空白鍵作設定。這樣啟 OS 時,JBoss EAP 就會自動帶啟。

[root@localhost ~]# setup

linux_setup

setup_jboss_service  

4. 手動啟動/停止/重啟 JBoss

[root@localhost ~]# sudo service jboss-as-standalone start [stop] [restart] [status]

[root@localhost ~]# sudo service jboss-as-standalone
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status)

 

 

 

參考:

http://magiclen.org/linux-jdk/

https://docs.oracle.com/javase/7/docs/webnotes/install/linux/linux-jdk.html

http://wei-meilin.blogspot.tw/2012/10/jeap-6-red-hat-linux-service.html

https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.1/html/Installation_Guide/Install_JBoss_Enterprise_Application_Platform_6_Red_Hat_Enterprise_Linux_Service.html

https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.3/html/Installation_Guide/Install_JBoss_Enterprise_Application_Platform_6_Red_Hat_Enterprise_Linux_Service.html

[user@host init.d]$ sudo chkconfig --add jboss-as-standalone.sh
文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Windows Server 2003 為 VMware 的 guset ,若要擴展 disk 空間,可以使用 diskpart 的指令來作。作業大致如下:

 

Step 01:Add Additional Space to the Virtual Hard Drive

- Using the vSphere Client, connect to vCenter server or your host.
- Once connected, select your Virtual Machine from the Hosts & Clusters or VMs & Templates view.
- Click "Edit Settings"
- Select your Virtual Disk, and increase the Provisioned Space.
- Click OK

 

Step 02:Extend the Windows Server Volume

- Access your Server (either Open Console from the vSphere Client or RDP)
- Open a Command Prompt
- Use the following commands from the Microsoft KB 325590

實作如下:

C:\>diskpart

Microsoft DiskPart 5.2.3790.3959 Copyright (C) 1999-2001 Microsoft Corporation.
On computer:

DISKPART> list volume

  磁碟區 ###  Ltr  標籤           Fs     類型        大小     狀態     資訊
  ----------  ---  -----------     -----  ----------  -------  ---------  --------
  磁碟區 0     E                    NTFS   簡單           400 GB  狀況良好

  磁碟區 1     Y   新增磁碟區  NTFS   磁碟分割       10 GB  狀況良好

  磁碟區 2     C                    NTFS   磁碟分割      30 GB  狀況良好

  磁碟區 3     D   CRMSVOL_EN   CDFS   DVD-ROM      594 MB  狀況良好


DISKPART> select volume=1

磁碟區 1 是所選擇的磁碟區。

DISKPART> extend

DiskPart 成功地延伸了磁碟區。

DISKPART>exit

PS:磁碟的型態是基本動態(如下圖)所擴展出來的空間會有不同,但在前端看到的是一樣的。

VMware-diskpart.png  

 

參考:

http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1007266

http://community.spiceworks.com/how_to/2824-extend-data-volume-on-a-windows-2003-virtual-machine-vmware-esxi

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

環境是 VM vSphere Esxi 5.x Standard

在 vCenter 中看到,系統出現 "Virtual machine disks consolidation is needed" ,代表 vdk 檔要作 consolidation 。但在執行的過程中發生 Unable to access file since it is locked 的錯誤訊息。


 

 

 

解決的方法:

Step 01:用 SSH 連到主機端, 查看 vmware.log ,看是那一個檔被 Lock 。
# vi vmware.log

2015-06-02T09:52:50.430Z| vmx| I120: [msg.nvram.wback1] Could not create '/vmfs/volumes/50eaa6a3-bd303b99-7190-3440b5c68358/PLM/PLM.nvram': Failed to lock the file 2015-06-02T09:52:50.430Z| vmx| I120: ---------------------------------------- 2015-06-02T09:52:50.454Z| vmx| W110: NVRAMMGR: Failed to create default NVRAM file (PLM.nvram)

Step 02:使用指令 mkfstools -D 查看那台主機 lock ,
 # vmkfstools -D PLM.nvram

Lock [type 10c00001 offset 107448320 v 16455, hb offset 3289088
gen 51, mode 1, owner 5480349c-42ed69c6-xxxx-3440b5ca5488 mtime 1279740
num 0 gblnum 0 gblgen 0 gblbrk 0]
Addr <4 105="" 169="">, gen 16414, links 1, type reg, flags 0, uid 0, gid 0, mode 600
len 8684, nb 1 tbz 0, cow 0, newSinceEpoch 1, zla 1, bs 1048576

查到的 3440b5ca5488 即是 MAC 34:40:b5:ca:54:88, 然後去找那一台的 HOST 主機

示意圖:



Step 03: 兩種解決方法
 

方法一:
確定主機後, 在 vCenter 將 host 進入 maintenance mode, 此時 DRS vMotioned all VMs to another host in the cluster , 然後 restarted the hostd service.

SSH 登入主機, 下指令: /etc/init.d/hostd restart

方法二:

若覺得  maintenance mode 要將所有 guest 移到別台 Host 工程太浩大, 那就
將 guest 移到這台Host, 再作 Consolidation 也是可以.



個人是覺得第二個方法最方便. 供參考

Ref :
https://www.vmadmin.co.uk/resources/35-esxserver/411-disk-consolidation-needed-unable-to-access-file-since-it-is-locked

http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=10051

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

From: Polin Wei

經實作測試,可以正常運作。故記錄之.....

環境:

struts2: 2.3.16.3

freemarker: 2.3.19

Bootstrap: 3.2.0

commons-fileupload: 1.3.1

commons-io:2.4

jQuery-File-Upload: 9.10.0

 

上傳前劃面

 upload-1.png  

上傳後劃面

upload2.png

 

Struts2 結合 jQuery-File-Upload 的實作如下:

step 01: pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gu</groupId>
  <artifactId>GUSSH</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>gussh</name>
  <dependencies>
          <dependency>
              <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
          </dependency>
          <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.15.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.2.15.Final</version>
        </dependency>
        
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.3</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.16.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.16.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-json-plugin</artifactId>
            <version>2.3.16.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-config-browser-plugin</artifactId>
            <version>2.3.16.3</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.8.0</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-digester</groupId>
            <artifactId>commons-digester</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>1.3</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.0.1-FINAL</version>
        </dependency>
        <dependency>
            <groupId>quartz</groupId>
            <artifactId>quartz</artifactId>
            <version>1.5.2</version>
        </dependency>
        
        <dependency>
            <groupId>stax</groupId>
            <artifactId>stax</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml</groupId>
            <artifactId>saaj-impl</artifactId>
            <version>1.3</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.stream</groupId>
            <artifactId>sjsxp</artifactId>
            <version>1.0.1</version>
        </dependency>
        
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.5.1</version>
        </dependency>
        <dependency>
            <groupId>oro</groupId>
            <artifactId>oro</artifactId>
            <version>2.0.8</version>
        </dependency>
        <dependency>
            <groupId>jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>1.3.4</version>
        </dependency>
        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jfreechart-experimental</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        
        <dependency>
            <groupId>net.sf.barcode4j</groupId>
            <artifactId>barcode4j</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.morph</groupId>
            <artifactId>morph</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils-bean-collections</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.5.3</version>
        </dependency>
        <dependency>
            <groupId>axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>
        
        <dependency>
            <groupId>com.keypoint</groupId>
            <artifactId>png-encoder</artifactId>
            <version>1.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>2.1_3</version>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-javaflow</groupId>
            <artifactId>commons-javaflow</artifactId>
            <version>20060411</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/commons-javaflow-20060411.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.barbecue</groupId>
            <artifactId>barbecue</artifactId>
            <version>1.1</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/barbecue-1.1.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>lotus.sametime</groupId>
            <artifactId>STComm</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/STComm.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>lotus.sametime</groupId>
            <artifactId>NCSO</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/NCSO.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>lotus.sametime</groupId>
            <artifactId>CommRes</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/CommRes.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.wnjsoft.dlp</groupId>
            <artifactId>ds-orgimport</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ds-orgimport.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.wnjsoft.dlp</groupId>
            <artifactId>ds-userimport</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ds-userimport.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.ds.globeunion.wfclient</groupId>
            <artifactId>ds-wf-client</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ds-wf-client.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>jasperreports</groupId>
            <artifactId>ireport</artifactId>
            <version>2.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/iReport.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14</artifactId>
            <version>10.2.0.3.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ojdbc14.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc14_g</artifactId>
            <version>10.2.0.3.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ojdbc14_g.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.sun.xml</groupId>
            <artifactId>saaj-coms</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/saaj-coms.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.gu.apps</groupId>
            <artifactId>gu-taglibs</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/gu-taglibs-1.0.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>javax.sql</groupId>
            <artifactId>jdbc-stdext</artifactId>
            <version>2.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/jdbc2_0-stdext.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.jgeppert.struts2.bootstrap</groupId>
            <artifactId>struts2-bootstrap-plugin</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.jgeppert.struts2.jquery</groupId>
            <artifactId>struts2-jquery-plugin</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.ckeditor</groupId>
            <artifactId>ckeditor-java-core</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
  </dependencies>
</project>

 

step 02: struts.xml

<?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>

     <!-- devMode is helpful when you want some extra logs for debugging -->
     <constant name="struts.devMode" value="false" />
     <constant name="struts.i18n.encoding" value="UTF-8" />
     <!-- Global message resource;
         Otherwise you will have seperate message resource for each Action
     -->
     <constant name="struts.custom.i18n.resources" value="com.gussh.sc.messages.messages" />
     <constant name="struts.enable.DynamicMethodInvocation" value="true" />
     <constant name="struts.multipart.maxSize" value="1048576000" />
             
     <package name="gussh-default" namespace="/" extends="struts-default,json-default">
     
       <interceptors>
            <interceptor name="authInterceptor" class="com.gussh.AuthInterceptor"></interceptor>
            
               <interceptor-stack name="gussh-stack">
                <interceptor-ref name="fileUpload">
                    <param name="maximumSize">104857600</param>
                </interceptor-ref>
                <interceptor-ref name="authInterceptor" />                    
                <interceptor-ref name="defaultStack"/>
               </interceptor-stack> 
               
       </interceptors>
       <default-interceptor-ref name="gussh-stack"/>
       <default-action-ref name="UnderConstruction"/>
                       
       <global-results>
          <result name="json-output">/gussh/common/json-output.jsp</result>
          <result name="error">/error.jsp</result>
        </global-results>
         
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>            
        </global-exception-mappings>
        
       <action name="UnderConstruction">
           <result>/templates/SSO/GUSSO.jsp</result>
       </action>        
 
        <action name="FileOutput" class="com.gussh.common.utils.FileOutput" >              
            <result name="success" type="stream">
                <param name="contentType">application/octet-stream;charset=ISO8859-1</param>
                <param name="inputName">inputStream</param>
                <!-- 使用經過轉碼的檔名作為下載檔案名,downloadFileName屬性  對應action類中的方法 getDownloadFileName() -->  
                <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
                <param name="bufferSize">4096</param>                
            </result>  
        </action>        
            
     </package>
    
     <!-- Add addition packages and configuration here. -->
      
</struts>

 

Step03: jsp 頁面

<s:form cssClass="fileupload" name="UsersTagAction" action="UsersTagAction" enctype="multipart/form-data">

...

...

<div class="row fileupload-buttonbar">
    <div class="col-lg-7">
        <!-- The fileinput-button span is used to style the file input field as button -->
        <span class="btn btn-success btn-sm fileinput-button">
            <i class="glyphicon glyphicon-plus" style="font-size: 14px"></i>
            <span><s:text name="common.upload.select" /></span>
            <input type="file" name="file" multiple>                    
        </span>           
        <button type="submit" class="btn btn-primary btn-sm start">
            <i class="glyphicon glyphicon-upload" style="font-size: 14px"></i>
            <span><s:text name="common.upload" /></span>
        </button>
        <button type="reset" class="btn btn-warning btn-sm cancel">
            <i class="glyphicon glyphicon-ban-circle" style="font-size: 14px"></i>
            <span><s:text name="common.upload.cancel" /></span>
        </button>
        <button type="button" class="btn btn-danger btn-sm delete">
            <i class="glyphicon glyphicon-trash" style="font-size: 14px"></i>
            <span><s:text name="common.btn.delete" /></span>
        </button>
        <input type="checkbox" class="toggle">
        <!-- The global file processing state -->
        <span class="fileupload-process"></span>
    </div>
</div>
<!-- The table listing the files available for upload/download -->
<table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>

 

...</s:form>

 

step 04: freemarker(ftl) 頁面, 放在 html 最下面, 以便所有頁面共用

<!-- The template to display files available for upload -->
<script id="template-upload" type="text/x-tmpl">
{% for (var i=0, file; file=o.files[i]; i++) { %}
    <tr class="template-upload fade">
        <td>
            <span class="preview"></span>
        </td>
        <td>
            <p class="name">{%=file.name%}</p>
            <strong class="error text-danger"></strong>
        </td>
        <td class="title"><input name="fileDescription" placeholder="File Description"></td>    
        <td>
            <p class="size">Processing...</p>
            <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="progress-bar progress-bar-success" style="width:0%;"></div></div>
        </td>
        <td>
            {% if (!i && !o.options.autoUpload) { %}
                <button class="btn btn-primary btn-sm start" disabled>
                    <i class="glyphicon glyphicon-upload" style="font-size: 14px"></i>
                    <span style="font-size: 12px">${action.getText('common.upload.select')}</span>
                </button>
            {% } %}
            {% if (!i) { %}
                <button class="btn btn-warning btn-sm cancel">
                    <i class="glyphicon glyphicon-ban-circle" style="font-size: 14px"></i>
                    <span style="font-size: 12px">${action.getText('common.upload.cancel')}</span>
                </button>
            {% } %}
        </td>
    </tr>
{% } %}
</script>
<!-- The template to display files available for download -->
<script id="template-download" type="text/x-tmpl">
{% for (var i=0, file; file=o.files[i]; i++) { %}
    <tr class="template-download fade">
        <td>
            <span class="preview">
                {% if (file.thumbnailUrl) { %}
                    <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
                {% } %}
            </span>
        </td>
        <td>
            <p class="name">                
                {% if (file.url) { %}
                    <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}><img src="${request.contextPath}/webTemplate/themes/gussh/images/Download-icon.png"/>{%=file.name%}</a>
                {% } else { %}
                    <span>{%=file.name%}</span>
                {% } %}
            </p>
            {% if (file.error) { %}
                <div><span class="label label-danger">Error</span> {%=file.error%}</div>
            {% } %}
        </td>
        <td>
            <span class="size">{%=o.formatFileSize(file.size)%}</span>
        </td>
        <td>
            {% if (file.deleteUrl) { %}
                <button class="btn btn-danger btn-sm delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>
                    <i class="glyphicon glyphicon-trash" style="font-size: 12px"></i>
                    <span>${action.getText('common.btn.delete')}</span>
                </button>
                <input type="checkbox" name="delete" value="1" class="toggle">
            {% } else { %}
                <button class="btn btn-warning btn-sm cancel">
                    <i class="glyphicon glyphicon-ban-circle" style="font-size: 12px"></i>
                    <span>${action.getText('common.upload.cancel')}</span>
                </button>
            {% } %}
        </td>
    </tr>
{% } %}
</script>
    
</body>
</html>

 

Step 05: 處理 file upload 的 class

package com.gussh;


import java.lang.reflect.Method;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Pattern;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.mapper.ActionMapping;

import com.gussh.common.utils.BA_TOOLS;
import com.gussh.common.utils.BA_Validate;
import com.gussh.sc.model.UserInfo;
import com.gussh.spfs.SPFS_TOOLS;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.validator.annotations.DateRangeFieldValidator;
import com.opensymphony.xwork2.validator.validators.EmailValidator;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class BaseSupport extends ActionSupport implements Preparable {
    
    Logger logger = Logger.getLogger(BaseSupport.class);
    private static final long serialVersionUID = 1L;
    
    // 網頁會使用的 request, response, session
    public HttpServletRequest request = ServletActionContext.getRequest();
    public HttpServletResponse response = ServletActionContext.getResponse();
    public Map<String, Object> session = ActionContext.getContext().getSession();


    //處理檔案上傳, 因 jQuery-File-Upload 一次處理一個檔案上傳, 所以不需使用 MultipleFileUploadUsingListAction
    protected File file ;
    protected String fileFileName ;
    protected String fileContentType ;
    protected String fileDescription ;
    
    @Resource(name="BA_TOOLS")
    protected BA_TOOLS baTools;    
    
    public BaseSupport() {
        // TODO Auto-generated constructor stub
    }

    public void prepare() throws Exception {
        // TODO Auto-generated constructor stub
        
    }    


    @Override
    public String execute() throws Exception {
        String reqCode="fileUpload";
            String reqResult="";
            reqResult=doReqCode(reqCode);        
        return reqResult;
    }

    public String fileUpload() {
        String filePath="/upload/";
        try {
            baTools.uploadFileToServer(response, filePath, file, fileFileName, fileContentType, fileDescription);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return super.fileUpload();
    }


    //執行其它自定的 reqCode Function
    public String doReqCode(String reqCode) {
        reqResult=INPUT;
        boolean result = false;
        Method[] methods = this.getClass().getMethods();
        for (int i = 0; i < methods.length; i++) {
            Method method = methods[i];
            if (reqCode.equals(method.getName())) {
                try {
                    reqResult=method.invoke(this).toString();
                    result=true;
                } catch (Exception e) {
                    this.addActionError(reqCode+": "+  getText("msg.system.methodExecuteError"));
                    logger.info(e);                
                }
            }
        }
        if (!result){
            this.addActionError(reqCode+": "+  getText("msg.system.methodNotFound"));
        }
        
        return reqResult;
    }


    //處理檔案上傳
    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getFileFileName() {
        return fileFileName;
    }

    public void setFileFileName(String fileFileName) {
        this.fileFileName = fileFileName;
    }

    public String getFileContentType() {
        return fileContentType;
    }

    public void setFileContentType(String fileContentType) {
        this.fileContentType = fileContentType;
    }

    public String getFileDescription() {
        return fileDescription;
    }

    public void setFileDescription(String fileDescription) {
        this.fileDescription = fileDescription;
    }
    
}

 

Step 06: 公共程式的 class: BA_TOOLS

@Service
@Component("BA_TOOLS")
public class BA_TOOLS extends BaseDataSource {

    static Logger loger = Logger.getLogger(BA_TOOLS.class.getName());
    
    private static final ActionSupport actionSupport = new ActionSupport();
    
    /**
     * 上傳檔案到主機上,並且變更原始檔名為 new Date().getTime() + extension
     * @param filePath 檔案路徑
     * @param file     上傳的實體檔案來源
     * @param fileFileName 上傳的實體檔案檔名
     * @param fileContentType 上傳的實體檔案型態
     * @param fileDescription 上傳的實體檔案說明
     * @return
     * @throws IOException
     */
    public String uploadFileToServer(HttpServletResponse response,String filePath, File file, String fileFileName, String fileContentType, String fileDescription) throws IOException{
        
        String saveFileName = "";
        String showFileDescript = fileDescription.isEmpty()?fileFileName:fileDescription;
        String uploadFileGson="";
        InputStream is = null;
        OutputStream os = null;
        int BUFFER_SIZE = 8 * 1024;
        int fileSize=0;
        
        
        Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
        Map<String,Object> rowAttribute = new HashMap<String,Object>();
        List<Map<String,Object>> fileAttribute = new ArrayList<Map<String,Object>>();
        Map<String,Object> itemCategory = new HashMap<String,Object>();
        
        String osName = System.getProperty("os.name");
        if (!osName.equals("Linux")) {
            filePath = "C:" + filePath;
        }
        try{
            //檢查是否有此Folder:filePath, 若無則建立
            File filePathIsFolder = new File(filePath);
            if (!filePathIsFolder.isDirectory())
                filePathIsFolder.mkdirs();
            //取得上傳檔案的附檔名
            String extension = "";
            if (fileFileName.indexOf('.') > -1){
                String[] tmp = fileFileName.split("\\.");
                extension = "." + tmp[tmp.length - 1];
            }
            saveFileName = new Date().getTime() + extension;
            
            //開始將檔案讀出並寫入主機            
            is = new FileInputStream(file);
            fileSize=is.available();
            File destFile = new File(filePath, saveFileName);
            os = new FileOutputStream(destFile);
            byte[] buffer = new byte[BUFFER_SIZE];
            while(is.read(buffer)>0){
                os.write(buffer);
            }
            is.close();
            os.close();
            
            //組成 jquery-file-upload 需要的 gson 格式
            itemCategory.put("name", showFileDescript);
            itemCategory.put("size", fileSize);
            itemCategory.put("type", fileContentType);
            itemCategory.put("url", "FileOutput?name="+saveFileName);
            itemCategory.put("deleteUrl", "Index?reqCode=fileDelete&fileFileName="+saveFileName);
            itemCategory.put("deleteType", "POST");
            fileAttribute.add(itemCategory);
            rowAttribute.put("files", fileAttribute);
            
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            if (null!=is){
                is.close();
            }
            if (null!=os){
                os.close();
            }
        }
        //產生 gson 字串
        uploadFileGson=gson.toJson(rowAttribute);
        //回傳 gson 至前端
        gsonOutput(response,uploadFileGson);
        
        return saveFileName;
    }
    
    /**
     * 在前端產生 Gson String
     * @param response
     * @param gsonString
     */
    public void gsonOutput(HttpServletResponse response, String gsonString){
        PrintWriter writer=null;
        response.setContentType("text/html;charset=UTF-8");
        try {
            writer = response.getWriter();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        writer.print(gsonString);
        writer.flush();
        writer.close();        
    }
}       

 

Step 07: 檔案下載的 class: FileOutput

package com.gussh.common.utils;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileOutput extends ActionSupport {
    
    static Logger logger = Logger.getLogger(FileOutput.class);
    
    @Resource(name="BA_TOOLS")
    protected BA_TOOLS baTools;
    public HttpServletRequest request = ServletActionContext.getRequest();
    public HttpServletResponse response = ServletActionContext.getResponse();
    
    private InputStream inputStream ;
    private String name;    
    
    public InputStream getInputStream() {        
        
        String filenamedownload = "";
        String filePath="/upload/";        
        String osName = System.getProperty("os.name");
        
        if (!osName.equals("Linux")) {
            filePath = "C:" + filePath;
        }
        
        filenamedownload = filePath+ "/" + this.getName();
        
         try{
             File file = new File(filenamedownload);
             if(file.length()>0)
                 inputStream = new FileInputStream(filenamedownload);
             else
                 inputStream = new ByteArrayInputStream("No Files".getBytes());
         }catch(Exception e){
             e.printStackTrace();
         }
        
        
         //return ServletActionContext.getServletContext().getResourceAsStream(filenamedownload);
         return inputStream;
    }
    
    public String execute() throws Exception {    
        return "success";
    }

    public String getDownloadFileName() {   
          
        String downFileName = name;  
        try {  
            downFileName = new String(downFileName.getBytes(), "ISO8859-1");
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
        return downFileName;   
 
    }    
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }       
    
}

 

Step 08: file upload 的 javascript

$(document).ready(function () {
    
    // Initialize the jQuery File Upload widget:
    $('.fileupload').each(function (e, data) {    
        $(this).fileupload({
            dropZone: $(this)            
        });        
        $('#reqCode').val('fileUpload');
    });
    
    /*處理每一個檔案上傳前, 加入單一 fileDescription 的值*/
    $('.fileupload').bind('fileuploadsubmit', function (e, data) {
       
        // 剔除欄位:fileDescription 後, 取得所有要上傳的值
        var allInputs = $( ":input[name!='fileDescription']"  );
        // 抓取 id="template-upload" 裡新增加單一的 input 欄位: fileDescription
        var fileUploadInputs = data.context.find(':input');
        // 兩個 array 再 merge , 就是所有欄位要上傳的所有值
        var inputs = $.merge(allInputs,fileUploadInputs);
        
        if (inputs.filter(function () {
                return !this.value && $(this).prop('required');
            }).first().focus().length) {
            data.context.find('button').prop('disabled', false);
            return false;
        }
        // 上傳的欄位值需要序列化, 才會逐一上傳
        data.formData = inputs.serializeArray();
    });

});

 

大致的作業如上.

 

參考網址:

Setting formData on upload start for each individual file upload

https://struts.apache.org/docs/file-upload.html

 

 

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

在 Struts2 的異常處理有兩種,一種是程式撰寫的邏輯出錯,另一種是找不到 action Name : There is no Action mapped for namespace...,避免系統出錯的改善作法如下:

 

程式撰寫的邏輯出錯:

在 Struts.xml 內加入

<global-results>
    <result name="error">/error.jsp</result>
</global-results>

<global-exception-mappings>
    <exception-mapping exception="java.lang.Exception" result="error"/>            
</global-exception-mappings>

建立 error.jp 檔案

<%@ 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>An unexpected error has occurred</title>
</head>
<body>

    <h3>The application has malfunctioned(該應用程序出現錯誤)</h3>

    <p>Please contact technical support with the following information(請聯繫資訊單位並提供以下信息):</p>

    <h4>
        Exception Name:<s:property value="exception" />
    </h4>

    <h4>
        Exception Details:<s:property value="exceptionStack" />
    </h4>

</body>
</html>

 

一種是找不到 action Name:

有兩個方法可以解決

第一種是方法利用 default-action-ref:

在 Struts.xml 內加入

<default-action-ref name="UnderConstruction"/>

<action name="UnderConstruction">
   <result>/UnderConstruction.jsp</result>
</action>

建立 UnderConstruction.jp 檔案

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@page import="org.apache.struts2.ServletActionContext"%>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@page import="java.util.*"%>
<%@page import="java.net.*"%>
<%@page import="java.text.MessageFormat"%>
<%@page import="com.gussh.common.utils.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<%

String username = (String)session.getAttribute("USERNAME");
String password = (String)session.getAttribute("PASSWORD");
String language = (String)request.getSession().getAttribute("loginLanguage");
String progModule = (String)session.getAttribute("progModule");
String actionName= "";
String actionURL= "";


ActionContext actionContext = ServletActionContext.getContext();
actionName = actionContext.getName();

actionURL="http://polinwei.blogspot.tw/login.do";

    
    
%>
<body>

<%if(username != null){%>
    <form name="ssoForm" action="<%=actionURL %>" target='_blank'>
    <input type="hidden" name="username" value="<%=username %>" />
    <input type="hidden" name="password" value="<%=password %>"  />
    <input type="hidden" name="language" value="<%=language %>"  />       
    </form>
    <script type="text/javascript">
    var formObj=document.ssoForm;
    formObj.method='post';
    formObj.submit();
    document.location.href="<%=request.getContextPath()%>/Index?reqCode=moduleSelect&progModule=<%=progModule%>"
    </script>
<% }else{ %>
    <script type="text/javascript">
        window.opener.top.document.location.href="<%=actionURL %>";
        window.opener=null;
        window.open("","_self");
        window.close();
    </script>
<% }%>
</body>
</html>

 

第二種作法則是利用 unknown-handler-stack:

在 Struts.xml 內加入

<struts>
.
.    
   <!-- 使用bean 定義一個UnknownHandler -->  
     <bean type="com.opensymphony.xwork2.UnknownHandler" name="myHandler" class="com.sc.actions.UnderConstructionAction" />
    
   <package name="default" namespace="/" extends="struts-default">
   .
   .
   </package>    
   <!-- Add addition packages and configuration here. -->

     
    <!-- 定義本系統的 UnknownHandler -->        
    <unknown-handler-stack>
       <unknown-handler-ref name="myHandler" />
    </unknown-handler-stack>      
</struts>   

 

class="com.sc.actions.UnderConstructionAction"

package com.gussh.sc.actions;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.ServletDispatcherResult;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.UnknownHandler;
import com.opensymphony.xwork2.XWorkException;
import com.opensymphony.xwork2.config.entities.ActionConfig;


public class UnderConstructionAction implements UnknownHandler {
    // 網頁會使用的 request, response, session
    public HttpServletRequest request = ServletActionContext.getRequest();
    public HttpServletResponse response = ServletActionContext.getResponse();
    public Map<String, Object> session = ActionContext.getContext().getSession();
   
    public ActionConfig handleUnknownAction(String namespace, String actionName)
            throws XWorkException {        

        ActionConfig actionConfig = null;
        request.setAttribute("actionName",actionName);    
        
        return actionConfig;

    }

    public Result handleUnknownResult(ActionContext actionContext,
            String actionName, ActionConfig actionConfig, String resultCode)
            throws XWorkException {
        actionContext.put("action", actionName);  
        actionContext.put("result", resultCode);
        request.setAttribute("actionName",actionName);
        return new ServletDispatcherResult("/templates/SSO/GUSSO.jsp");
    }

    public Object handleUnknownActionMethod(Object action, String methodName)
            throws NoSuchMethodException {
        // TODO Auto-generated method stub
        return null;
    }

}

 

 

參考:

https://struts.apache.org/docs/unknown-handlers.html

https://struts.apache.org/docs/exception-configuration.html

http://terryjs.iteye.com/blog/777999

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

JSP 的 EL 與 JSF 的 EL( 如 JSF EL ( Expression Language ) 的介紹),大致相同,參考 http://penguin1989930.pixnet.net/blog/post/236537248 ,後整理如下:

 

使用EL存取資料
如果想要顯示application隱含物件中的count變數時,可以使用JSP這樣做:
<%=application.getAttribute("count")%>

而也可以透過EL這樣做:
${count}

${applicationScope.count}

您可以發現EL真的讓JSP的程式碼簡潔了許多。其中applicationScope代表示application隱含物件中的資料集合(並不等於application物件),而EL顯示集合的方法有三種:
${applicationScope.count}
${applicationScope['count']}
${applicationScope["count"]}

1.存取資料的預設物件有:

EL預設物件

對應的JSP隱含物件集合

applicationScope

application集合

sessionScope

session集合

pageScope

page集合

requestScope

request集合

pageContext

pageContext物件

存取資料時,如果沒有指定範圍,會依照pageContext >> request >> session >> application的順序來顯示資料,例如:

<%
session.setAttribute("username","jack");
application.setAttribute("username","mary");
%>

${username}


由於session與application兩者都擁有username變數值,所以EL會依照先後順序來顯示資料(session >> application),所以上述程式便會輸出 jack。
如果想要取得web.xml所設定的初始變數值,可以利用initParam預設物件來完成,請看以下範例:

使用JSP

使用EL

<%=application.getInitParameter("host")%>

${initParam}


2. 利用EL接收網頁傳遞過來的資料 

接收網頁傳遞過來的資訊可使用EL所提供的預設物件

EL預設物件

對應的JSP的方法

param

request.getParameter()

paramValues

request.getParameterValues()


如果要顯示網頁傳遞過來的變數:

使用JSP

使用EL

<%=request.getParamater("username")%>

${param.username}

如果要顯示網頁傳遞過來的變數:(該變數為陣列時)

使用JSP

使用EL

<%

String[] paper = request.getParamaterValues("paper");

out.print("第一個項目:"+paper[0]);

%>

${paramValues.paper[0]}

 

3. 利用EL取得cookie資料

如果使用JSP來取得cookie中的username,可以使用以下程式碼:

Cookie[] ck = request.getCookies();
if (ck != null) {
for (int i = 0; i < ck.length; ++i)
if (ck[i].getName().equals("username")) {
out.print(ck[i].getValue());
break;
}
}

但如果使用EL的預設物件-cookie,就可以簡化成:
${cookie.username.value}

 

4. 利用EL取得網頁標頭資訊

取得標頭用EL所提供的預設物件

EL預設物件

對應的JSP的方法

header

request.getHeader()

headerValues

request.getHeaders()

舉例來說,如果想要取得目前網站主機名稱,可以使用以下方法:

使用JSP

使用EL

<%=request.getHeader("host")%>

${header.host}

<%=request.getContextPath() %>

${request.contextPath}

運用如下:

<a href="${request.contextPath}/Home" >Home</a>

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

在 freemark 的頁面要嵌入 action 及 參數( Parameters) 有兩種方式

1. 使用 struts2 tag: action

<img width='100px' src='
    <@s.action name="Picout" executeResult="success">  
           <@s.param name="name">${Session.userInfo['PHOTO_PATH']}</@s.param>  
    </@s.action>  
'/>

 

2. 使用 struts2 tag: url

<img width='100px' src='<@s.url action="Picout"><@s.param name="name">${Session.userInfo['PHOTO_PATH']}</@s.param></@s.url>' />

 

個人建議使用第2種方法較為方便

參考: http://www.mkyong.com/struts2/struts-2-url-tag-example/

struts2:在freemarker頁面取得 Application Cookie Request Session parameter

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Windows Server 2012 AD 移除 Sub Domain 的方法,有兩種方式:

方法一:利用 ntdsutil 指令

ntdsutil 指令操作說明如下

ntdsUtil_removeSubDomain_description.jpg  

實作如下:

ntDSUtil_renive_domain.png  

若移除不成功,則用 方法二:利用精靈 的強制移除

 

方法二:利用精靈

Step 01: 選擇 啟動[移除角色及功能精靈]

W2k12_AD_Remove01.png

Step 02:將 Active Directiory..的 Check Box 的勾移除,系統跳出提示視窗,選 "移除功能"

W2k12_AD_Remove02.png

Step 03: 再選 "將此網域控制站降級"

W2k12_AD_Remove03.png  

後續可以先嚐試正常的降級方式,若降級不下來,再使用強制降級

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Java 要對 Windows Server AD (Active Directory) 的認證整合,程式碼如下:

 

Step 01: 準備一個共用函數 LDAP_AUTH_AD

    /**
     * AD LDAP 登入認證
     *
     * @param ldap_url
     *            like ldap://912.168.2.1:389/DC=WEI,DC=COM
     * @param account
     * @param password
     * @return String[2] array 0 :0 success,1 fail,2 LDAP connect fail,3 unknow
     *         error array 1 :useremail
     */
    public String[] LDAP_AUTH_AD(String ldap_url, String account, String password) {
        String[] returnStr = new String[2];
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldap_url);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, account);
        env.put(Context.SECURITY_CREDENTIALS, password);

        LdapContext ctx = null;
        try {
            ctx = new InitialLdapContext(env, null);
            returnStr[0] = "0";

            SearchControls searchCtls = new SearchControls();
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String searchFilter = "(sAMAccountName=" + account + ")";

            String searchBase = "";
            int totalResults = 0;

            String returnedAtts[] = { "mail" };
            searchCtls.setReturningAttributes(returnedAtts);
            try {
                NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);

                while (answer.hasMoreElements()) {
                    SearchResult sr = (SearchResult) answer.next();
                    Attributes Attrs = sr.getAttributes();
                    if (Attrs != null) {
                        try {
                            for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
                                Attribute Attr = (Attribute) ne.next();
                                for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {
                                    returnStr[1] = e.next().toString();
                                }

                            }
                        } catch (NamingException e) {
                            System.err.println("Throw Exception : " + e);
                        }
                    }
                }
                loger.debug("Number: " + totalResults);
            } catch (Exception e) {
                loger.error("Can't find Email Address");
            }

            return returnStr;
        } catch (javax.naming.AuthenticationException e) {
            returnStr[0] = "1";
            e.printStackTrace();
            return returnStr;
        } catch (javax.naming.CommunicationException e) {
            // System.out.println("Can't connect to ldap server!");
            returnStr[0] = "2";

            return returnStr;
        } catch (Exception e) {
            System.out.println("error");
            e.printStackTrace();
            returnStr[0] = "3";

            return returnStr;
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (NamingException e) {

                }
            }
        }
    }

 

Step 02: 主程式

// 取得認證URL
String LDAP_URL="ldap://192.168.2.1:389/DC=WEI,DC=COM;WEI.COM";
LDAP_URL = LDAP_URL.split(";")[0];;
// 取得該公司網域
String AD_Domain="";
AD_Domain = "@"+LDAP_URL.split(";")[1].trim();

// AD認證方式登入
if(AUTH_METHOD.equalsIgnoreCase("AD") && !isLogin) {
    String[] as = baTools.LDAP_AUTH_AD(LDAP_URL, users.getUserName()+AD_Domain, users.getUserPassword());
    if (as[0].equals("0")) {
        isLogin = true;
        loginResult= SUCCESS;

    }else{
        this.addActionError("帳號登入錯誤");
    }
} // end AD認證方式登入

 

這樣就可以與您的公司的 AD (Active Directory) LDAP認證主機作整合.

程式碼:Java 對於LDAP: Windows Server AD (Active Directory) 的認證整合
http://misforum.ddns.net/forum.php?mod=viewthread&tid=20&fromuid=2
(出處: MISForum 資訊論壇)

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

JBOSS & Wildfly 常用設置

1. JBoss伺服器改成支援外網訪問
standalone.xml文件中找到

<interface name="public">
            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>

在這個下面加入

 <interface name="any">
            <any-ipv4-address/>
 </interface>

另外把1改成2
1  <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
2  <socket-binding-group name="standard-sockets" default-interface="any" port-offset="${jboss.socket.binding.port-offset:0}">

或改成

<interface name="public">
    <any-address/>
</interface>

也可以用圖形管理界面來作修改,如下圖,將 Address Wildcard 設為:Any Address,並將 Inet Address 設為空值,不然會有錯誤。

JBoss interface 對外  

修改管理介面的網址限制

jboss_manageIP  
 
2.
訪問埠的更改
<socket-binding name="http" port="${jboss.http.port:80}"/>
 
3.
改為可以修改JSP頁面不用重啟

<servlet-container name="default">
    <jsp-config/>
    <websockets/>
</servlet-container>

改為

<servlet-container name="default">
      <jsp-config development="true"/>
</servlet-container>

 
4.
部署的程式不用wildfly內置CXF
 在應用的WEB-INF目錄下面增加該檔:jboss-deployment-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
  <!-- exclude-subsystem prevents a subsystems deployment unit processors running on a deployment -->
     <!-- which gives basically the same effect as removing the subsystem, but it only affects single deployment -->
        <exclude-subsystems>
            <subsystem name="webservices" />
        </exclude-subsystems>
    </deployment>
</jboss-deployment-structure>

 

參考:

http://misforum.ddns.net/forum.php?mod=viewthread&tid=19

http://my.oschina.net/zhaoqian/blog/366406

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()