现在的位置: 首页 > 综合 > 正文

Jersey实战

2013年10月03日 ⁄ 综合 ⁄ 共 3405字 ⁄ 字号 评论关闭

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;
	}

暂时就摸到这里。

抱歉!评论已关闭.