0
点赞
收藏
分享

微信扫一扫

计算器之webservice实现

以下是本人原创,如若转载和使用请注明转载地址。本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!​​​


一、根据我的上一篇博客

​​MyEclipse构建Web Service(Xfire框架)​​

下面是我实现的网页版的计算器,本来想着用php去调用webservice的接口,由于时间原因,现在用java去调用webservice接口。

再根据原先实现过的吧B/S 架构的计算器作业,现将网页说明博客如下:

​​Ext实现简单计算器​​

二、编写自己的类

根据上一篇博客的说明我们建立一个用于实现计算器的webservice类ExpWebService.java,其代码如下所示:

package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
import org.apache.commons.jexl.JexlContext;
import org.apache.commons.jexl.JexlHelper;

/**
*
* 项目名称:CalculatorWebService
* 类名称:ExpWebService
* 类描述:
* 创建人:王少帅
* 创建时间:2013-12-12 下午02:58:32
* @version
*/
public class ExpWebService {

/**
*
* expCalculator(使用jexl自带的方式处理exp得到计算器的值)
* @param name
* @return String
* @Exception
*/
public String expCalculator(String exp) throws Exception {
// TODO Auto-generated method stub
Expression e = ExpressionFactory.createExpression(exp);//使用提供的expression提供的方法
JexlContext jc = JexlHelper.createContext();
Object result = e.evaluate(jc);//计算出结果
return result.toString();
}

}

三、客户端去调用相应的webservice,这里是CalculatorWebService

我们先new->webservice client 之后新建项目叫Calculator01,将服务器端的wsdl的url添加好即可,现在我们用到页面去实现计算器的功能,这里我们客户端(其实也在服务器端,以为是B/S 架构的),我们去调用CalculatorWebService提供的方法ExpWebService来求出计算结果。

下面是包的结构:

计算器之webservice实现_apache

之后我们看到我们的action中类CalculatorAction.java中的代码如下:

package com.wss.action;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import server.CalculatorWebServiceClient;
import server.CalculatorWebServicePortType;

/**
*
* 项目名称:Calculator01
* 类名称:CalculatorAction
* 类描述: 接收客户端的计算式来计算结果
* 创建人:王少帅
* 创建时间:2013-12-12 下午03:50:32
* @version
*/
public class CalculatorAction {
public String exp;

public String getExp() {
return exp;
}

public void setExp(String exp) {
this.exp = exp;
}

public void execute() throws Exception{

//这里使用webserviceClient来调用webservice的方法
CalculatorWebServiceClient calculatorWebServiceClient = new CalculatorWebServiceClient();
CalculatorWebServicePortType service = calculatorWebServiceClient.getCalculatorWebServiceHttpPort();

String result = service.expCalculator(exp); //调用expCalculator方法来实现

HttpServletResponse response = ServletActionContext.getResponse();//返回页面进行查看

response.getWriter().write(result);

}

}

四、自动生成的文件分析

如图自动生成的文件:

计算器之webservice实现_apache_02


下面是CalculatorWebServiceClient.java的文件内容:

package server;

import java.net.MalformedURLException;
import java.util.Collection;
import java.util.HashMap;
import javax.xml.namespace.QName;
import org.codehaus.xfire.XFireRuntimeException;
import org.codehaus.xfire.aegis.AegisBindingProvider;
import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;
import org.codehaus.xfire.service.Endpoint;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.soap.AbstractSoapBinding;
import org.codehaus.xfire.transport.TransportManager;

public class CalculatorWebServiceClient {

private static XFireProxyFactory proxyFactory = new XFireProxyFactory();
private HashMap endpoints = new HashMap();
private Service service0;

public CalculatorWebServiceClient() {
create0();
Endpoint CalculatorWebServicePortTypeLocalEndpointEP = service0 .addEndpoint(new QName("http://server", "CalculatorWebServicePortTypeLocalEndpoint"), new QName("http://server", "CalculatorWebServicePortTypeLocalBinding"), "xfire.local://CalculatorWebService");
endpoints.put(new QName("http://server", "CalculatorWebServicePortTypeLocalEndpoint"), CalculatorWebServicePortTypeLocalEndpointEP);
Endpoint CalculatorWebServiceHttpPortEP = service0 .addEndpoint(new QName("http://server", "CalculatorWebServiceHttpPort"), new QName("http://server", "CalculatorWebServiceHttpBinding"), "http://localhost:8080/CalculatorWebService/services/CalculatorWebService");
endpoints.put(new QName("http://server", "CalculatorWebServiceHttpPort"), CalculatorWebServiceHttpPortEP);
}

public Object getEndpoint(Endpoint endpoint) {
try {
return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());
} catch (MalformedURLException e) {
throw new XFireRuntimeException("Invalid URL", e);
}
}

public Object getEndpoint(QName name) {
Endpoint endpoint = ((Endpoint) endpoints.get((name)));
if ((endpoint) == null) {
throw new IllegalStateException("No such endpoint!");
}
return getEndpoint((endpoint));
}

public Collection getEndpoints() {
return endpoints.values();
}

private void create0() {
TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());
HashMap props = new HashMap();
props.put("annotations.allow.interface", true);
AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new JaxbTypeRegistry()));
asf.setBindingCreationEnabled(false);
service0 = asf.create((server.CalculatorWebServicePortType.class), props);
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://server", "CalculatorWebServicePortTypeLocalBinding"), "urn:xfire:transport:local");
}
{
AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://server", "CalculatorWebServiceHttpBinding"), "http://schemas.xmlsoap.org/soap/http");
}
}

public CalculatorWebServicePortType getCalculatorWebServicePortTypeLocalEndpoint() {
return ((CalculatorWebServicePortType)(this).getEndpoint(new QName("http://server", "CalculatorWebServicePortTypeLocalEndpoint")));
}

public CalculatorWebServicePortType getCalculatorWebServicePortTypeLocalEndpoint(String url) {
CalculatorWebServicePortType var = getCalculatorWebServicePortTypeLocalEndpoint();
org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
return var;
}

public CalculatorWebServicePortType getCalculatorWebServiceHttpPort() {
return ((CalculatorWebServicePortType)(this).getEndpoint(new QName("http://server", "CalculatorWebServiceHttpPort")));
}

public CalculatorWebServicePortType getCalculatorWebServiceHttpPort(String url) {
CalculatorWebServicePortType var = getCalculatorWebServiceHttpPort();
org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
return var;
}

public static void main(String[] args) {


CalculatorWebServiceClient client = new CalculatorWebServiceClient();

//create a default service endpoint
CalculatorWebServicePortType service = client.getCalculatorWebServiceHttpPort();

//TODO: Add custom client code here
//
//service.yourServiceOperationHere();

System.out.println("test client completed");
System.exit(0);
}

}


下面这个是CalculatorWebServicePortType.java

package server;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name = "CalculatorWebServicePortType", targetNamespace = "http://server")
@SOAPBinding(use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public interface CalculatorWebServicePortType {

@WebMethod(operationName = "expCalculator", action = "")
@WebResult(name = "out", targetNamespace = "http://server")
public String expCalculator(
@WebParam(name = "exp", targetNamespace = "http://server") String exp);

}


这个是ExpCalculator.java

package server;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="exp" type="{http://www.w3.org/2001/XMLSchema}string"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"exp"
})
@XmlRootElement(name = "expCalculator")
public class ExpCalculator {

@XmlElement(required = true, nillable = true)
protected String exp;

/**
* Gets the value of the exp property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getExp() {
return exp;
}

/**
* Sets the value of the exp property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setExp(String value) {
this.exp = value;
}

}


这个是ExpCalculatorResponse.java

package server;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="out" type="{http://www.w3.org/2001/XMLSchema}string"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"out"
})
@XmlRootElement(name = "expCalculatorResponse")
public class ExpCalculatorResponse {

@XmlElement(required = true, nillable = true)
protected String out;

/**
* Gets the value of the out property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getOut() {
return out;
}

/**
* Sets the value of the out property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setOut(String value) {
this.out = value;
}

}


这个是ObjectFactory.java

package server;

import javax.xml.bind.annotation.XmlRegistry;


/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the server package.
* <p>An ObjectFactory allows you to programatically
* construct new instances of the Java representation
* for XML content. The Java representation of XML
* content can consist of schema derived interfaces
* and classes representing the binding of schema
* type definitions, element declarations and model
* groups. Factory methods for each of these are
* provided in this class.
*
*/
@XmlRegistry
public class ObjectFactory {


/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: server
*
*/
public ObjectFactory() {
}

/**
* Create an instance of {@link ExpCalculator }
*
*/
public ExpCalculator createExpCalculator() {
return new ExpCalculator();
}

/**
* Create an instance of {@link ExpCalculatorResponse }
*
*/
public ExpCalculatorResponse createExpCalculatorResponse() {
return new ExpCalculatorResponse();
}

}


这个是package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://server", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package server;



感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址,并且请尊重劳动成果,谢谢!






举报

相关推荐

0 条评论