由于项目上需要写一个简单的评价系统,像银行MM前面的那种非常满意、满意、不满意那种,结合一个安卓的APP一起使用。由于使用3G网页通讯,个人认为http这种方式更合适。曾经听在Delphi鸟窝群的白雪公猪大神讲过,我们这种情况下的APP应用在移动网络下使用长连接通讯不是很合适,一方面是稳定性,另一方面是流量。所以决定写一个WebService,给app提供服务。本文Eclipse+Tomcat+ 以下菜鸟见解。

一、技术选型:刚学的java,所以百度了一通后,发现网上有很多写WebService的,都不错。常见的有:

  1. CXF:Apache的开源项目
  2. Axis2:Apcahe的开源项目
  3. JWS
  4. xFire
  5. Jersey

以上等等,还有其他,不列举,当然JAVA本身也有开发WebService的类,但有现成的开源框架,就没必要自己造车轮了。由于最近流行RESTFUL,所以找了一下支持的框架。网上有文章说Axis2,Jersey支持,所以去找了这方面的资料。当时不知道CXF为何物,所以从Apcahe大神的东西开始,最后发现Axis2已很久没更新了,所以没用。转向jersey,从网上的文章上看代码很简洁(菜鸟易用),资料还不少,所以就选它了,没更深入的原因,技术可行性分析不是我辈做的事。

二、数据库连接,看了不少数据库连接池,我直接选了c3p0,这块不了解,略。

三、准备工作,先到相关的网站下开相应的库。

  1. Jersey:https://jersey.java.net/,本文使用版本为2.8
  2. Tomcat:http://tomcat.apache.org/,本文使用版本为7.0.53,记住不要使用8.0版本,会提示java.io.IOException: java.lang.ClassCastException: Cannot cast org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer to javax.servlet.ServletContainerInitializer。这是一个下午的调试换回来的血的教训。

四、编码

  1. 新建项目 File-New-Dymanic Web Project,弹出新建窗口,在Project Name写入项目名称,本文使用text,指定好路径。在Dynamic web module version中,选择3.0,对应Tomcat7,如果用Tomcat6,应选2.5,为什么这么选,原则我不懂,这里有个博客有写http://snkcxy.iteye.com/blog/1848279。点两次next来到Web Module窗口,勾上Generate web.xml deployment descriptor,点finish完成创建。
  2. 将下载下来的Jersey的所有jar入到项目的WebContent\WEB-INF\lib目录下。当然也可以入在公用的目录下,不过这招俺不会。暂时不细谈。
  3. 新建包,看很多人都建一个com的包,我也学着建了一个,为什么命令为com,不明白?可能是公用common的意思吧。在com中再建一个rest的包。rest包中建一个text的包。以上是习惯。不建也可以。不建的话一会改下web.xml的配置就行。
  4. 在com.rest.text包中新建一个hello类,先实现一个hello world。代码如下
    package com.rest.text;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType; @Path("/hello")
    public class hello { @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHello() {
    return "hello world.";
    } @GET
    @Path("{param}")
    @Produces("text/plain;chareset=UTF-8")
    public String getParam1(@PathParam("param") String param) {
    return "带1个参数: " + param;
    } @GET
    @Path("{param}/test/{param2}")
    @Produces("text/plain;chareset=UTF-8")
    public String getParam2(@PathParam("param") String param, @PathParam("param2") String p2) {
    return "带2个参数: " + param + " " + p2;
    }
    }
  5. 修改web.xml,可以看到使用com.rest.text做为参数,把这个包下面的所有类都做为服务使用,当然格式必须像hello类一样编写
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.rest.text</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
    </servlet-mapping>
    </web-app>
  6. 运行,在IE中打开http://127.0.0.1:8080/text/hello,如查能看到hello world,说明你成功了。你可以试下其他的两个带参数的接口。
  7. 布署到Tomcat中,使用Tomcat前记得要配置JAVA的环境变量,如JAVA_HOME或JRE_HOME,每一次设置环意变量是要重启电脑的。回到Eclipse界面,通过File-Export,将项目导出生成text.war文件。将文件直接丢进Tomcat目录下的webapps文件夹中,Tomcat启动时会自动解压并加载程序的。Tomcat直接下载下来的zip包,解压出来就能用,不需要配置任何东西。记住是Tomcat7,用Tomcat8会报错,解决办法不明,菜鸟看不懂英语。

以上,通过jersey框架,很快就能建立一个基于Restful的WebService,代码量少,用法简单。有时候我们希望在WebService启动时做些初始化的工作,但从以上代码中,没发现有初始化的地方可以写代码,也没有main。通过百度与XXOO后,尝试写一个servlet类,学Jersey配置在web.xml中,发现可行。过两天有空,学习后,再写个文章补上。

2014-05-13

by lin

从零开始学JAVA(06)-WebService_Jersey_Restful的更多相关文章

  1. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  2. 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)

    你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...

  3. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  4. 从零开始学 Java - 我放弃了 .NET ?

    这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...

  5. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

  6. 从零开始学 Java - 利用 Nginx 负载均衡实现 Web 服务器更新不影响访问

    还记得那些美妙的夜晚吗 你洗洗打算看一个小电影就睡了,这个时候突然想起来今天晚上是服务器更新的日子,你要在凌晨时分去把最新的代码更新到服务器,以保证明天大家一觉醒来打开网站,发现昨天的 Bug 都不见 ...

  7. 从零开始学 Java - log4j 项目中的详细配置

    你还会用笔来写字么 我是不怎么会了,有时候老是拿起笔之后不知道这个字怎么写,这时候就会拿起手机去打出来:有时候还会写出来这个字之后越看越不像,这时候就开始怀疑自己的能力了:有时候写出来了一大堆字之后, ...

  8. 从零开始学 Java - Spring 支持 CORS 请求踩的坑

    谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...

  9. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求

    论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...

随机推荐

  1. 第二百二十二天 how can I 坚持

    纪念碑谷好费脑子啊,头都大了,被遗忘的海最后百度了下攻略才过了. 今天下班遇到了易军,哎,总感觉怪怪的,心情顿时压抑了些,源二生日,一起去吃了个饭,烤鸭,吃的挺不错. 创新去哪了,其实每个人的内心深处 ...

  2. 显示MYSQL数据库信息

    显示所有的数据库:show databases 显示一个数据库所有表用:show tables from DatabaseName SELECT table_name FROM information ...

  3. python 遍历删除日志

    #! /usr/bin/python2.6#-*- encoding:UTF-8 -*- import osimport os.pathimport time root_dir = os.getcwd ...

  4. VS2008注册码

    PYHYP-WXB3B-B2CCM-V9DX9-VDY8T 如果下载的是90天的试用版,下载下来以后把ISO里面的Setup\setup.sdb文件用记事本打开,把其中的[Product Key]下面 ...

  5. How Tomcat Works(十四)

    我们已经知道,在tomcat中有四种类型的servlet容器,分别为Engine.Host.Context 和Wrapper,本文接下来对tomcat中Wrapper接口的标准实现进行说明. 对于每个 ...

  6. SQLServer2005 提示 '其他会话正在使用事务的上下文'

    MSDN上看了一下说是sql server 2005不支持在分布式事务处理中存在指向本地的链接服务器(环回链接服务器) 这个是官方的回答 个人认为,应该是在事务中,使用了链接服务器访问进行跨库访问引起 ...

  7. 关于TabControl的Trigger【项目】

    我有一个TabControl <TabControl x:Name="ToolSystemSection" Grid.Row="4" ContentTem ...

  8. 一个可创建读取日志的管理类(可固定创建2M大小的日志文件)

    这里,将日志管理基类命名为LogManagerBase(抽象类),具体的不同类型的日志可以通过继承完成.该基类可将日志以每个2M的方式存储起来,并可以读取当前正在使用的日志的所有内容. 要实现该基类, ...

  9. <创建和销毁对象>经验法则——考虑用静态工厂方法代替公有构造方法

    一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多 ...

  10. Semaphore 和 Mutex

    mutex和semaphore有什么区别呢? mutex是用作互斥的,而semaphore是用作同步的. 也就是说,mutex的初始化一定是为1,而semaphore可以是任意的数, 所以如果使用mu ...