`
wayne446
  • 浏览: 27908 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

EJB3(5)

    博客分类:
  • j2ee
阅读更多

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),只有一个能有效使用(只找到一份工件),这是为什么

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics