一、根据我的上一篇博客
MyEclipse构建Web Service(Xfire框架)
下面是我实现的网页版的计算器,本来想着用php去调用webservice的接口,由于时间原因,现在用java去调用webservice接口。
再根据原先实现过的吧B/S 架构的计算器作业,现将网页说明博客如下:
二、编写自己的类
根据上一篇博客的说明我们建立一个用于实现计算器的webservice类ExpWebService.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
|
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.
*
*/
@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
1
2
|
@javax
.xml.bind.annotation.XmlSchema(namespace =
"http://server"
, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package
server;
|
感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址,并且请尊重劳动成果,谢谢!