计算器之webservice实现
以下是本人原创,如若转载和使用请注明转载地址。本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址
一、根据我的上一篇博客
MyEclipse构建Web Service(Xfire框架)
下面是我实现的网页版的计算器,本来想着用php去调用webservice的接口,由于时间原因,现在用java去调用webservice接口。
再根据原先实现过的吧B/S 架构的计算器作业,现将网页说明博客如下:
二、编写自己的类
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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来求出计算结果。
下面是包的结构:

之后我们看到我们的action中类CalculatorAction.java中的代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
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); } } |
四、自动生成的文件分析
如图自动生成的文件:

下面是CalculatorWebServiceClient.java的文件内容:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package server;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;@SOAPBinding(use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)public interface CalculatorWebServicePortType { @WebMethod(operationName = "expCalculator", action = "") public String expCalculator(} |
这个是ExpCalculator.java
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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. * */@XmlRegistrypublic 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
|
1
2
|
@javax.xml.bind.annotation.XmlSchema(namespace = "http://server", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)package server; |
感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址,并且请尊重劳动成果,谢谢!
计算器之webservice实现的更多相关文章
- [LeetCode] Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- [LeetCode] 227. Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- Antlr4 入门
一.ANTRL 是什么 ANTLR 是用JAVA写的语言识别工具,它用来声明语言的语法,简称为“元语言”(meta-language). ANTLR 语法识别一般分为二个阶段: 1.词法分析阶段 (l ...
- C语言及程序设计[套餐]课程主页
课程链接:http://edu.csdn.net/combo/detail/30,提供全部的视频和课件下载. 三部分的课程主页.提供了为每一课时配套的自測.演示样例下载,以及程序阅读.程序填空.实践项 ...
- 整理一些《纸书科学计算器》的小Tips
本文最开始是在2016年的文章 Win10应用<纸书科学计算器>更新啦! 发表之后撰写的,当时那篇文章收到了不少人点赞,应用在国内市场的日下载量也突然上涨,让我感到受宠若惊,这里要感谢Wp ...
- RabbitMQ系列(六)--面试官问为什么要使用MQ,应该怎么回答
如果简历中有写到使用过RabbitMQ或者其他的消息中间件,可能在MQ方面的第一个问题就是问:为什么要使用MQ 面试官期望的回答 1.项目中有什么业务场景需要用到MQ 2.但是用了MQ,会带来很多问题 ...
- C# 代码中 计算某个函数 或WebService 请求花费时间
/// 计算请求所花费的时间 System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start( ...
- WebService技术(一)
前言:学习笔记,以供参考 1.认识 WebService就是一种跨编程语言和跨操作系统平台的远程调用技术. Webservice就是一个独立运行的应用程序,提供了可以进行远程调用的API接口. Web ...
- 彻底理解webservice SOAP WSDL
WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...
随机推荐
- TextureView+SurfaceTexture+OpenGL ES来播放视频(一)
引自:http://www.ithao123.cn/content-8733143.html 最近发现视频直播类应用层出不穷,比如233手游直播,蓝鲸直播,微录客等等什么的,连android界大神老罗 ...
- iOS生成一个32位的UUID
- (NSString *)uuidString { CFUUIDRef uuid_ref = CFUUIDCreate(NULL); CFStringRef uuid_string_ref= CFU ...
- php 生成 验证码的例子
/** +---------------------------------------------------------- * 生成随机字符串 CuPlayer.com 酷播 +-------- ...
- 使用devcon禁用启用网卡
系统平台:win2003 情况描述: 机器上装有两块网卡,8136和8139,网卡A使用静态IP,连接内部办公网,网卡B使用DHCP,连接互联网.切换两个网络时,需要先禁用一个网卡,启用另一个网卡.来 ...
- 转载 Deep learning:四(logistic regression练习)
前言: 本节来练习下logistic regression相关内容,参考的资料为网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage ...
- cocos2d-x 3.10 显示Box2d 调试视图
1.将cocos2d-x-3.10\tests\cpp-tests\Classes\Box2DTestBed目录下的GLES-Render.h和GLES-Render.cpp拷贝到当前项目的Class ...
- 学习笔记——组合模式Composite
组合模式,典型的层次结构. 与装饰器类图相似. 区别在于:装饰器模式是为了在接口中增加方法,而组合模式在于层次元素的叠加. ConcreteComponent就是中间结点,可以包含更多的Concret ...
- Issue 5158: Modal dialog present (UnexpectedAlertOpen) issue in IE (Similar issue like 3360)
https://code.google.com/p/selenium/issues/detail?id=5158 Reported by mailtopa...@gmail.com, Feb 13 ...
- 通过onActivityResult()先跳转到联系人界面,然后把传回来的手机号显示到应用的EditText上
<pre name="code" class="plain"><pre name="code" class="p ...
- Ubuntu系统搭建PPTP,VPN
1.先安装pptp apt-get install pptpd 2.打开pptp的DNS vim /etc/ppp/option.pptpd 去掉下面两行内容前的# ms-dns 8.8.8.8 ms ...