當前位置:首頁 » 網頁前端 » web極速實例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

web極速實例

發布時間: 2023-08-29 01:45:07

㈠ 如何編寫一個簡單的java web前後端實例

你說的是一個完整的BS請求--響應模式,很多種方式都可以實現,
最簡單的方法:寫一個 form 表單,然後配置servlet ,提交數據到servlet,在servlet中實現你的邏輯如你保存資料庫的操作,然後由servlet 轉發到jsp 頁面進行網頁響應就可以了。ITjob的朋友跟我分享過的,發給你了不用謝~

㈡ 如何讓一個WEB頁面24小時一直開啟,不過期

解決方案:
1,在頁面元素載入之前,定義js計時器,並賦值為0;
2,在頁面元素載入之前,綁定body的滑鼠單擊事件處理函數--每次滑鼠單擊body都重新賦值計時
器為0;
3,在html中body中定義一個隱藏域,值為伺服器上session的最大時間。
4,在頁面元素載入完畢後,啟動session超時監聽器:該監聽器實現的功能是:
獲取頁面上隱藏域的session的最大超時時間,
比較計數器和session最大值,如果計時器的數值小於session的最大時間則,計數器+1,重新
調用session監聽器, 如果計數器的數值大於等於session的的最大時間,則調用dwr或ajax
讓後台的session失效
實例:
<html>
<head>
<script type="text/javascript">
//定義計時器
var monitorCount = 0;

//綁定body的onclick處理函數
document.body.onclick = function()
{
if(typeof bodyOnClickFunction == 'function')
{
bodyOnClickFunction();
}
}

//body的單擊處理函數
function bodyOnClickFunction()
{
resetTimeoutCount();
}

//重置計數器為0
function resetTimeoutCount()
{
monitorCount = 0
}

var timeOutFunction = "sessionTimeOutMonitor()";

function sessionTimeOutMonitor()
{
var sessionTimeCount = document.getElementById("sessionTimeCount").value / 60;

if(monitorCount < sessionTimeCount)
{
monitorCount++;
setTimeOut(sessionTimeOutMonitor,60 * 1000);
}
else
{
//調用ajax或者dwr調用使後台的session失效
}
}
</script>
</head>
<body onload="sessionTimeOutMonitor();">
<input type="hidden" value="從伺服器上獲取session的最大超時數值" id="sessionTimeCount"/>
</body>
</html>

轉自 http://www.tuicool.com/articles/ZR3QRfR

㈢ 如何用Java實現Web伺服器

一 HTTP協議的作用原理

WWW是以Internet作為傳輸媒介的一個應用系統 WWW網上最基本的傳輸單位是Web網頁 WWW的工作基於客戶機/伺服器計算模型 由Web 瀏覽器(客戶機)和Web伺服器(伺服器)構成 兩者之間採用超文本傳送協議(HTTP)進行通信 HTTP協議是基於TCP/IP協議之上的協議 是Web瀏覽器和Web伺服器之間的應用層協議 是通用的 無狀態的 面向對象的協議 HTTP協議的作用原理包括四個步驟

( ) 連接 Web瀏覽器與Web伺服器建立連接 打開一個稱為socket(套接字)的虛擬文件 此文件的建立標志著連接建立成功

( ) 請求 Web瀏覽器通過socket向Web伺服器提交請求 HTTP的請求一般是GET或POST命令(POST用於FORM參數的傳遞) GET命令的格式為

GET 路徑/文件名 HTTP/

文件名指出所訪問的文件 HTTP/ 指出Web瀏覽器使用的HTTP版本

( ) 應答 Web瀏覽器提交請求後 通過HTTP協議傳送給Web伺服器 Web伺服器接到後 進行事務處理 處理結果又通過HTTP傳回給Web瀏覽器 從而在Web瀏覽器上顯示出所請求的頁面

例 假設客戶機與 /mydir/l建立了連接 就會發送GET命令 GET /mydir/l HTTP/ 主機名為的Web伺服器從它的文檔空間中搜索子目錄mydir的文件l 如果找到該文件 Web伺服器把該文件內容傳送給相應的Web瀏覽器

為了告知 Web瀏覽器傳送內容的類型 Web伺服器首先傳送一些HTTP頭信息 然後傳送具體內容(即HTTP體信息) HTTP頭信息和HTTP體信息之間用一個空行分開

常用的HTTP頭信息有

① HTTP OK

這是Web伺服器應答的第一行 列出伺服器正在運行的HTTP版本號和應答代碼 代碼 OK 表示請求完成

② MIME_Version

它指示MIME類型的版本

③ content_type 類型

這個頭信息非常重要 它指示HTTP體信息的MIME類型 如 content_type text/指示傳送的數據是HTML文檔

④ content_length 長度值

它指示HTTP體信息的長度(位元組)

( ) 關閉連接 當應答結束後 Web瀏覽器與Web伺服器必須斷開 以保證其它Web瀏覽器能夠與Web伺服器建立連接

二絕敗胡 Java實現Web伺服器功能的程序設計

根據上述HTTP協議的作用原理 實現GET請求的Web伺服器程序的方法如下

( ) 創並攔建ServerSocket類對象 監聽埠 這是為了區別於HTTP的標准TCP/IP埠 而取的

( ) 等待 接受客戶機連接到埠 得到與客戶機連接的socket

( )枯大 創建與socket字相關聯的輸入流instream和輸出流outstream

( ) 從與socket關聯的輸入流instream中讀取一行客戶機提交的請求信息 請求信息的格式為 GET 路徑/文件名 HTTP/

( ) 從請求信息中獲取請求類型 如果請求類型是GET 則從請求信息中獲取所訪問的HTML文件名 沒有HTML文件名時 則以l作為文件名

( ) 如果HTML文件存在 則打開HTML文件 把HTTP頭信息和HTML文件內容通過socket傳回給Web瀏覽器 然後關閉文件 否則發送錯誤信息給Web瀏覽器

( ) 關閉與相應Web瀏覽器連接的socket字

下面的程序是根據上述方法編寫的 可實現多線程的Web伺服器 以保證多個客戶機能同時與該Web伺服器連接

程序 WebServer java文件

//WebServer java 用JAVA編寫Web伺服器

import java io *

import *

public class WebServer {

public static void main(String args[]) {

int i= PORT=

ServerSocket server=null

Socket client=null

try {

server=new ServerSocket(PORT)

System out println( Web Server is listening on port +server getLocalPort())

for ( ) {client=server accept() //接受客戶機的連接請求

new ConnectionThread(client i) start()

i++

}

} catch (Exception e) {System out println(e) }

}

}

/* ConnnectionThread類完成與一個Web瀏覽器的通信 */

class ConnectionThread extends Thread {

Socket client //連接Web瀏覽器的socket字

int counter //計數器

public ConnectionThread(Socket cl int c) {

client=cl

counter=c

}

public void run() //線程體

{try {

String destIP=client getInetAddress() toString() //客戶機IP地址

int destport=client getPort() //客戶機埠號

System out println( Connection +counter+ connected to +destIP+ on port +destport+ )

PrintStream outstream=new PrintStream(client getOutputStream())

DataInputStream instream=new DataInputStream(client getInputStream())

String inline=instream readLine() //讀取Web瀏覽器提交的請求信息

System out println( Received +inline)

if (getrequest(inline)) { //如果是GET請求

String filename=getfilename(inline)

File file=new File(filename)

if (file exists()) { //若文件存在 則將文件送給Web瀏覽器

System out println(filename+ requested )

outstream println( HTTP/ OK )

outstream println( MIME_version )

outstream println( Content_Type text/ )

int len=(int)file length()

outstream println( Content_Length +len)

outstream println( )

sendfile(outstream file) //發送文件

outstream flush()

} else { //文件不存在時

String notfound=

Error file not found

outstream println( HTTP/ no found )

outstream println( Content_Type text/ )

outstream println( Content_Length +notfound length()+ )

outstream println( )

outstream println(notfound)

outstream flush()

}

}

long m =

while (m < ) {m ++ } //延時

client close()

} catch (IOException e) {

System out println( Exception +e)

}

}

/* 獲取請求類型是否為 GET */

boolean getrequest(String s) {

if (s length()> )

{if (s substring( ) equalsIgnoreCase( GET )) return true

}

return false

}

/* 獲取要訪問的文件名 */

String getfilename(String s) {

String f=s substring(s indexOf(′ ′)+ )

f=f substring( f indexOf(′ ′))

try {

if (f charAt( )==′/′)

f=f substring( )

} catch ( e) {

System out println( Exception +e)

}

if (f equals( )) f= l

return f

}

/*把指定文件發送給Web瀏覽器 */

void sendfile(PrintStream outs File file) {

try {

DataInputStream in=new DataInputStream(new FileInputStream(file))

int len=(int)file length()

byte buf[]=new byte[len]

in readFully(buf)

outs write(buf len)

outs flush()

in close()

} catch (Exception e) {

System out println( Error retrieving file )

System exit( )

}

}

}

程序中的ConnectionThread線程子類用來分析一個Web瀏覽器提交的請求 並將應答信息傳回給Web瀏覽器 其中 getrequest()方法用來檢測客戶的請求是否為 GET getfilename(s)方法是從客戶請求信息s中獲取要訪問的HTML文件名 sendfile()方法把指定文件內容通過socket傳回給Web瀏覽器

對上述程序的getrequest()方法和相關部分作修改 也能對POST請求進行處理

三 運行實例

為了測試上述程序的正確性 將編譯後的WebServer class ConnectionThread class和下面的l文件置於網路的某台主機的同一目錄中(如 主機NT SRV的C JWEB目錄)

程序 l文件

這是用JAVA寫出的WEB伺服器主頁

年 月 日


首先在該主機上用java命令運行WebServer class

C jweb>java webserver

然後在客戶機運行瀏覽器軟體 在URL處輸入WebServer程序所屬的URL地址(如 ) 就在瀏覽器窗口顯示出指定的HTML文檔

注意 不能預設埠號 如預設 則運行該主機的正常WEB伺服器

lishixin/Article/program/Java/hx/201311/26626

㈣ 如何編寫一個簡單的java web前後端實例

Java代碼編寫的30條實踐建議,很多人認為學習java需要較好的計算機語言基礎,而事實上高中學歷的學習java,月薪過萬的比比皆是,Java代碼編寫的30條實踐建議,java知識點學習貴在積累。
Java代碼編寫的30條實踐建議:
(1) 類名首字母應該大寫。欄位、方法以及對象(句柄)的首字母應小寫。對於所有標識符,其中包含的所有單詞都應緊靠在一起,而且大寫中間單詞的首字母。
例如:
ThisIsAClassName
thisIsMethodOrFieldName
若在定義中出現了常數初始化字元,則大寫static final基本類型標識符中的所有字母。這樣便可標 志出它們屬於編譯期的常數。
Java包(Package)屬於一種特殊情況:它們全都是小寫字母,即便中間的單詞亦是如此。對於域名擴展名稱,如com,org,net或者e等,全部都應小寫(這也是Java 1.1和Java 1.2的區別之一)。
(2) 為了常規用途而創建一個類時,請採取"經典形式",並包含對下述元素的定義:
equals()
hashCode()
toString()
clone()(implement Cloneable)
implement Serializable
(3) 對於自己創建的每一個類,都考慮置入一個main(),其中包含了用於測試那個類的代碼。為使用一個項目中的類,我們沒必要刪除測試代碼。若進行了任何形式的改動,可方便地返回測試。這些代碼也可作為如何使用類的一個示例使用。
(4) 應將方法設計成簡要的、功能性單元,用它描述和實現一個不連續的類介面部分。理想情況下,方法應簡明扼要。若長度很大,可考慮通過某種方式將其分割成較短的幾個方法。這樣做也便於類內代碼的重復使用(有些時候,方法必須非常大,但它們仍應只做同樣的一件事情)。
(5) 設計一個類時,請設身處地為客戶程序員考慮一下(類的使用方法應該是非常明確的)。然後,再設身處地為管理代碼的人考慮一下(預計有可能進行哪些形式的修改,想想用什麼方法可把它們變得更簡單)。
(6) 使類盡可能短小精悍,而且只解決一個特定的問題。下面是對類設計的一些建議:
■一個復雜的開關語句:考慮採用"多形"機制
■數量眾多的方法涉及到類型差別極大的操作:考慮用幾個類來分別實現
■許多成員變數在特徵上有很大的差別:考慮使用幾個類
(7) 讓一切東西都盡可能地"私有"--private。可使庫的某一部分"公共化"(一個方法、類或者一個欄位等等),就永遠不能把它拿出。若強行拿出,就可能破壞其他人現有的代碼,使他們不得不重新編寫和設計。若只公布自己必須公布的,就可放心大膽地改變其他任何東西。
在多線程環境中,隱私是特別重要的一個因素--只有private欄位才能在非同步使用的情況下受到保護。
(8) 謹惕"巨大對象綜合症"。對一些習慣於順序編程思維、且初涉OOP領域的新手,往往喜歡先寫一個順序執行的程序,再把它嵌入一個或兩個巨大的對象里。根據編程原理,對象表達的應該是應用程序的概念,而非應用程序本身。
(9) 若不得已進行一些不太雅觀的編程,至少應該把那些代碼置於一個類的內部。
(10) 任何時候只要發現類與類之間結合得非常緊密,就需要考慮是否採用內部類,從而改善編碼及維護工作(參見第14章14.1.2小節的"用內部類改進代碼")。
(11) 盡可能細致地加上注釋,並用javadoc注釋文檔語法生成自己的程序文檔。
(12) 避免使用"魔術數字",這些數字很難與代碼很好地配合。如以後需要修改它,無疑會成為一場噩夢,因為根本不知道"100"到底是指"數組大小"還是"其他全然不同的東西"。所以,我們應創建一個常數,並為其使用具有說服力的描述性名稱,並在整個程序中都採用常數標識符。這樣可使程序更易理解以及更易維護。
(13) 涉及構建器和異常的時候,通常希望重新丟棄在構建器中捕獲的任何異常--如果它造成了那個對象的創建失敗。這樣一來,調用者就不會以為那個對象已正確地創建,從而盲目地繼續。
(14) 當客戶程序員用完對象以後,若你的類要求進行任何清除工作,可考慮將清除代碼置於一個良好定義的方法里,採用類似於cleanup()這樣的名字,明確表明自己的用途。除此以外,可在類內放置一個boolean(布爾)標記,指出對象是否已被清除。在類的finalize()方法里,請確定對象已被清除,並已丟棄了從RuntimeException繼承的一個類(如果還沒有的話),從而指出一個編程錯誤。在採取象這樣的方案之前,請確定finalize()能夠在自己的系統中工作(可能需要調用System.runFinalizersOnExit(true),從而確保這一行為)。
(15) 在一個特定的作用域內,若一個對象必須清除(非由垃圾收集機制處理),請採用下述方法:初始化對象;若成功,則立即進入一個含有finally從句的try塊,開始清除工作。
(16) 若在初始化過程中需要覆蓋(取消)finalize(),請記住調用super.finalize()(若Object屬於我們的直接超類,則無此必要)。在對finalize()進行覆蓋的過程中,對super.finalize()的調用應屬於最後一個行動,而不應是第一個行動,這樣可確保在需要基礎類組件的時候它們依然有效。
(17) 創建大小固定的對象集合時,請將它們傳輸至一個數組(若准備從一個方法里返回這個集合,更應如此操作)。這樣一來,我們就可享受到數組在編譯期進行類型檢查的好處。此外,為使用它們,數組的接收者也許並不需要將對象"造型"到數組里。
(18) 盡量使用interfaces,不要使用abstract類。若已知某樣東西准備成為一個基礎類,那麼第一個選擇應是將其變成一個interface(介面)。只有在不得不使用方法定義或者成員變數的時候,才需要將其變成一個abstract(抽象)類。介面主要描述了客戶希望做什麼事情,而一個類則致力於(或允許)具體的實施細節。
(19) 在構建器內部,只進行那些將對象設為正確狀態所需的工作。盡可能地避免調用其他方法,因為那些方法可能被其他人覆蓋或取消,從而在構建過程中產生不可預知的結果(參見第7章的詳細說明)。
(20) 對象不應只是簡單地容納一些數據;它們的行為也應得到良好的定義。
(21) 在現成類的基礎上創建新類時,請首先選擇"新建"或"創作"。只有自己的設計要求必須繼承時,才應考慮這方面的問題。若在本來允許新建的場合使用了繼承,則整個設計會變得沒有必要地復雜。
(22) 用繼承及方法覆蓋來表示行為間的差異,而用欄位表示狀態間的區別。一個非常極端的例子是通過對不同類的繼承來表示顏色,這是絕對應該避免的:應直接使用一個"顏色"欄位。
(23) 為避免編程時遇到麻煩,請保證在自己類路徑指到的任何地方,每個名字都僅對應一個類。否則,編譯器可能先找到同名的另一個類,並報告出錯消息。若懷疑自己碰到了類路徑問題,請試試在類路徑的每一個起點,搜索一下同名的.class文件。
(24) 在Java 1.1 AWT中使用事件"適配器"時,特別容易碰到一個陷阱。若覆蓋了某個適配器方法,同時拼寫方法沒有特別講究,最後的結果就是新添加一個方法,而不是覆蓋現成方法。然而,由於這樣做是完全合法的,所以不會從編譯器或運行期系統獲得任何出錯提示--只不過代碼的工作就變得不正常了。
(25) 用合理的設計方案消除"偽功能"。也就是說,假若只需要創建類的一個對象,就不要提前限制自己使用應用程序,並加上一條"只生成其中一個"注釋。請考慮將其封裝成一個"獨生子"的形式。若在主程序里有大量散亂的代碼,用於創建自己的對象,請考慮採納一種創造性的方案,將些代碼封裝起來。
(26) 警惕"分析癱瘓"。請記住,無論如何都要提前了解整個項目的狀況,再去考察其中的細節。由於把握了全局,可快速認識自己未知的一些因素,防止在考察細節的時候陷入"死邏輯"中。
(27) 警惕"過早優化"。首先讓它運行起來,再考慮變得更快--但只有在自己必須這樣做、而且經證實在某部分代碼中的確存在一個性能瓶頸的時候,才應進行優化。除非用專門的工具分析瓶頸,否則很有可能是在浪費自己的時間。
性能提升的隱含代價是自己的代碼變得難於理解,而且難於維護。
(28) 請記住,閱讀代碼的時間比寫代碼的時間多得多。思路清晰的設計可獲得易於理解的程序,但注釋、細致的解釋以及一些示例往往具有不可估量的價值。無論對你自己,還是對後來的人,它們都是相當重要的。如對此仍有懷疑,那麼請試想自己試圖從聯機Java文檔里找出有用信息時碰到的挫折,這樣或許能將你說服。
(29) 如認為自己已進行了良好的分析、設計或者實施,那麼請稍微更換一下思維角度。試試邀請一些外來人士--並不一定是專家,但可以是來自本公司其他部門的人。請他們用完全新鮮的眼光考察你的工作,看看是否能找出你一度熟視無睹的問題。採取這種方式,往往能在最適合修改的階段找出一些關鍵性的問題,避免產品發行後再解決問題而造成的金錢及精力方面的損失。
(30) 良好的設計能帶來最大的回報。簡言之,對於一個特定的問題,通常會花較長的時間才能找到一種最恰當的解決方案。但一旦找到了正確的方法,以後的工作就輕松多了,再也不用經歷數小時、數天或者數月的痛苦掙扎。我們的努力工作會帶來最大的回報(甚至無可估量)。而且由於自己傾注了大量心血,最終獲得一個出色的設計方案,成功的快感也是令人心動的。堅持抵制草草完工的誘惑--那樣做往往得不償失。

㈤ 怎樣在myecplise8開發webservice 簡單實例

1.1.系統功能:

開發一個計算器服務CalculateService,這個服務包含加(plus)、減(minus)、乘(multiply)、除(divide)的操作。

1.2.開發前准備:

安裝Eclipse-jee;

下載最新版本的Axis2,網址http://axis.apache.org/axis2/java/core/download.cgi
,選擇Standard Binary Distribution的zip包,解壓縮得到的目錄名axis2-1.4.1,目錄內的文件結構如下:

1.3.開發前配置:

在Eclipse的菜單欄中,Window --> Preferences --> Web Service -->
Axis2 Perferences,在Axis2 runtime
location中選擇Axis2解壓縮包的位置,設置好後,點"OK"即行。(如圖)

1.4.開發Web Service:

(1)新建一個Java Project,命名為"WebServiceTest1"
(2)新建一個class,命名為"CalculateService",完整代碼如下:

package e.sjtu.webservice;
/**
* 計算器運算
* @author rongxinhua
*/
public class CalculateService {
//加法
public float plus(float x, float y) {
return x + y;
}
//減法
public float minus(float x, float y) {
return x - y;
}
//乘法
public float multiply(float x, float y) {
return x * y;
}
//除法
public float divide(float x, float y) {
if(y!=0)
{
return x / y;
}
else
return -1;
}
}

(3)在"WebServiceTest1"項目上new --> other,找到"Web Services"下面的"Web Service";

(4)下一步(next),在出現的Web Services對象框,在Service
implementation中點擊"Browse",進入Browse
Classes對象框,查找到我們剛才寫的寫的CalculateService類。(如下圖)。點擊"ok",則回到Web Service話框。

(5)在Web Service對話框中,將Web Service type中的滑塊,調到"start service「的位置,將Client type中的滑塊調到"Test client"的位置。

(6)在Web Service
type滑塊圖的右邊有個"Configuration",點擊它下面的選項,進入ServiceDeployment
Configuration對象框,在這里選擇相應的Server(我這里用Tomcat6.0)和Web
Serviceruntime(選擇Apache Axis2),如下圖:

(7)點OK後,則返回到Web Service對話框,同理,Client
type中的滑塊右邊也有"Configuration",也要進行相應的置,步驟同上。完成後,Next -->
next即行。進入到Axis2 Web Service Java Bean Configuration,我們選擇Generate a
default services.xml,如下圖所示:

(8)到了Server startup對話框,有個按鍵"start server"(如下圖),點擊它,則可啟動Tomcat伺服器了。

(9)等啟完後,點擊"next -- > next",一切默認即行,最後,點擊完成。最後,出現如下界面:(Web Service
Explorer),我們在這里便可測試我們的Web服務。(使用瀏覽器打開的話使用如下地址:http://127.0.0.1:19189/wse
/wsexplorer/wsexplorer.jsp?org.eclipse.wst.ws.explorer=3)。如下圖所示:

註:在瀏覽器中打開Web Service Explorer(有時候在eclipse中關閉了webservice explorer,可以用這種方法打開)
首先登錄地址:http://127.0.0.1:19189/wse/wsexplorer/wsexplorer.jsp。然後在網頁右上角選擇
Web Service
Exoplorer標簽。然後輸入WSDL地址:http://localhost:8080/WebServiceTest1/services
/CalculateService?wsdl 。這個wsdl地址就是我們剛才發布服務的那個wsdl。點擊go,如下圖所示:

然後就可以看到如下界面了:

(10)測試比較簡單,例如,我們選擇一個"plus"的Operation(必須是
CalculateServiceSoap11Binding),出現下圖,在x的輸入框中輸入1,在y的輸入框中輸入2,點擊"go",便會在
status欄中顯示結果3.0。其他方法的測試也類似。結果如上圖所示。

1.5.CalculateService客戶端調用程序

前面我們已經定義好了加減乘除的方法並將這些方法發布為服務,那麼現在要做的就是調用這些服務即可。客戶端調用程序如下代碼所示:CalculateServiceTest.java

package e.sjtu.webservice.test;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class CalculateServiceTest {
/**
* @param args
* @throws AxisFault
*/
public static void main(String[] args) throws AxisFault {
// TODO Auto-generated method stub
// 使用RPC方式調用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定調用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/WebServiceTest1/services/CalculateService");
options.setTo(targetEPR);
// 指定要調用的計算機器中的方法及WSDL文件的命名空間:e.sjtu.webservice。
QName opAddEntry = new QName("http://webservice.sjtu.e","plus");//加法
QName opAddEntryminus = new QName("http://webservice.sjtu.e","minus");//減法
QName opAddEntrymultiply = new QName("http://webservice.sjtu.e","multiply");//乘法
QName opAddEntrydivide = new QName("http://webservice.sjtu.e","divide");//除法
// 指定plus方法的參數值為兩個,分別是加數和被加數
Object[] opAddEntryArgs = new Object[] { 1,2 };
// 指定plus方法返回值的數據類型的Class對象
Class[] classes = new Class[] { float.class };
// 調用plus方法並輸出該方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntryminus,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntrymultiply,opAddEntryArgs, classes)[0]);
System.out.println(serviceClient.invokeBlocking(opAddEntrydivide,opAddEntryArgs, classes)[0]);
}
}

運行結果:

3.0
-1.0
2.0
0.5

2.實例

2.HelloService

(1)首先定義服務方法,代碼如下所示:

package e.sjtu.webservice;
public class HelloService {
public String sayHelloNew() {
return "hello";
}
public String sayHelloToPersonNew(String name) {
if (name == null) {
name = "nobody";
}
return "hello," + name;
}
public void updateData(String data) {
System.out.println(data + " 已更新。");
}
}

(2)參考實例1將這個方法發布為服務。

(3)編寫客戶端代碼調用WebService(主要參考[5])

本文例子與其他例子最大的不同就在這里,其他例子一般需要根據剛才的服務wsdl生成客戶端stub,然後通過stub來調用服務,這種方式顯得比
較單一,客戶端必須需要stub存根才能夠訪問服務,很不方面。本例子的客戶端不採用stub方式,而是一種實現通用的調用方式,不需要任何客戶端存根即
可訪問服務。只需要指定對於的web servce地址、操作名、參數和函數返回類型即可。代碼如下所示:

HelloServiceTest2.java
package e.sjtu.webservice.test;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class HelloServiceTest2 {
private RPCServiceClient serviceClient;
private Options options;
private EndpointReference targetEPR;
public HelloServiceTest2(String endpoint) throws AxisFault {
serviceClient = new RPCServiceClient();
options = serviceClient.getOptions();
targetEPR = new EndpointReference(endpoint);
options.setTo(targetEPR);
}
public Object[] invokeOp(String targetNamespace, String opName,
Object[] opArgs, Class<?>[] opReturnType) throws AxisFault,
ClassNotFoundException {
// 設定操作的名稱
QName opQName = new QName(targetNamespace, opName);
// 設定返回值
// Class<?>[] opReturn = new Class[] { opReturnType };
// 操作需要傳入的參數已經在參數中給定,這里直接傳入方法中調用
return serviceClient.invokeBlocking(opQName, opArgs, opReturnType);
}
/**
* @param args
* @throws AxisFault
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws AxisFault,
ClassNotFoundException {
// TODO Auto-generated method stub
final String endPointReference = "http://localhost:8080/WebServiceTest1/services/HelloService";
final String targetNamespace = "http://webservice.sjtu.e";
HelloServiceTest2 client = new HelloServiceTest2(endPointReference);
String opName = "sayHelloToPersonNew";
Object[] opArgs = new Object[] { "My Friends" };
Class<?>[] opReturnType = new Class[] { String[].class };
Object[] response = client.invokeOp(targetNamespace, opName, opArgs,
opReturnType);
System.out.println(((String[]) response[0])[0]);
}
}

運行該程序,點擊Run As->Java application,可以看到控制台埠的輸出是:Hello, My
Friends,表明客戶端調用成功。該例子最大的不同和優勢表現在客戶端的調用方式,或者說是發起服務調用的方式,雖然比起客戶端stub存根的方式,
代碼稍多,但是這種方式統一,不需要生產stub存根代碼,解決了客戶端有很多類的問題。如果讀者對這些代碼進一步封裝,我想調用方式很簡單,只需要傳遞
相關參數,這更好地說明了服務調用的優勢。而且這種方式更加簡單明了,一看便知具體含義。而不需要弄得stub類的一些機制。

(4)改寫客戶端調用服務的代碼

(3)中提到的客戶端應用代碼寫的略微有些繁雜,下面將上面的客戶端調用service程序進行改寫,簡潔了許多。代碼如下:

HelloServiceTest.java
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class HelloServiceTest {
public static void main(String args[]) throws AxisFault {
// 使用RPC方式調用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定調用WebService的URL
EndpointReference targetEPR = new EndpointReference("http://localhost:8080/WebServiceTest1/services/HelloService");
options.setTo(targetEPR);
// 指定要調用的sayHelloToPerson方法及WSDL文件的命名空間
QName opAddEntry = new QName("http://webservice.sjtu.e","sayHelloToPersonNew");
// 指定sayHelloToPerson方法的參數值
Object[] opAddEntryArgs = new Object[] { "xuwei" };
// 指定sayHelloToPerson方法返回值的數據類型的Class對象
Class[] classes = new Class[] { String.class };
// 調用sayHelloToPerson方法並輸出該方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
}
}