原有webservice方法调用上怎么新增方法?

当前访客身份:游客 [
对不起,该签名过于个性,导致系统无法显示,请刷新
:啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
:写的不错,我中标几项!
:谢谢!很有用!
:rest-servlet.xml报错?
:我也觉得真正喜欢编程的不会出现这种情况
:[鼓掌][阴险]
今日访问:0
昨日访问:25
本周访问:0
本月访问:1070
所有访问:53428
在现有SSH项目中提供REST方式的WebService
发表于1年前( 23:16)&&
阅读(1852)&|&评论()
0人收藏此文章,
SSH项目目前已成为作坊开发的主流框架,在现有系统中怎样向外提供REST方式的服务呢?首先既然是SSH集成的项目,里面既然已经有了Spring,我们不妨就采用Spring构建Rest方式的WebService……
&&&&&&& 在B/S系统泛滥的今天,信息共享、系统集成,相信大家对这些名称肯定不会陌生,在企业大量分散的信息系统中怎样提供数据共享、将个系统集成到一起、从而提高工作效率,作为信息系统建设者们无疑都会想到提供web service,但作为初次体验者,对于很多概念肯定共有很多困惑,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑,如google map api采用了AJAX方式,通过javascript提供API,而淘宝TOP则采用直接的HTTP+XML请求方式,最令人疑惑的是教材上讲的WSDL、UDDI从没有在这些API中出现过,如果你仔细查找资料了的话,在一些天气API中也还是有用到的。其实WebService原来有两种方式,一是SOAP协议方式,在这种方式下需要WSDL,UDDI等,第二种方式是REST方式,这种方式根本不需要WSDL,UDDI等。 &&&&&&&
&&&&&&& 在SOA的基础技术实现方式中WebService占据了很重要的地位,通常我们提到WebService第一想法就是SOAP消息在各种传输协议上交互。近几年REST的思想伴随着SOA逐渐被大家接受,同时各大网站不断开放API提供给开发者,也激起了REST风格WebService的热潮,并且REST方式现在看来是更加流行。 &&&&&&&
&&&&&&& 还有一点就是APP风靡众生的今天,那么API的开放就更是迫在眉睫,所波逐流,我们采用REST方式提供一次服务试试
&&&&&&& SSH项目目前已成为作坊开发的主流框架,在现有系统中怎样向外提供REST方式的服务呢? &&&&&&&
&&&&&&& 首先既然是SSH集成的项目,里面既然已经有了Spring,我们不妨就采用Spring构建Rest服务
&&&&&&&&Step1: &&&&&&& 在原来的web.xml中关于struts的filter后添加一个servlet,使其支持spring的mvc,代码如下:
&&&&&&&&&servlet-name&rest&/servlet-name&
&&&&&&&&&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&&&
&&&&&&&&&init-param&
&&&&&&&&&&&&&&&&&param-name&contextConfigLocation&/param-name&
&&&&&&&&&&&&&&&&&param-value&classpath:spring/rest-servlet.xml&/param-value&
&&&&&&&&&/init-param&
&&&&&&&&&load-on-startup&0&/load-on-startup&
&/servlet&
&servlet-mapping&&&
&&&&&&&&&servlet-name&rest&/servlet-name&&&
&&&&&&&&&url-pattern&/restful/*&/url-pattern&&&
&/servlet-mapping&
&&&&&&&& Step2: &&&&&&& 此时你可能发现一个问题,你原来的web.xml中配置的关于struts2的filter处理的是
&filter-name&struts2&/filter-name&
&url-pattern&/*&/url-pattern&
&&&&&&&& 这样一来,你原来的struts岂不是要过滤你现在的rest服务,那么可以采取重写原来struts的filterStrutsPrepareAndExecuteFilter,使其不拦截“/restful/*”的请求,代码如下
public&class&MyStrutsFilter&extends&StrutsPrepareAndExecuteFilter&{
&&&&&&&&private&static&final&mons.logging.Log&log&=&mons.logging.LogFactory.getLog(MyStrutsFilter.class);
&&&&&&&&@Override
&&&&&&&&public&void&doFilter(ServletRequest&request,&ServletResponse&response,&FilterChain&chain)&throws&IOException,&ServletException&{
&&&&&&&&&&&&&&&&HttpServletRequest&req&=&(HttpServletRequest)&
&&&&&&&&&&&&&&&&String&path&=&req.getRequestURI();
&&&&&&&&&&&&&&&&if(path.contains("/restful/"))&{
&&&&&&&&&&&&&&&&&&&&&&&&log.debug("跳过struts");
&&&&&&&&&&&&&&&&&&&&&&&&chain.doFilter(request,&response);
&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&log.debug("进入struts");
&&&&&&&&&&&&&&&&&&&&&&&&super.doFilter(request,&response,&chain);
&&&&&&&&&&&&&&&&}
& &&&&&&& 同时更改web.xml中的原来struts的filter为
&filter-name&struts2&/filter-name&
&filter-class&
&&&&com.cdthgk.project.base.action.MyStrutsFilter
&&&&&!--org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter--&
&/filter-class&
&&&&&&&&&Step3: &&&&&&& 在Step1还有一个关于spring的rest-servlet.xml文件,其代码如下
&description&Spring&MVC&for&Restful&/description&
&!--检测注解--&
&context:component-scan&base-package="com.cdthgk.management.rest"&/&
&bean&class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"&/&&&
&bean&class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&/&&&
&!--&注册视图解析器,说白了就是根据返回值指定到某个页面&--&&&&&&&
&bean&id="viewResolver"&class="org.springframework.web.servlet.view.InternalResourceViewResolver"&&&
&&&&&property&name="viewClass"&value="org.springframework.web.servlet.view.JstlView"&/&&&
&&&&&property&name="prefix"&value="/"&&/property&&!--页面文件的路径,在根目录下--&
&&&&&&&& Step4: &&&&&&& 接下来我们就可以码我们的java代码了,使其提供rest方式的服务,其他不解释,实例代码如下&&&&
package&com.cdthgk.management.
import&java.io.OutputStreamW
import&java.io.PrintW
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletR
import&org.springframework.stereotype.C
import&org.springframework.web.bind.annotation.PathV
import&org.springframework.web.bind.annotation.RequestM
import&org.springframework.web.bind.annotation.RequestM
@Controller
@RequestMapping("/testREST")
public&class&RestFulWSAction&{
&//&TODO&①
&@RequestMapping(value="/getEmployer/{id}/{name}",&method=RequestMethod.GET)
&public&void&get(HttpServletRequest&request,&HttpServletResponse&response,&@PathVariable&String&id,&@PathVariable&String&name)&{
&&StringBuilder&msg&=&new&StringBuilder();
&&//&TODO&②
&&msg.append("{\"msg\":\"").append(name).append("——这是你刚才传入的第二个参数\"}");
&&printData(response,&msg);
&private&void&printData(HttpServletResponse&response,&StringBuilder&msg)&{
&&&&&&&&try&{
&&&&&&&&&response.setContentType("text/charset=utf-8");
&&&&&&&&&&&&response.setCharacterEncoding("UTF-8");
&&&&&&&&&&&&PrintWriter&out&=&new&PrintWriter(new&OutputStreamWriter(response.getOutputStream(),&"UTF-8"));
&&&&&&&&&&&&out.println(msg);
&&&&&&&&&&&&out.close();
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&& Step5: &&&&&&& 我们的业务不可能就是这样简单的处理,肯定还有复杂的逻辑处理、数据操作,那么你仍然可以使用原来的service &&&&&&& 在上一步的代码中只需注入原来的service即可,其完整实例如下: &&&&&&&&在上面的代码中TODO ①处加入,这就是你将注入的service
@Autowired
private&EmployerService&employerS
&&&&&&&在TODO ②处加入你的接口调用&&&&&&&&
employerService.getEmployer(id);
&&&&&&&&&&Step6:
&&&&&&&& &此时,你可启动你原来的SSH项目,打开浏览器,在地址栏中输入,其效果图:
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读在myEclipse上快速开发基于Axis框架的webservice服务
- Sweet之家 - ITeye技术网站
博客分类:
一: 准备工作
MyEclipse Tomcat6的安装与配置(略过)
2:安装Axis2
去http://axis.apache.org/axis2/java/core/download.cgi下载Axis2的应用包,源码包,文档,War包
推荐使用Axis2 1.4.1(本文中的内容都以Axis2 1.4.1版本作为演示)
配置环境变量
例如我的机子上Axis的应用包位于:E:\axis2-1.4.1,那么我需要新增一个环境变量AXIS2_HOME,值为E:\axis2-1.4.1,并且在Path的最后面添加上:E:\axis2-1.4.1\bin
配置完成后试着进入命令行里输入axis2,java2wsdl(由于dos环境不区分大小写,这里大小写随意),如果没有报错并且能展示相应的Help信息,则标志你配置成功了。
3:安装Axis2的Eclipse插件
(插件在我的附件里有提供)下载Axis2的Eclipse插件,可以在我本文的附件里直接下,或者去官方网站下载
我选择的是1.4.1的插件,注意官方给的插件包里的版本号还是写着1.3.0,所以需要你解压完成后手动修改文件目录名为1.4.1以及目录中plugin.xml为1.4.1
安装Eclipse插件因Eclipse版本的不同而有很多种方法,我机器上的MyEclipse的版本是5.5,我的安装方法是:
解压插件包,将其置于MyEclipse的E:\myeclipse\dropins下面(注意之前的版本号一定要改,不然后续做插件集成的时候会出错)。
解压完成后,需要做以下的修改操作.
第一步:从Axis2包的lib目录下拷贝2个文件到你插件Axis2_Codegen_Wizard_1.4.1位置的lib下。例如在我的机器上就需要执行:
cp E:\axis2-1.4.1\lib\backport-util-concurrent-3.1.jar E:\myeclipse\dropins\Axis2_Codegen_Wizard_1.4.1\lib\backport-util-concurrent-3.1.jar
cp E:\axis2-1.4.1\lib\geronimo-stax-api_1.0_spec-1.0.1 E:\myeclipse\dropins\Axis2_Codegen_Wizard_1.4.1\lib\geronimo-stax-api_1.0_spec-1.0.1
第二步:进入Axis2_Codegen_Wizard_1.4.1,打开plugin.xml,找到runtime文档元素节点末尾前面,加上:
&library name="lib/backport-util-concurrent-3.1.jar"&
&export name="*"/&
&/library&
&library name="lib/geronimo-stax-api_1.0_spec-1.0.1"&
&export name="*"/&
&/library&
OK,Eclipse插件集成完成。打开你的MyEclipse,点击New-&other查看是否出现了如下所示的界面:
二:你可以开始快速开发Axis2的Webservice了
1: 新建一个Java web工程,起名为SayHello,在classpath里导入Axis2的所有JAR包
2:在src目录下,新建一个SayHello.wsdl文件,并将其修改成如下样式:
3:开始利用它生成客户端代码
右键点击src,点击new-&other-&Axis2 Wizards-&Axis2 Code Generator,点击下一步(next):
选中Generate Java source from a WSDL file然后继续点击下一步
在如下所示的界面中,输入你的wsdl所在位置:
继续点击下一步,按照如下界面进行配置:
点击下一步,按照如下所示界面进行配置:
然后点击finish即可
4:最后利用它生成服务器端代码
还是跟刚才一样,选中codeGenerator,一直下一步到如下界面修改下:
然后下一步直到完成。
当你完成的时候,是不是发现有很多红叉叉?不要紧,那是因为你生成的包名有错误,也算是Axis2插件的问题吧。
如图所示,你生成的文件应该是跟这里面的红叉叉文件一样。不要紧,只需要修改包名即可,去掉最开头的src,就像resources上面的那个包一样。
三:发布Webservice服务
拷贝你刚才下的Axis2.war包到tomcat的webapps下面,并启动tomcat,启动后输入,可以看到axis2的欢迎界面。可以进入Administration里,查看当前可用的服务(默认用户名/密码是admin/axis2)
点击new-&other-Axis2 Wizards ,不过这里选择的是Service Archiver,点击下一步。
在出现的界面中,安装如下图片配置:
点击下一步:
配置OK后,继续下一步&下一步:
继续下一步,然后配置文件输出目录,我选择的是所在工程下新建一个dist目录,让文件输出到该目录下:
最后点击finish,即可。将工程目录dist文件夹下生成的SayHello.aar拷贝到tomcat的axis2的对应目录下。例如在我的机器上需要拷贝到:E:\apache-tomcat-6.0.28\webapps\axis2\WEB-INF\services目录下面
启动Tomcat,进入Axis2的控制台,查看SayHello的服务是否可用。你会发现它提示你服务错误。这时你需要修改resources目录下面services.xml文件。将它修改成:
&parameter name="useOriginalwsdl"&true&/parameter&
&parameter name="useOriginalwsdl"&false&/parameter&
重新走一次发布流程。这回应该不会有错误了。
四:测试Webservice
修改org.example.www.sayhello目录下SayHelloSkeleton类。将SayHello方法修改成这样:
public org.example.www.sayhello.SayHelloResponse SayHello(
org.example.www.sayhello.SayHello sayHello) {
SayHelloResponse response
= new SayHelloResponse();
response.setOut("Hi," + sayHello.getIn() + ".How are you");
} catch (Exception e) {
throw new RuntimeException(e);
然后在org.example.www.sayhello下新建一个SayHelloTest,然后输入以下内容:
package org.example.www.
public class SayHelloTest extends junit.framework.TestCase {
public void testSayHello() throws java.lang.Exception {
org.example.www.sayhello.SayHelloStub stub =
new org.example.www.sayhello.SayHelloStub(
"http://localhost:8080/axis2/services/SayHello");
org.example.www.sayhello.SayHelloStub.SayHello sayHello2 =
(org.example.www.sayhello.SayHelloStub.SayHello)
getTestObject(org.example.www.sayhello.SayHelloStub.SayHello.class);
sayHello2.setIn("sweet");
System.out.println(stub.SayHello(sayHello2).getOut());
assertNotNull(stub.SayHello(sayHello2));
// Create an ADBBean and provide it as the test object
public org.apache.axis2.databinding.ADBBean getTestObject(
java.lang.Class type) throws java.lang.Exception {
return (org.apache.axis2.databinding.ADBBean) type.newInstance();
重新走一次发布流程,然后运行这个Junit类,就可以正确查看到结果了。
下载次数: 452
下载次数: 531
bestchenwu
浏览: 248338 次
来自: 武汉
赞!! 配合代码解释得很详细!! 谢谢了!!
写的真好,,以前就知道java与javascript是值传递, ...
document.getElementById(& ...当前位置: >
> 动态调用WebService方法好像很多人做WebService的时候都是直接添加引用的方式,然后
动态调用WebService方法好像很多人做WebService的时候都是直接添加引用的方式,然后
动态调用WebService方法好像很多人做WebService的时候都是直接添加引用的方式,然后调用服务端的方法.这样就个问题,就是每次我服务端添加了方法或者修改了方法后都要更新Web引用,这样比较麻烦.下面给一个不用添加引用的方式调用服务端的方法.只是一个简单的测试,不是很规范,用得着的人可以自己封装一下,然后直接传服务端的方法名进去,Type.GetMethod获取方法,然后method.Invoke返回结果高手些多多包函,主要是给用得着的人参考一下,互相学习.代码主要是用了 System.Web.Services.Description里的东西新建一个WebService项目,添加以下代码:  C# code   using S using System.Collections.G using System.L using System.W using System.Web.S
namespace TestWebService {
/// &summary&
/// Service1 的摘要说明
/// &/summary&
[WebService(Namespace = &;,Description=&我的Web服务&)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class TestWebService : System.Web.Services.WebService
[WebMethod]
public string HelloWorld()
return &测试Hello World&;
[WebMethod]
public string Test()
return &测试Test&;
[WebMethod(CacheDuration = 60,Description = &测试&)]
public List&String& GetPersons()
List&String& list = new List&string&();
list.Add(&测试一&);
list.Add(&测试二&);
list.Add(&测试三&);
下面是客户端:  C# code   using S using System.IO; using System.Collections.G using System.L using System.C using System.W using System.N using System.R using System.CodeD using System.Web.S using System.T using System.Web.Services.D using System.Web.Services.P using System.Xml.S using System.Windows.F
namespace ConsoleApplication1 {
class Program
static void Main(string[] args)
WebClient client = new WebClient();
String url = &;;//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上:
Stream stream = client.OpenRead(url);
ServiceDescription description = ServiceDescription.Read(stream);
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。
importer.ProtocolName = &Soap&; //指定访问协议。
importer.Style = ServiceDescriptionImportStyle.C //生成客户端代理。
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewA
importer.AddServiceDescription(description, null, null); //添加WSDL文档。
CodeNamespace nmspace = new CodeNamespace(); //命名空间
nmspace.Name = &TestWebService&;
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace);
ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider(&CSharp&);
CompilerParameters parameter = new CompilerParameters();
parameter.GenerateExecutable =
parameter.OutputAssembly = &MyTest.dll&;//输出程序集的名称
parameter.ReferencedAssemblies.Add(&System.dll&);
parameter.ReferencedAssemblies.Add(&System.XML.dll&);
parameter.ReferencedAssemblies.Add(&System.Web.Services.dll&);
parameter.ReferencedAssemblies.Add(&System.Data.dll&);
CompilerResults result = pileAssemblyFromDom(parameter, unit);
if (result.Errors.HasErrors)
// 显示编译错误信息
Assembly asm = Assembly.LoadFrom(&MyTest.dll&);//加载前面生成的程序集
Type t = asm.GetType(&TestWebService.TestWebService&);
object o = Activator.CreateInstance(t);
MethodInfo method = t.GetMethod(&GetPersons&);//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
String[] item = (String[])method.Invoke(o, null);
//注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了
foreach (string str in item)
Console.WriteLine(str);
//上面是根据WebService地址,模似生成一个代理类,如果你想看看生成的代码文件是什么样子,可以用以下代码保存下来,默认是保存在bin目录下面
TextWriter writer = File.CreateText(&MyTest.cs&);
provider.GenerateCodeFromCompileUnit(unit, writer, null);
writer.Flush();
writer.Close();
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-所有回答(5)
你添加web引用不就行了?
然后选择头两个应该都可以。。。
园豆:5702
园豆:5702
添加webservice引用,然后引入相应命名空间,直接调用方法,或者在aspx页面通过js ajax的形式调用。
园豆:40773
采用服务引用,当引用完并且测试好准备发布到服务器上是修改下配置文件中的webservice地址即可。
服务引用的地址是可以通过配置文件进行配置的。
园豆:5587
园豆:5587
园豆:5587
你发布后 服务不是有个地址的么,把你引用服务的地址改成发布后的地址。
园豆:9932
调试的时候会出现webservice,或者自己添加,然后更改相应的配置信息就OK。
&&&您需要以后才能回答,未注册用户请先。

我要回帖

更多关于 webservice接口 的文章

 

随机推荐