RESTEasy是JBoss的開源項目之一,是一個RESTful Web Services框架。RESTEasy的開發者Bill Burke同時也是JAX-RS的J2EE標準制定者之一。JAX-RS是一個JCP制訂的新標準,用於規範基於HTTP的RESTful Web Services的API。JAXB-XML綁定:將XML映射成成面向對象的數據類。這個過程也有J2EE標準,而RESTEasy是全面支持JAXB的。
我們已經有SOAP了,爲什麼需要Restful WebServices?用Bill自己的話來說:"如果是爲了構建SOA應用,從技術選型的角度來講,我相信REST比SOAP更具優勢。開發人員會意識到使用傳統方式有進行SOA架構有多複雜,更不用提使用這些做出來的接口了。這時他們就會發現Restful Web Services的光明之處。"
SOA和WOA所作用的抽象層面也有所不同。前者是一種系統層面的架構模式,致力於實施可被多種應用程序消化的新業務功能;而後者則是一種接口層面的架構模式,專注於各種服務功能以何種方式提供給應用程序。
web.xml
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>javax.ws.rs.core.Application</param-name>
<param-value>com.service.ChannelApplication</param-value>
</context-param>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/1.0</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/1.0/*</url-pattern>
</servlet-mapping>
</web-app>
Java類import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class ChannelApplication extends Application
{
HashSet<Object> singletons = new HashSet<Object>();
public ChannelApplication()
{
singletons.add(new GsmModemChannelService());
}
@Override
public Set<Class<?>> getClasses()
{
HashSet<Class<?>> set = new HashSet<Class<?>>();
return set;
}
@Override
public Set<Object> getSingletons()
{
return singletons;
}
}
Service
@Path(value="smsmessaging")
public class GsmModemChannelService {
@POST
@Path("outbound/requests")
@Produces("text/html")
public String sendMessage(
@FormParam("address") String address,
@FormParam("message") String message,
@FormParam("senderName") String senderName) {
return "test";
}
@GET
@Path("inbound/messages")
@Produces("application/json")
public List<Record> getMessages() {
return getRecordList();
}
@GET
@Path("inbound/messages/{sendAddress}/messages.html")
@Produces("text/html")
public String getMessageBySender(
@PathParam("sendAddress") String sendAddress) throws Exception {
List<Record> list = new ArrayList<Record>();
for (Record r : getRecordList()) {
if (r.getFromAddr().equals(sendAddress)) {
list.add(r);
}
}
JettisonMappedContext context = new JettisonMappedContext(RecordList.class);
StringWriter writer = new StringWriter();
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(new RecordList(list), writer);
return writer.toString();
}
}
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.magima.messenger.gsmmodem.job.Record;
@XmlRootElement(name="listing")
public class RecordList {
private List<Record> records;
public RecordList(){
}
@XmlElement(name="records")
public List<Record> getRecords() {
return records;
}
public RecordList(List<Record> records) {
this.records = records;
}
}