⑴ java web數據介面一般用什麼框架和技術來實現
開發webservice應用程序中離不開框架的支持,當open-open網站列舉的就有很多種,這對於開發者如何選擇帶來一定的疑惑。性能Webservice的關鍵要素,不同的框架性能上存在較大差異,而當前在官方網站、網路資料中可以方便的找到各自框架的介紹,但是很少有針對不同框架性能測試數據。本文選擇了比較流行幾個框架:
Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasy、sun JAX-WS(最簡單、方便)、阿里巴巴 Dubbo(除外)等,採用Java作為測試用例,通過本機和遠程兩種進行測試方式,對這幾種框架進行了性能測試,並對測試結果分析和性能比較,最後並對性能優異的框架進行了推薦。
目前三種主流的web服務實現方法:
REST(新型):表象化狀態轉變 (軟體架構風格)RESTEasy、Wink、CXF、Axis2…….
SOAP(比較成熟):簡單對象訪問協議 Xfire、Axis2、CXF、Axis1
XML-RPC(淘汰):遠程過程調用協議(慢慢被soap 所取代)
REST 簡單易用,效率高,貌似未來有很大的發展空間,也有宣稱rest性能個方便比soap強大的,已經有很多框架宣稱對rest進行支持比如spring 3.0、struts…….. (網路觀點)
SOAP 成熟度較高,安全性較好
⑵ java怎樣提供webservice介面
Java通過WSDL文件來調用webservice:
注意,以下的代碼並沒有經過真正的測試,只是說明這些情況,不同版本的Axis相差很大,大家最好以apache網站上的例子為准,這里僅僅用於說明其基本用法。
1,直接AXIS調用遠程的web service
這種方法比較適合那些高手,他們能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是專門搞這行的,即使一段時間看懂,後來也就忘記了。直接調用模式如下:
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
public class caClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
//直接引用遠程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("addUser");//WSDL裡面描述的介面名稱
call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
javax.xml.rpc.ParameterMode.IN);//介面的參數
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設置返回類型
String temp = "測試人員";
String result = (String)call.invoke(new Object[]{temp});
//給方法傳遞參數,並且調用方法
System.out.println("result is "+result);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
}
2,直接SOAP調用遠程的webservice
這種模式我從來沒有見過,也沒有試過,但是網路上有人貼出來,我也轉過來
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
import java.io.*;
import java.net.*;
import java.util.Vector;
public class caService{
public static String getService(String user) {
URL url = null;
try {
url=new URL("http://192.168.0.100:8080/ca3/services/caSynrochnized");
} catch (MalformedURLException mue) {
return mue.getMessage();
}
// This is the main SOAP object
Call soapCall = new Call();
// Use SOAP encoding
soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
// This is the remote object we're asking for the price
soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");
// This is the name of the method on the above object
soapCall.setMethodName("getUser");
// We need to send the ISBN number as an input parameter to the method
Vector soapParams = new Vector();
// name, type, value, encoding style
Parameter isbnParam = new Parameter("userName", String.class, user, null);
soapParams.addElement(isbnParam);
soapCall.setParams(soapParams);
try {
// Invoke the remote method on the object
Response soapResponse = soapCall.invoke(url,"");
// Check to see if there is an error, return "N/A"
if (soapResponse.generatedFault()) {
Fault fault = soapResponse.getFault();
String f = fault.getFaultString();
return f;
} else {
// read result
Parameter soapResult = soapResponse.getReturnValue ();
// get a string from the result
return soapResult.getValue().toString();
}
} catch (SOAPException se) {
return se.getMessage();
}
}
}
3,使用wsdl2java把WSDL文件轉成本地類,然後像本地類一樣使用,即可。
這是像我這種懶人最喜歡的方式,仍然以前面的global weather report為例。
首先 java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/globalweather.asmx.WSDL
原本的網址是http://www.webservicex.net/globalweather.asmx?WSDL,中間個各問號,但是Linux下面它不能解析,所以去掉問號,改為點號。
那麼就會出現4個文件:
GlobalWeather.java GlobalWeatherLocator.java GlobalWeatherSoap.java GlobalWeatherSoapStub.java
其中GlobalWeatherSoap.java是我們最為關心的介面文件,如果你對RMI等SOAP實現的具體細節不感興趣,那麼你只需要看介面文件即可,在使用的時候,引入這個介面即可,就好像使用本地類一樣。
⑶ java web項目中的介面,實現類和service介面,實現類區別
Dao是數據訪問層,用來保存數據。
Service是業務邏輯處理的。
我們開發程序的目的是為了完成業務功能,理想的情況下程序中的每一條語句都應該是與業務直接相關的,例如程序中不應該出現連接資料庫,讀取某個欄位等純技術性的操作,而應該是得到用戶A的基本信息等具有業務含義的操作.(dataaccessobject)層存在的意義在於將與數據持久化相關的函數調用剝離出去,提供一個具有業務含義的封裝層.原則上說,層與utils等幫助類的功能非常類似,只是更加復雜一些,需要依賴更多的對象(如DataSource,SessionFactory)等.如果不需要在程序中屏蔽我們對於特定數據持久層技術的依賴,例如屏蔽對於Hibernate的依賴,在層我們沒有必要採用介面設計.一些簡單的情況下我們甚至可以取消整個層,而直接調用封裝好的一些通用操作函數,或者調用通用的EntityDao類等.
程序開發的過程應該是從業務對象層開始的,並逐步將純技術性的函數調用剝離到外部的幫助類中,同時我們會逐漸發現一些業務操作的特定組合也具有明確的含義,為了調用的方便,我們會把它們逐步補充到service層中.在一般的應用中,業務邏輯很難穩定到可以抽象出介面的地步,即一個service介面不會對應於兩個不同的實現,在這種情況下使用介面往往也是沒有必要的.
在使用spring的情況下原則上應該避免使用getBean的調用方式,應該盡量通過注入來獲得依賴對象,但有時我們難免需要直接獲取業務對象,在不使用介面的情況下可以採用如下方式
classTaskService{
(){
return(TaskService)BeanLoader.getBean(TaskService.class);
}
}
在程序中我們可以直接使用TaskService.getInstance()來得到TaskService對象.通過命名規范的約定,我們可以從類名推導出spring配置文件中的對象名,因而不需要使用一個額外的硬編碼字元串名.
⑷ JavaWeb如何通過介面,找到介面所在的包和類
spring aop 攔截controller中所有方法
可以在方法執行完成後做些東西,比如在控制台列印類名和方法名
import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;@Aspect@Componentpublic class PrintInterfaceNameAspect { @AfterReturning(value = "execution(* com.demo.web.controller..*(..))") //替換成你自己的controller包名
public void afterReturnAdvice(JoinPoint point) { //類名
System.out.println(point.getSignature().getDeclaringTypeName()); //方法名
System.out.println(point.getSignature().getName());
}
}
⑸ java編寫一個webservice介面,介面中的方法參數應該是什麼,返回值呢(急)要求見補充,謝謝啦
private JaxWsProxyFactoryBean getProxyFactory(Class<?> clazz,String address){
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(clazz);
factory.setAddress(address);
return factory;
}
public void save(){
JaxWsProxyFactoryBean factory = getProxyFactory(ProgramVerWebService.class, PROGRAM_VER_WEB_SERVICE_ADDRESS);
ProgramVerWebService service = (ProgramVerWebService)factory.create();
String result = service.getEmpByAccount("abc");
System.out.println(result);
}
本地建立介面,如ProgramVerWebService,然後建立factory調用即可,這里用的是cxf
也可以用axis2通過解析wsdl文件來直接生成本地代碼,調用如下:
stub = new ();
GetEmpByAccountE e = new GetEmpByAccountE();
GetEmpByAccount request = new GetEmpByAccount();
request.setArg0("abc");
e.setGetEmpByAccount(request);
String result = stub.getEmpByAccount(e).getGetEmpByAccountResponse().get_return();
System.out.println(result);
⑹ java web項目中 各個系統之間交互的介面如何實現!
PHPRPC for Java 搜一下
⑺ java Webservice都有哪幾種方式啊,哪種方式比較好啊
webservice的應用已經越來越廣泛了,下面介紹幾種在Java體系中開發webservice的方式,相當於做個記錄。
1.Axis2
Axis是apache下一個開源的webservice開發組件,出現的算是比較早了,也比較成熟。這里主要介紹Axis+eclipse開發webservice,當然不用eclipse也可以開發和發布webservice,只是用eclipse會比較方便。
(1)下載eclipse的Java EE版本
(2)下載axis2
(3)下載eclipse的axis2插件
Axis2_Codegen_Wizard
Axis2_Service_Archiver
推薦使用1.3的版本
(4)eclipse安裝axis2插件
1)在任意目錄下新建一個Axis2文件夾,在該文件夾下新建eclipse目錄,在eclipse目錄中新建plugins目錄和features目錄,例如:D:\programSoftware\eclipse-SVN\Axis2\eclipse;
2)把下載的axis2插件解壓,並把解壓的文件放到新建的eclipse的plugins目錄下;
3)在%eclipse_home%的目錄下新建links目錄,並在links目錄下新建axis2.link文件,內容為:path=D:\programSoftware\eclipse-SVN\Axis2;
4)重啟eclipse,點擊·file-new-other,如果看到Axis2 Wizards,則表明插件安裝成功。
(5)安裝axis2
(6)使用eclipse新建web工程,創建一個普通java類,至少包含一個方法。
(7)發布webservice
1)點擊eclipse的File-New-other,打開Axis2 Wizards,選擇Axis2 Service Archiver,然後Next;
2)選擇Class File Location,也就是類文件存放路徑,注意:只選到classes目錄,不要包括包文件夾,然後Next;
3)選擇Skip WSDL,然後Next
4)一路Next到Select the Service XML file to be included in the Service archive,勾選Generate theservice xml automatically;
5)Service Name-填寫你的service名稱,Class Name-填寫類名稱,要包括包名,然後點擊load,然後點擊Finish,這時webservice就發布成功了;
6)然後到%TOMCAT_HOME%/webapps/axis2/WEB-INF/services 看看是否多了一個.aar的文件;
注意:以上的方式是發布到axis2.war包中,你也可以把生成.aar文件到你的實際應用中,同時,你也可以使用eclipse的create webservice功能發布你的webservice,選擇axis2生成你的webservice,這樣webservice就會部署到你的應用中了。
2.Apche CXF
CXF開發webservice也是比較方便和簡單的,它和spring的集成可以說是非常地好。舉一個CXF開發webservice的例子吧。
1)在eclipse中新建一個web工程,導入依賴包,如圖:
2)編寫一個介面,如:
注意:CXF開發的webservice,介面中的方法的參數一定要以這種方式,否則客戶端調用的時候CXF服務端會接收不到參數的值,name:參數名稱,可不寫(建議寫上),targetNamespace:命名空間,一定要填寫上,默認是包名反過來的順序,mode:參數類型,IN表示輸入。
3)編寫一個實現類,實現介面的方法;
4)和spring的集成,編寫一個bean文件,如:cxf-beans.xml,內容如下:
Cxf-beans.xml代碼
<?xml version="1.0" encoding="UTF-8" ?>
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="vote" implementor="com.zcl.cxf.service.VoteImpl" address="/Vote" />
</beans>
這個文件比較容易理解,就不解釋了。
5)配置CXFServlet
在web.xml文件中配置CXFServlet,載入cxf-beans.xml文件,內容如下:
Web.xml代碼
id="WebApp_ID" version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/cxf-beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
把工程部署到中間件,如tomcat,就可以訪問該webservice了。
3.JDK開發webservice
1)編寫一個Java類,如下:
Jdkwebservice.java代碼
package demo;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class JdkWebService {
return "Just do it," + value + "!";
}
public static void main(String[] args) {
}
}
2)運行該java類,在瀏覽器上就可以訪問該webservice了。
注意:開發web工程的時候,這種方法不太友好。我們可以編寫一個servlet類,在servlet類的初始化方法中發布webservice,這樣我們的中間件伺服器啟動的時候就會幫我們自動webservice了。
4) xfire
開發WebService的框架不少,每個框架都有各自的有點,最近我用xfire練習開發WebService,下面是開發WebService的小例子,希望對入門的人有些小幫助
1.新建一個java web project命名為TestWebService,將xfire相關的jar包添加到lib目錄中,寫介面類和實現類
Java代碼
package com.lamp.service;
public interface MessageService {
public String getName(String name);
}
[java] view plainprint?
package com.lamp.service;
public interface MessageService {
public String getName(String name);
}
實現類
Java代碼
package com.lamp.service.impl;
import com.lamp.service.MessageService;
public class MessageServiceImpl implements MessageService {
public String getName(String name) {
return "hellow " + name + ", welcome to WebService world";
}
}
[java] view plainprint?
package com.lamp.service.impl;
import com.lamp.service.MessageService;
public class MessageServiceImpl implements MessageService {
public String getName(String name) {
return "hellow " + name + ", welcome to WebService world";
}
}
在src目錄下新建文件夾META-INF,然後再在其下新建文件夾xfire,在xfire目錄下新建配置文件services.xml
Xml代碼
<?xml version="1.0" encoding="UTF-8"?>
<service>
<name>MessageService</name>
<serviceClass>com.lamp.service.MessageService</serviceClass>
<implementationClass>com.lamp.service.impl.MessageServiceImpl</implementationClass>
</service>
</beans>
[xml] view plainprint?
<?xml version="1.0" encoding="UTF-8"?>
<service>
<name>MessageService</name>
<serviceClass>com.lamp.service.MessageService</serviceClass>
<implementationClass>com.lamp.service.impl.MessageServiceImpl</implementationClass>
</service>
</beans>
最後在web.xml中配置xfire的servlet
Xml代碼
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
[xml] view plainprint?
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
這樣伺服器端開發完畢,現在開始客戶端的開發
新建一個java project也將xfire相關的jar引入,我用ant在客戶端生成代理對象,在項目路徑下新建build.xml,代碼為
Xml代碼
<?xml version="1.0" encoding="UTF-8"?>
<project name="WebService" basedir="." default="gen-webservice">
<property file="build.properties">
</property>
<path id="project-classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
</path>
<target name="gen-webservice">
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="project-classpath" />
<wsgen outputDirectory="${src.dir}"
wsdl="${wsdl.dir}" package="com.lamp.ws.client" overwrite="true"/>
</target>
</project>
[xml] view plainprint?
<?xml version="1.0" encoding="UTF-8"?>
<project name="WebService" basedir="." default="gen-webservice">
<property file="build.properties">
</property>
<path id="project-classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
</path>
<target name="gen-webservice">
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="project-classpath" />
<wsgen outputDirectory="${src.dir}"
wsdl="${wsdl.dir}" package="com.lamp.ws.client" overwrite="true"/>
</target>
</project>
⑻ java開發webservice介面有幾種方式
Support for Standards
JSR Support
JAX-WS - Java API for XML-Based Web Services (JAX-WS) 2.0 - JSR-224
Web Services Metadata for the Java Platform - JSR-181
JAX-RS - The Java API for RESTful Web Services - JSR-311
SAAJ - SOAP with Attachments API for Java (SAAJ) - JSR-67
WS-* and related Specifications Support
Basic support: WS-I Basic Profile 1.1
Quality of Service: WS-Reliable Messaging
Metadata: WS-Policy, WSDL 1.1 - Web Service Definition Language
Communication Security: WS-Security, WS-SecurityPolicy, WS-SecureConversation, WS-Trust (partial support)
Messaging Support: WS-Addressing, SOAP 1.1, SOAP 1.2, Message Transmission Optimization Mechanism (MTOM)
Multiple Transports, Protocol Bindings, Data Bindings, and Formats
Transports: HTTP, Servlet, JMS, In-VM and many others via the Camel transport for CXF such as SMTP/POP3, TCP and Jabber
Protocol Bindings: SOAP, REST/HTTP, pure XML
Data bindings: JAXB 2.x, Aegis, Apache XMLBeans, Service Data Objects (SDO), JiBX
Formats: XML Textual, JSON, FastInfoset
Extensibility API allows additional bindings for CXF, enabling additional message format support such as CORBA/IIOP
http://cxf.apache.org
⑼ 使用瀏覽器怎麼調用Java Web Service的介面
Java通過WSDL文件來調用webservice:
注意,以下的代碼並沒有經過真正的測試,只是說明這些情況,不同版本的Axis相差很大,大家最好以apache網站上的例子為准,這里僅僅用於說明其基本用法。
1,直接AXIS調用遠程的web service
這種方法比較適合那些高手,他們能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是專門搞這行的,即使一段時間看懂,後來也就忘記了。直接調用模式如下:
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
public class caClient {
public static void main(String[] args) {
try {
String endpoint = "";
//直接引用遠程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("addUser");//WSDL裡面描述的介面名稱
call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
javax.xml.rpc.ParameterMode.IN);//介面的參數
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設置返回類型
String temp = "測試人員";
String result = (String)call.invoke(new Object[]{temp});
//給方法傳遞參數,並且調用方法
System.out.println("result is "+result);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
}
2,直接SOAP調用遠程的webservice
這種模式我從來沒有見過,也沒有試過,但是網路上有人貼出來,我也轉過來
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
import java.io.*;
import java.net.*;
import java.util.Vector;
public class caService{
public static String getService(String user) {
URL url = null;
try {
url=new URL("");
} catch (MalformedURLException mue) {
return mue.getMessage();
}
// This is the main SOAP object
Call soapCall = new Call();
// Use SOAP encoding
soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
// This is the remote object we're asking for the price
soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");
// This is the name of the method on the above object
soapCall.setMethodName("getUser");
// We need to send the ISBN number as an input parameter to the method
Vector soapParams = new Vector();
// name, type, value, encoding style
Parameter isbnParam = new Parameter("userName", String.class, user, null);
soapParams.addElement(isbnParam);
soapCall.setParams(soapParams);
try {
// Invoke the remote method on the object
Response soapResponse = soapCall.invoke(url,"");
// Check to see if there is an error, return "N/A"
if (soapResponse.generatedFault()) {
Fault fault = soapResponse.getFault();
String f = fault.getFaultString();
return f;
} else {
// read result
Parameter soapResult = soapResponse.getReturnValue ();
// get a string from the result
return soapResult.getValue().toString();
}
} catch (SOAPException se) {
return se.getMessage();
}
}
}