前言:

一直以来都对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!";
}
}

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

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

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

    JAVA 1.6 之后,自带的JAX-WS API,这使得我们可以很方便的开发一个基于Java的WebService服务. 基于JAVA的WebService 服务 1.创建服务端WebService ...

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

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

  3. java rest版简单的webservice

    目前的webservice风格,rest应该是其中一种 还有种就是soap,rest是轻量级的,越来越流行.下面举一个简单例子说明下rest的用法. 1. 准备ws的jar和spring的jar,如何 ...

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

    打开Visual Studio(我用的是2010)→文件→新建→项目→Visual C#→Web→ASP.NET Web 服务应用程序 打开Service1.asmx文件,会看到里面已经有个Hello ...

  5. Java发布一个简单 webservice应用 并发送SOAP请求

    一.创建并发布一个简单的webservice应用 1.webservice 代码: package com.ls.demo; import javax.jws.WebMethod; import ja ...

  6. 使用Axis2创建一个简单的WebService服务

    使用过Java进行过WebService开发都会听过或者接触过Apache Axis2,Axis2框架是应用最广泛的WebService框架之一了. 这里使用Axis2来开发和部署一个最简单的WebS ...

  7. 利用Java编写简单的WebService实例

    使用Axis编写WebService比較简单,就我的理解,WebService的实现代码和编写Java代码事实上没有什么差别,主要是将哪些Java类公布为WebService. 以下是一个从编写測试样 ...

  8. 利用Java编写简单的WebService实例-转载

    使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区别,主要是将哪些Java类发布为WebService.下面是一个从编写测试例子到 ...

  9. 用 Java 技术创建 RESTful Web (服务 JAX-RS:一种更为简单、可移植性更好的替代方式)

    作者: Dustin Amrhein, 软件工程师, IBM Nick Gallardo, 软件工程师, IBM 出处: http://www.ibm.com/developerworks/cn/we ...

随机推荐

  1. java netty之ServerBootstrap的启动

    通过前面的几篇文章,对整个netty部分的架构已经运行原理都有了一定的了解,那么这篇文章来分析一个经常用到的类:ServerBootstrap,一般对于服务器端的编程它用到的都还算是比较的多..看一看 ...

  2. OleContainer控件介绍

    OLEContainer 控件的主要属性 1)  AllowInPlace              property AllowInPlace:Boolean;        这个属性用于决定启动O ...

  3. js作用域学习

    代码解析至少分两步 1):查找var,function参数例如下面这个例子 a= 未定义 fn1={alert(2)}函数的话,是整个整体 2):逐行读代码:类似=+-%*等都是表达式,表达式可以改变 ...

  4. VBA好的插件

    VBE 小插件--- Office 编程助手 :http://club.excelhome.net/thread-1055425-1-1.html VB以及VBA的编程助手MZ-tools7.0破解版 ...

  5. Eclipse下编写的web项目部署到tomcat下

    之前都是用myeclipse编写web项目,编写好然后在myclipse上配置的tomcat下的webapps文件想项目复制到其他tomcat下就能运行了. 最近学习jquery,将eclipse编写 ...

  6. Visual Studio C#的winform/webform/asp.net控件命名规范

    控件命名规范 类型 前缀 示例 AdRotator adrt adrtTopAd Button btn btnSubmit Calendar cal calMettingDates CheckBox ...

  7. 指定YUM安装包的体系结构或版本

    在单一体系结构下同时安装32位和64位包echo ‘multilib_policy=all’ >> /etc/yum.conf 指定体系结构 查看当前系统体系结构[root@oracle ...

  8. 如何用css做一个细虚线边框表格

    <style type="text/css"> <!-- .dashed_tbl { border-top: 1px dashed #333333; border ...

  9. size()

    jQuery 对象中元素的个数. 当前匹配的元素个数.与length将返回相同的值. 示例 描述: 计算文档中所有图片数量 HTML 代码: <img src="test1.jpg&q ...

  10. python 笔记

    第一周2016/9/11   Python 2.0和3.0的区别 3.0 的模块名改了和之前的2.0 不一样 #!/usr/bin/env python # -*- coding:utf-8 -*- ...