Web服务客户端可以通过bean的Web服务端点实现类来访问无状态会话Bean。在默认情况下,bean类中的所有公共方法对于Web服务客户端都是可访问的。@WebMethod注释可以自定义Web服务方法,一旦在公共方法上使用该注释,那么其他没使用@WebMethod注释的方法将不会对Web服务客户端展现。
首先新建一个EJB模块,然后在EJB模块上新建一个WebService,代码如下:
@WebService()
@Stateless()
public
class
Dog
{
@WebMethod(operationName = "ganr")
public String ganr() {
return "Wo-Wo-Wo";
}
}
Dog类同时使用了@WebService和@Stateless注释,web服务端点只能是无状态会话bean,web服务本身就是无状态的。我们还用@WebMethod注释向Web服务客户端公开了一个ganr方法,完成后打包部署。
接着我们创建一个Web模块,然后在Web项目上右键,选新建--Web服务客户端,指定项目或者WSDL url。接着新建一个Servlet,然后右键调用Web服务操作,我们找到Dog服务的garn方法点确定,代码自动生成:
@WebServiceRef(wsdlLocation
=
"
http://localhost:8080/DogService/Dog?wsdl
"
)
private
DogService service;
@WebServiceRef注释声明了一个到Web服务的引用
try
{ // Call Web Service Operation
ejb.Dog port = service.getDogPort();
// TODO process result here
java.lang.String result = port.ganr();
out.println("Result = " + result);
}
catch
(Exception ex)
{
// TODO handle custom exceptions here
}
service.getDogPort()方法获取到服务的一个代理,也称为端口。接着看jsp:
<%
try
{
ejb.DogService service = new ejb.DogService();
ejb.Dog port = service.getDogPort();
// TODO process result here
java.lang.String result = port.ganr();
out.println("Result = "+result);
}
catch
(Exception ex)
{
// TODO handle custom exceptions here
}
%>
发现只有一点点不同,完成后部署web应用并运行测试。
我们还可以通过一个现有的会话Bean创建Web服务,还是拿HelloWorld举例,首先创建一个远程接口:
@Remote
public
interface
HelloRemote
{
String sayHi(String name);
}
再创建一个无状态会话bean,先已经说过了,只能是无状态会话bean:
@Stateless
public
class
HelloBean
implements
HelloRemote
{
public String sayHi(String name) {
return "Hi " + name;
}
}
然后新建一个Web服务Hello,只不过在弹出窗口中要选中“通过现有会话bean创建Web服务”单选框,并浏览指定HelloBean,代码自动完成:
@WebService()
@Stateless()
public
class
Hello
{
@EJB
private HelloRemote ejbRef;
// Add business logic below. (Right-click in editor and choose
// "Web Service > Add Operation"
@WebMethod(operationName = "sayHi")
public String sayHi(@WebParam(name = "name")String name) {
return ejbRef.sayHi(name);
}
}
我们看到Hello服务里引用了一个HelloRemote接口,并发现远程接口公开的方法也被Hello服务公开,完成后打包部署EJB模块。接着在Web服务客户端测试,这和之前的步骤一样,不再赘述,直接看代码吧:
@WebServiceRef(wsdlLocation
=
"
http://localhost:8080/HelloService/Hello?wsdl
"
)
private
HelloService service;
protected
void
processRequest(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
try { // Call Web Service Operation
ejb.Hello port = service.getHelloPort();
// TODO initialize WS operation arguments here
java.lang.String name = "Tom";
// TODO process result here
java.lang.String result = port.sayHi(name);
out.println("Result = " + result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}
<%
try
{
ejb.HelloService service = new ejb.HelloService();
ejb.Hello port = service.getHelloPort();
// TODO initialize WS operation arguments here
java.lang.String name = "Tom";
// TODO process result here
java.lang.String result = port.sayHi(name);
out.println("Result = "+result);
}
catch
(Exception ex)
{
// TODO handle custom exceptions here
}
%>
发现一个问题,一个应用上不能新建两个Web服务客户端(Dog和Hello),只有一个能有效使用(只找到一份工件),这是为什么