1,jar们
下载下来的jersey包“jaxrs-ri-2.0.zip",解开,别客气,全部都放到项目的WEB-INF/lib下面,我还曾经一个个试过,貌似一个都不能缺。
如果要输出json,还需要json的转换包,本人用的jackson_all_1.9.13.jar。这玩意文档里面有在哪里下载。
2,格局
Jersey通过Application来承上启下。从web.xml开始说,web.xml里面要来这么一段:
<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>net.ansoft.rd.restful1.MyApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping>
这段的意思就是说我接请求的是org.glassfish.jersey.servlet.ServletContainer,这玩意包含了net.ansoft.rd.restful1.MyApplication,他响应的请求路径是/service/*
很简单,下面就要看net.ansoft.rd.restful1.MyApplication这个是干什么的。
3,Application
public class MyApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> s = new HashSet<Class<?>>(); s.add(ContactsResource.class); s.add(WatchItemResource.class); return s; } @Override public Set<Object> getSingletons() { Set<Object> s = new HashSet<Object>(); // Register the Jackson provider for JSON // Make (de)serializer use a subset of JAXB and (afterwards) Jackson annotations // See http://wiki.fasterxml.com/JacksonJAXBAnnotations for more information ObjectMapper mapper = new ObjectMapper(); // AnnotationIntrospector primary = new JaxbAnnotationIntrospector(); // AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); // AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary); // mapper.getDeserializationConfig().setAnnotationIntrospector(pair); // mapper.getSerializationConfig().setAnnotationIntrospector(pair); // Set up the provider JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider(); jaxbProvider.setMapper(mapper); s.add(jaxbProvider); return s; } }
这个类继承了javax.ws.rs.core.Application。扩展的部分是里面包含的Resource和Provider。
注意getSingletons里面正是注册Json转换工具的地方。
4,Resources
这块是教程们讲得最多的地方,本文直说一些此版本的个人实战经验。
1,可以写在类头上的Annotation:@Path,@Produces,前者是本类响应的路径,后者是本类提供的返回格式,json的Annotation是:
@Produces({MediaType.APPLICATION_JSON})
2,实际上调用的路径=web.xml里面响应的路径+类响应的路径+方法响应的路径。如本例,web.xml中Servlet的路径/service,类的@Path("/contact"),方法的路径@Path("/{id}"),那么实际上服务的路径就是/service/contact/123之类的。
3,http get的时候,url里面可以传参数,方法里面要用@QueryParam来接,如下:
/*url内传参数写法示例*/ @GET @Path("/query") public List<Contact> queryContact(@QueryParam("q") String q, @QueryParam("a") String a) { List<Contact> reList = new ArrayList<Contact>(); for(Contact c:TestDataFactory.getInstance().genContacts()) { if(c.getName().contains(q)) { for(String address:c.getAddresses()) { if(address.contains(a)) { reList.add(c); break; } } } } return reList; }
前台的url就是.../query?q=XXX&a=YYY
4, http post的时候,jquery1.9还是把json提交成了formdata。所以后面要用MultivaluedMap<String, String>来接,中文貌似自动转换了,无痛。
前台如下:
$("#btnTestPost").click(function() { $.post("./service/watch_item/save", { label : $("#edtLabel").val(), note : $("#edtNote").val(), suffix : $("#edtValueSuffix").val() }, function(data) { console.log("rerere"); }); });
接数据的代码如下:
/*json方式提交数据的写法示例*/ @POST @Path("/save") public Integer saveWatchItem(MultivaluedMap<String, String> formParams) { WatchItem wi = new WatchItem(); try{ wi.setId(TestDataFactory.getInstance().genContacts().size()+1); wi.setLabelEn(formParams.getFirst("label")); wi.setNote(formParams.getFirst("note")); wi.setValueSuffix(formParams.getFirst("suffix")); wi.setValueType(ValueType.VT_FLOAT); TestDataFactory.getInstance().genWathItems().add(wi); } catch(Exception e) { e.printStackTrace(); } return 1; }
暂时就摸到这里。