微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EJB的WebService

 

一个EJB项目 -hxzon -ejbcode 
一,新建一个EJB项目。命名为firstEjb。
1,新建一个接口。
package hxzon;
public interface Hello {
public String saySomething(String name);
}
2,新建一个无状态会话bean。
package hxzon;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote
public class HelloBean implements Hello { public String saySomething(String name) {
   return "hello,"+name;
}
}
3,部署到JBoss。
--------------------------------------------------------------
二,新建一个java项目,作为客户端。
1,项目添加JBossClient依赖包。
2,项目添加firstEjb项目,因为要使用到Hello接口。
3,新建客户端类。
package hxzon;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class HelloClient {
public static void main(String[] args){
   try {
    InitialContext ctx=new InitialContext();
    Hello ejb=(Hello)ctx.lookup("HelloBean/remote");
    System.out.print(ejb.saySomething("hxzon"));
   } catch (NamingException e) {
    // Todo Auto-generated catch block
    e.printstacktrace();
   }
}
}
4,编写jndi属性文件。放在类根路径下。
文件可在jboss4.2.2.GA\server\default\conf文件夹下找到。
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
5,运行客户端程序。成功。
=====================================================================
=====================================================================
EJB部署为WebService -hxzon -wscode -ejbcode

一,新建EJB项目。
1,这里借用firstEjb项目,只需添加两个注解。
package hxzon; import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService; @Stateless
@Remote
@WebService
public class HelloBean implements Hello { @WebMethod
public String saySomething(String name) {
   return "hello,"+name;
} }
2,部署。在网址中输入http://localhost:8080/firstEjb/HelloBean?wsdl
可以看到wsdl文件
路径为http://localhost:8080/jar文件名/发布的实现类名?wsdl
http://127.0.0.1:8080/jbossws/services 查看webservice的发布情况 ---------------------------------------------------------------------------- 二,新建客户端项目。 1,这里我们借用axis-bin-1_4.zip里的 samples.client.DynamicInvoker类来充当WebService客户端。 记得项目导入axis依赖包。 package samples.client; import org.apache.axis.Constants; import org.apache.axis.utils.XMLUtils; import org.apache.axis.encoding.ser.SimpleDeserializer; import org.apache.axis.encoding.ser.ElementSerializerFactory; import org.apache.axis.encoding.ser.ElementDeserializerFactory; import org.apache.axis.encoding.ser.ElementDeserializer; import org.apache.axis.wsdl.gen.Parser; import org.apache.axis.wsdl.symbolTable.BaseType; import org.apache.axis.wsdl.symbolTable.BindingEntry; import org.apache.axis.wsdl.symbolTable.Parameter; import org.apache.axis.wsdl.symbolTable.Parameters; import org.apache.axis.wsdl.symbolTable.ServiceEntry; import org.apache.axis.wsdl.symbolTable.SymTabEntry; import org.apache.axis.wsdl.symbolTable.SymbolTable; import org.apache.axis.wsdl.symbolTable.TypeEntry; import org.w3c.dom.Element; import javax.wsdl.Binding; import javax.wsdl.Operation; import javax.wsdl.Port; import javax.wsdl.Service; import javax.wsdl.extensions.soap.soAPAddress; import javax.xml.namespace.QName; import javax.xml.rpc.Call; import javax.xml.rpc.encoding.Deserializer; import javax.xml.rpc.encoding.DeserializerFactory; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector;  public class DynamicInvoker {     private Parser wsdlParser = null;     public DynamicInvoker(String wsdlURL) throws Exception {         // Start by reading in the WSDL using Parser         wsdlParser = new Parser();         System.out.println("Reading WSDL document from '" + wsdlURL + "'");         wsdlParser.run(wsdlURL);     }     private static void usage() {         System.err.println(                 "Usage: java " + DynamicInvoker.class.getName() + " wsdlLocation "                 + "operationName[(portName)] "                 + "[argument1 ...]");         System.exit(1);     }     public static void main(String[] args) throws Exception {         if (args.length < 2) {             usage();         }         String wsdlLocation = (args.length > 0)                 ? args[0]                 : null;         String operationName = (args.length > 1)                 ? args[1]                 : null;         String portName = null;         try {             portName = operationName.substring(operationName.indexOf("(") + 1,                                               operationName.indexOf(")"));             operationName = operationName.substring(0,operationName.indexOf("("));         } catch (Exception ignored) {         }         DynamicInvoker invoker = new DynamicInvoker(wsdlLocation);         HashMap map = invoker.invokeMethod(operationName,portName,args);         for (Iterator it = map.entrySet().iterator(); it.hasNext();) {             Map.Entry entry = (Map.Entry) it.next();             String key = (String) entry.getKey();             Object value = entry.getValue();             if (value instanceof Element) {                 System.out.println("====== " + key + " ======");                 XMLUtils.ElementToStream((Element) value,System.out);                 System.out.println("=========================");             } else {                 System.out.println(key + "=" + value);             }         }         System.out.println("\nDone!");     }     public HashMap invokeMethod(             String operationName,String portName,String[] args)             throws Exception {         String serviceNS = null;         String serviceName = null;         String operationQName = null;         System.out.println("Preparing Axis dynamic invocation");         Service service = selectService(serviceNS,serviceName);         Operation operation = null;         org.apache.axis.client.Service dpf = new org.apache.axis.client.Service(wsdlParser,service.getQName());         Vector inputs = new Vector();         Port port = selectPort(service.getPorts(),portName);         if (portName == null) {             portName = port.getName();         }         Binding binding = port.getBinding();         Call call = dpf.createCall(QName.valueOf(portName),                                   QName.valueOf(operationName));         ((org.apache.axis.client.Call)call).setTimeout(new Integer(15*1000));         ((org.apache.axis.client.Call)call).setProperty(ElementDeserializer.DESERIALIZE_CURRENT_ELEMENT,Boolean.TRUE);                  // Output types and names         Vector outNames = new Vector();         // Input types and names         Vector inNames = new Vector();         Vector inTypes = new Vector();         SymbolTable symbolTable = wsdlParser.getSymbolTable();         BindingEntry bEntry =                 symbolTable.getBindingEntry(binding.getQName());         Parameters parameters = null;         Iterator i = bEntry.getParameters().keySet().iterator();         while (i.hasNext()) {             Operation o = (Operation) i.next();             if (o.getName().equals(operationName)) {                 operation = o;                 parameters = (Parameters) bEntry.getParameters().get(o);                 break;             }         }         if ((operation == null) || (parameters == null)) {             throw new RuntimeException(operationName + " was not found.");         }         // loop over paramters and set up in/out params         for (int j = 0; j < parameters.list.size(); ++j) {             Parameter p = (Parameter) parameters.list.get(j);             if (p.getMode() == 1) {           // IN                 inNames.add(p.getQName().getLocalPart());                 inTypes.add(p);             } else if (p.getMode() == 2) {    // OUT                 outNames.add(p.getQName().getLocalPart());             } else if (p.getMode() == 3) {    // INOUT                 inNames.add(p.getQName().getLocalPart());                 inTypes.add(p);                 outNames.add(p.getQName().getLocalPart());             }         }         // set output type         if (parameters.returnParam != null) {             if(!parameters.returnParam.getType().isBaseType()) {                 ((org.apache.axis.client.Call)call).registerTypeMapping(org.w3c.dom.Element.class,parameters.returnParam.getType().getQName(),                            new ElementSerializerFactory(),                            new ElementDeserializerFactory());             }             // Get the QName for the return Type             QName returnType = org.apache.axis.wsdl.toJava.Utils.getxsitype(                     parameters.returnParam);             QName returnQName = parameters.returnParam.getQName();             outNames.add(returnQName.getLocalPart());         }         if (inNames.size() != args.length - 2)             throw new RuntimeException("Need " + inNames.size() + " arguments!!!");         for (int pos = 0; pos < inNames.size(); ++pos) {             String arg = args[pos + 2];             Parameter p = (Parameter) inTypes.get(pos);             inputs.add(getParamData((org.apache.axis.client.Call) call,p,arg));         }         System.out.println("Executing operation " + operationName + " with parameters:");         for (int j = 0; j < inputs.size(); j++) {             System.out.println(inNames.get(j) + "=" + inputs.get(j));         }         Object ret = call.invoke(inputs.toArray());         Map outputs = call.getoutputParams();         HashMap map = new HashMap();         for (int pos = 0; pos < outNames.size(); ++pos) {             String name = (String) outNames.get(pos);             Object value = outputs.get(name);             if ((value == null) && (pos == 0)) {                 map.put(name,ret);             } else {                 map.put(name,value);             }         }         return map;     }     private Object getParamData(org.apache.axis.client.Call c,Parameter p,String arg) throws Exception {         // Get the QName representing the parameter type         QName paramType = org.apache.axis.wsdl.toJava.Utils.getxsitype(p);         TypeEntry type = p.getType();         if (type instanceof BaseType && ((BaseType) type).isBaseType()) {             DeserializerFactory factory = c.getTypeMapping().getDeserializer(paramType);             Deserializer deserializer = factory.getDeserializerAs(Constants.AXIS_SAX);             if (deserializer instanceof SimpleDeserializer) {                 return ((SimpleDeserializer)deserializer).makeValue(arg);             }         }         throw new RuntimeException("not kNow how to convert '" + arg                                    + "' into " + c);     }     public Service selectService(String serviceNS,String serviceName)             throws Exception {         QName serviceQName = (((serviceNS != null)                 && (serviceName != null))                 ? new QName(serviceNS,serviceName)                 : null);         ServiceEntry serviceEntry = (ServiceEntry) getSymTabEntry(serviceQName,                                                                  ServiceEntry.class);         return serviceEntry.getService();     }     public SymTabEntry getSymTabEntry(QName qname,Class cls) {         HashMap map = wsdlParser.getSymbolTable().getHashMap();         Iterator iterator = map.entrySet().iterator();         while (iterator.hasNext()) {             Map.Entry entry = (Map.Entry) iterator.next();             QName key = (QName) entry.getKey();             Vector v = (Vector) entry.getValue();             if ((qname == null) || qname.equals(qname)) {                 for (int i = 0; i < v.size(); ++i) {                     SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i);                     if (cls.isinstance(symTabEntry)) {                         return symTabEntry;                     }                 }             }         }         return null;     }     public Port selectPort(Map ports,String portName) throws Exception {         Iterator valueIterator = ports.keySet().iterator();         while (valueIterator.hasNext()) {             String name = (String) valueIterator.next();             if ((portName == null) || (portName.length() == 0)) {                 Port port = (Port) ports.get(name);                 List list = port.getExtensibilityElements();                 for (int i = 0; (list != null) && (i < list.size()); i++) {                     Object obj = list.get(i);                     if (obj instanceof SOAPAddress) {                         return port;                     }                 }             } else if ((name != null) && name.equals(portName)) {                 return (Port) ports.get(name);             }         }         return null;     } } 2,运行samples.client.DynamicInvoker类。 运行时需要在open run dialog配置三个参数。 在arguments标签中输入 http://localhost:8080/firstEjb/HelloBean?wsdl saySomething hxzon 运行成功。 可看到控制台输出 Reading WSDL document from 'http://localhost:8080/firstEjb/HelloBean?wsdl' Preparing Axis dynamic invocation Executing operation saySomething with parameters: saySomething>arg0=hxzon saySomethingResponse>return=hello,hxzon Done! ============================================================ ============================================================ wsdl文件,该文件自动生成。 <deFinitions name='HelloBeanService' targetNamespace='http://hxzon/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://hxzon/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'> <types>    <xs:schema targetNamespace='http://hxzon/' version='1.0'     xmlns:tns='http://hxzon/'     xmlns:xs='http://www.w3.org/2001/XMLSchema'>     <xs:element name='saySomething' type='tns:saySomething' />     <xs:element name='saySomethingResponse'      type='tns:saySomethingResponse' />     <xs:complexType name='saySomething'>      <xs:sequence>       <xs:element minOccurs='0' name='arg0'        type='xs:string' />      </xs:sequence>     </xs:complexType>     <xs:complexType name='saySomethingResponse'>      <xs:sequence>       <xs:element minOccurs='0' name='return'        type='xs:string' />      </xs:sequence>     </xs:complexType>    </xs:schema> </types> <message name='HelloBean_saySomethingResponse'>    <part element='tns:saySomethingResponse'     name='saySomethingResponse'>    </part> </message> <message name='HelloBean_saySomething'>    <part element='tns:saySomething' name='saySomething'></part> </message> <portType name='HelloBean'>    <operation name='saySomething' parameterOrder='saySomething'>     <input message='tns:HelloBean_saySomething'></input>     <output message='tns:HelloBean_saySomethingResponse'></output>    </operation> </portType> <binding name='HelloBeanBinding' type='tns:HelloBean'>    <soap:binding style='document'     transport='http://schemas.xmlsoap.org/soap/http' />    <operation name='saySomething'>     <soap:operation soapAction='' />     <input>      <soap:body use='literal' />     </input>     <output>      <soap:body use='literal' />     </output>    </operation> </binding> <service name='HelloBeanService'>    <port binding='tns:HelloBeanBinding' name='HelloBeanPort'>     <soap:address      location='http://127.0.0.1:8080/firstEjb/HelloBean' />    </port> </service> </deFinitions> =================================================== =================================================== 消息bean简单例子 -ejbcode -hxzon 一,新建Ejb项目。 实现MessageListener接口,添加@MessageDriven注解。 package hxzon; import javax.ejb.MessageDriven; import javax.ejb.ActivationConfigProperty; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven( activationConfig={     @ActivationConfigProperty(propertyName="destinationType",      propertyValue="javax.jms.Queue"),    @ActivationConfigProperty(propertyName="destination",      propertyValue="queue/myqueue") } ) public class HelloMDB implements MessageListener{ public void onMessage(Message msg) {    TextMessage tmsg=(TextMessage)msg;    try {     System.out.println("已接收消息。。。"+tmsg.getText());    } catch (JMSException e) {     e.printstacktrace();    } } } 二,新建客户端项目。 package hxzon; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.TextMessage; import javax.naming.InitialContext; public class MDBClient { public static void main(String[] args) {    try {     InitialContext ctx=new InitialContext();     QueueConnectionFactory factory=(QueueConnectionFactory)ctx.lookup("ConnectionFactory");     QueueConnection con=factory.createQueueConnection();     QueueSession session=con.createQueueSession(false,QueueSession.AUTO_ACKNowLEDGE);     Queue queue=(Queue)ctx.lookup("queue/myqueue");     TextMessage msg=session.createTextMessage("hello,hxzon");     QueueSender sender=session.createSender(queue);     sender.send(msg);     session.close();     System.out.println("已发送消息");    } catch (Exception e) {     e.printstacktrace();    } } } 运行成功。 上述是点到点模型,也可使用发布-预定模型。只需将Queue改为Topic即可。QueueSender改为Topicpublisher,调用publish(msg)方法。 ---------------------------------------------------------------------------- package hxzon; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven(    activationConfig={      @ActivationConfigProperty(propertyName="destinationType",       propertyValue="javax.jms.Topic"),     @ActivationConfigProperty(propertyName="destination",       propertyValue="topic/mytopic")    } ) public class HelloTopicMDB implements MessageListener { public void onMessage(Message msg) {    TextMessage tmsg=(TextMessage)msg;    try {     System.out.println("已接收消息。。。"+tmsg.getText());    } catch (JMSException e) {     e.printstacktrace();    } } } ---------------------------------------------------------------------- package hxzon; import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.Topicpublisher; import javax.jms.TopicSession; import javax.naming.InitialContext; public class TopicMDBClient {  public static void main(String[] args) {    try {     InitialContext ctx=new InitialContext();     TopicConnectionFactory factory=(TopicConnectionFactory)ctx.lookup("ConnectionFactory");     TopicConnection con=factory.createtopicConnection();     TopicSession session=con.createtopicSession(false,TopicSession.AUTO_ACKNowLEDGE);     Topic topic=(Topic)ctx.lookup("topic/mytopic");     TextMessage msg=session.createTextMessage("hello,hxzon");     Topicpublisher publisher=session.createPublisher(topic);     publisher.publish(msg);     session.close();     System.out.println("已发送消息");    } catch (Exception e) {     e.printstacktrace();    } } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐