Java完成最简单的WebService创建及使用(REST方式,Jersey框架)

前言:

一直以来都对WebService感兴趣,但因为难以理解WebService到底是什么,所以了解甚少。周二的时候有个跟我关系比较好的同事想要自己写个WebService的小Demo,希望能够做成在浏览器中输入类似:

http://localhost:8080/XXX/方法?属性=值

这样格式的连接,点击进入就可以在页面上得到想要的数据的效果。

我之前做的C#实现WebService是URL中带了.asmx的,同事用Java实现的传统WebService是后面带了wsdl的,都不是想要的格式。

对于这个问题我也很好奇,就在网上找了很多资料,终于在两天后写了个能够通过想要的那种URL格式访问的WebService。

正文:

1、Jersey是用来实现WebService的一种框架。进入Jersey官网(https://jersey.java.net/)下载需要用到的jar包

2、在MyEclipse中创建一个Web Project(我的项目名为JavaRestDemo)

3、将下载的jar包(我用的是jersey-bundle-1.19.jar)放入/JavaRestDemo/WebRoot/WEB-INF/lib/

4、创建包net.meng.main,并在其中创建类HelloWorld.java,代码如下:

package net.meng.main;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("/helloworld")
public class HelloWorld {
    @Context
    HttpServletResponse response;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getResult(@QueryParam("name") String name){
        return result(name);
    }

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    public String postResult(@QueryParam("name") String name){
        return result(name);
    }

    private String result(String name){
        response.setCharacterEncoding("UTF-8"); // 解决变量name含有中文时出现的乱码问题
        return "My name is " + name + ", Hello World!";
    }
}

5、修改WebRoot/WEB-INF/web.xml文件的内容为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <servlet>
        <servlet-name>helloworldservlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>net.meng.main</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>helloworldservlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
</web-app>

6、部署到Tomcat并启动
7、在浏览器地址栏中输入http://localhost:8080/JavaRestDemo/rest/helloworld?name=聆道,就能看到页面显示如下:

(用的是猎豹浏览器,谷歌浏览器效果也一样)

至此,一个HelloWorld版Rest形式的WebService宣告完成。

后记:

其实这篇文章周四就可以发表的了,但后来我为了保险起见用火狐和IE测了一下,直接输入网址加后面的中文(关键字手打),回车后会显示乱码,就像这样:

(火狐,手动输入网址回车后)

(IE,手动输入网址回车后)

我把谷歌和火狐的地址栏链接复制出来作了对比,同样是“聆梦”两个字,结果却不同:

谷歌浏览器显示的地址栏链接:

http://localhost:8080/JavaRestDemo/rest/helloworld?name=%E8%81%86%E6%A2%A6

火狐浏览器显示的地址栏链接:

http://localhost:8080/JavaRestDemo/rest/helloworld?name=%F1%F6%C3%CE

然后通过站长工具的 把网址以UrlEncode编码/UrlDecode解码 进行解码,发现谷歌是用UTF-8编码的,火狐是用gb2312编码的,但因为是地址栏直接输入中文,传入服务器后服务器只能按固定的字符编码进行解码,这才导致结果差异。

为了让三个浏览器显示效果一致,我通过改变

response.setCharacterEncoding("gb2312");

name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312");

取值的不同做了几组实验,起初是想试试看什么情况下能够让结果都是正常的,后来在UTF-8和gb2312间切换了好多次,都是猎豹和谷歌“站队”,IE和火狐“站队”,偶尔调皮的IE还会“搞特殊”。实验过程记录如下图:

其中“转”代表从别的页面跳转到结果页面的情况,“输”代表直接在地址栏输入中文关键字的情况。依次是猎豹、IE、火狐、谷歌。

看样子是都设为UTF-8的时候能保证比较多的情况是正常的,所以最终HelloWorld.java的代码如下:

package net.meng.main;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("/helloworld")
public class HelloWorld {
    @Context
    HttpServletRequest request;
    @Context
    HttpServletResponse response;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getResult(@QueryParam("name") String name){
        return result(name);
    }

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    public String postResult(@QueryParam("name") String name){
        return result(name);
    }

    private String result(String name){
        try {
            name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setCharacterEncoding("UTF-8");
        return "My name is " + name + ", Hello World!";
    }
}

后来我用百度的搜索地址在手动输入中文关键字的情况下在各个浏览器中做实验,发现都不会存在这样的问题,如果正在浏览这篇文章的您知道其中的解决方法,还望不吝赐教。

时间: 2024-10-08 12:01:13

Java完成最简单的WebService创建及使用(REST方式,Jersey框架)的相关文章

JAX-WS 学习一:基于java的最简单的WebService服务

JAVA 1.6 之后,自带的JAX-WS API,这使得我们可以很方便的开发一个基于Java的WebService服务. 基于JAVA的WebService 服务 1.创建服务端WebService服务接口 package com.st.services; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; import javax.jw

java中最简单的计算执行时长的方式

日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.util.*;包 exceFun(); long endL= new Date().getTime(); //执行时间 System.out.println("startL:"+senStrat +" endL:"+senEndL +" 执行时长:"

C#完成最简单的WebService创建及使用

打开Visual Studio(我用的是2010)→文件→新建→项目→Visual C#→Web→ASP.NET Web 服务应用程序 打开Service1.asmx文件,会看到里面已经有个HelloWorld方法了,什么都不用改 项目名上右键→重新生成(重新生成:重新编译每个文件.生成:在上次编译的基础上编译那些修改过了的文件.) 进入该项目所在文件夹,复制bin文件夹和Service1.asmx文件到准备部署到IIS的文件夹,假设文件夹名为TestWebService,部署到本地IIS 打开

利用Java编写简单的WebService实例

使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区别,主要是将哪些Java类发布为WebService.下面是一个从编写测试例子到发布WebService,以及编写测试代码的过程介绍. 本例子的WebService提供了两个方法,分别是sayHello和sayHelloToPerson,第一个只是返回一个"Hello"字符串,没有参数,第二个函数接受一个字符串作为参数,返回"Hello 参数值",

Java利用webservice创建接口案例源码

环境要求: JDK1.7,并配置Java的环境变量 BaseDao  接口: /** * 要使得成为一个可供访问的接口,必须添加:@WebService * */ @WebServicepublic interface BaseDao {    //添加一个加法的接口        @WebResult(name="addddddre")    public int add(@WebParam(name="add01")int a,@WebParam(name=&q

在java web项目中集成webservice

公司要求在项目中加入webservice服务,因为项目中使用了spring框架,所以在这里使用与spring兼容性较好的cxf来实现 cxf所需jar包 spring的jar包就不贴了 一:创建webservice服务器 1)创建一个服务接口 package com.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public S

ZooKeeper JAVA API 之环境准备和创建会话

Zookeeper是一个开放源代码的分布式协调服务,由雅虎创建,是Google Chubby的开源实现.Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的元语集,并以一系列简单易用的接口提供给用户使用. 单机模式部署与运行(Windows) 确保已经安装了JAVA 1.6及其以上版本的JDK 下载Zookeeper    http://zookeeper.apache.org/releases.html  目前稳定版本即stable版本为3.4.6.

Java发邮件简单实现

给出一个Java发送邮件的简单实现. 下载 Java代码   1.  接口 public interface MailSendServDu { public void sendEmail(String addressee, String subject, String content); } 2.  实现 import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.Mime

Java的多线程 简单入门

Java的多线程 简单入门 首先可以先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序只是一组指令的有序集合,它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位: 三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程: 进程与线程区别与联系 (