`
bulote
  • 浏览: 1310577 次
文章分类
社区版块
存档分类
最新评论

动态定制了一次webservice

 
阅读更多

终于有一个功能是自己的思路,自己解决每一个问题,然后最终调试成功了。

一、确定需求

回学校了,手有点生疏了,但是,还是非常想找师兄讨论一下接下来的项目需求。将近用了快一个小时的时间,确定下来,这次核心功能是这样的:根据不同的条件来选择性的生成并发布webservice。也就是说可以通过界面操作的方式来选择webservice的返回值有哪些。再说的具体一点就是:比如,有三个表,分别存放了学生的个人资料表,学院表,系别表,用户界面中要求有这三个表的列名,用户通过操作选择服务端发布哪几个列的webservice。

二、确定思路

思路的整理是一个比较难搞定的问题。最初的最初,想的是生成两个java文件,然后改一个配置文件,所以,最初的问题就放在了获取数据库表的列名,这个问题,可以通过java中的反射机制来做。因此,就写了一个程序来获取其中某个表的列名,但是,小叶说,写代码要负责,经过他的开导,我把这个类抽象成了一个抽象类,幸亏听了小叶的,要不后面还要重写。接下来的主要问题就是判断,用户提交后,到底是要哪个表的哪个列,难住了……毕竟是三个表,其实,三个表还好,要是n多个表可是咋整?于是,思路被打断,开始思考……突然想到,为什么不在数据库中建立一个视图呢?于是,联系了一下师兄,得到师兄的允许,改为先建立视图,然后用hibernate操作视图。

现在有点清楚了,摆在面前的有这么几个问题:

1、在数据库中建立视图后,怎样用hibernate映射,和普通的表一样吗?而且,视图中没有主键的。

2、新建文件,主要是对文件的内容写入问题。

3、配置文件的修改,也就是要发布webservice--------用流的方式还是用xml解析

思路定下来了,然后就是解决这些问题。其实,最难解决的我觉得是第一个问题。

三、解决问题

1、视图映射问题

我们都知道,hibernate映射表的时候,如果没有主键,就会生成两个实体类。网上有些人说要在生成后改两个实体类,有的说不用改,直接用。我觉得,没有必要。具体的完成过程:

首先,说一下我的表的结构:

users表:usersid(主键)、username、password、depart(外键)

college表:colid(主键)、colname

department表:deid(主键)、dename、colid(外键)

(1)新建一个视图:

Code:
  1. createviewusersinforasselectusers.usersidasusersid,users.usernameasusername,
  2. users.authorityasauthority,department.denameasdepartment,
  3. college.colnameascolnamefromusers,department,college
  4. whereusers.depart=department.deidanddepartment.colid=college.colid

(2)hibernate映射视图

就像普通的表那样,直接映射就可以了,但是,生成的内容是不一样的,因为视图中没有主键,不过不要紧,直接用就行了,唯一要注意的是写法有些不同,比如,要查询,应该这样写:

Code:
  1. "fromUsersinforUwhereU.id.usersid=?"

要获取这个类中属性内容的时候,写法也不一样:

Code:
  1. Stringusername=newString();
  2. Usersinforusers=newUsersinfor();
  3. username=users.getId().getUsername();

2、新建文件并写入

首先,文件名,我想的是用产生随机数的方法来对文件进行命名;读写的时候,要根据提交的checkboxlist的值生成相应内容,当然,要用流的方式。

Code:
  1. packagecom.usersope.IO;
  2. importjava.io.File;
  3. importjava.io.FileInputStream;
  4. importjava.io.FileNotFoundException;
  5. importjava.io.FileOutputStream;
  6. importjava.util.List;
  7. importjava.util.Random;
  8. importcom.opensymphony.xwork2.ActionSupport;
  9. importcom.usersope.IOUtil.FileOpe;
  10. importcom.usersope.IOUtil.UpString;
  11. importcom.usersope.IOUtil.XmlOpe;
  12. publicclassGetUrlextendsActionSupport{
  13. privateStringsql=newString();
  14. privateListuserslist;
  15. FilefileImpl;
  16. FileIfile;
  17. Randomrand;
  18. inti;
  19. StringfilenameImpl=newString();
  20. StringfilecontentImpl=newString();
  21. StringIfilename=newString();
  22. StringIfilecontent=newString();
  23. Stringservicename=newString();//配置文件中要用的
  24. Stringurl=newString();
  25. publicStringexecute(){
  26. //产生随机数
  27. rand=newRandom();
  28. i=rand.nextInt(100);
  29. //要写入的字符串
  30. //找到文件,如果文件不存在,则新建.这里是新建文件
  31. filenameImpl="Getmes"+i+"Impl";
  32. servicename="Getmes"+i;
  33. Ifilename="IGetmes"+i;
  34. fileImpl=newFile("F://myProject//userservice//src//com//service//"+filenameImpl+".java");
  35. Ifile=newFile("F://myProject//userservice//src//com//service//"+Ifilename+".java");
  36. while(fileImpl.exists()||Ifile.exists()){
  37. //产生随机数
  38. i=rand.nextInt(100);
  39. filenameImpl="Getmes"+i+"Impl";
  40. servicename="Getmes"+i;
  41. fileImpl=newFile("F://myProject//userservice//src//com//service//"+filenameImpl+".java");
  42. Ifile=newFile("F://myProject//userservice//src//com//service//"+Ifilename+".java");
  43. }
  44. FileOpe.createFiles(fileImpl);//用到了上面的静态方法
  45. FileOpe.createFiles(Ifile);
  46. //以上是建立两个文件
  47. //下面是写文件
  48. //接口里面的内容
  49. Ifilecontent="packagecom.service;";
  50. Ifilecontent=Ifilecontent+"publicinterface"+Ifilename;
  51. Ifilecontent=Ifilecontent+"{publicStringgetmes(intuserid);}";
  52. //接口实现里面的内容
  53. Filefilemedo1=newFile("F://myProject//userservice//src//com//service//ok1.txt");
  54. Filefilemedo2=newFile("F://myProject//userservice//src//com//service//ok2.txt");
  55. try{
  56. FileInputStreamfis1=newFileInputStream(filemedo1);
  57. Strings1=FileOpe.readFileInputStr(fis1);//读取数据,并将读取到的数据存储到数组中
  58. filecontentImpl=filecontentImpl+s1;
  59. filecontentImpl=filecontentImpl+""+filenameImpl+"implements"+Ifilename;
  60. FileInputStreamfis2=newFileInputStream(filemedo2);
  61. Strings2=FileOpe.readFileInputStr(fis2);//读取数据,并将读取到的数据存储到数组中
  62. filecontentImpl=filecontentImpl+s2;
  63. }catch(FileNotFoundExceptione1){
  64. //TODOAuto-generatedcatchblock
  65. e1.printStackTrace();
  66. }//创建流对象
  67. //将字符串的第一个字母变成大写
  68. for(inti=0;i<userslist.size();i++){
  69. Stringstr=(String)userslist.get(i);
  70. char[]aa=UpString.upcase(str);
  71. Stringbb=newString(aa);//字符数组转换为string类型
  72. filecontentImpl=filecontentImpl+"idmes=idmes+"+"/""+"<"+str+">"+"/"";
  73. filecontentImpl=filecontentImpl+"+users.getId().get";
  74. filecontentImpl=filecontentImpl+bb+"()+";
  75. filecontentImpl=filecontentImpl+"/""+"</"+str+">"+"/";"+"";
  76. }
  77. filecontentImpl=filecontentImpl+"idmes=idmes+"+"/""+"</user>"+"/""+";"+""+"returnidmes;}}";
  78. FileOutputStreamfos=null;
  79. try{
  80. fos=newFileOutputStream(fileImpl,true);//为true的时候是追加,默认是覆盖
  81. FileOpe.writeString(filecontentImpl,fos);
  82. fos=newFileOutputStream(Ifile,true);//为true的时候是追加,默认是覆盖
  83. FileOpe.writeString(Ifilecontent,fos);
  84. }catch(FileNotFoundExceptione){
  85. }finally{
  86. try{
  87. fos.close();
  88. }catch(Exceptione){
  89. e.printStackTrace();
  90. }
  91. }
  92. XmlOpe.add(servicename);
  93. //转到显示url的页面
  94. url="http://localhost:8080/userservice/services/"+servicename+"?wsdl";
  95. return"url";
  96. }
  97. publicStringgetUrl(){
  98. returnurl;
  99. }
  100. publicvoidsetUrl(Stringurl){
  101. this.url=url;
  102. }
  103. publicListgetUserslist(){
  104. returnuserslist;
  105. }
  106. publicvoidsetUserslist(Listuserslist){
  107. this.userslist=userslist;
  108. }
  109. }

其中,涉及到的问题有:将一个字符串的首写字母变为大写:

Code:
  1. publicclassUpString{
  2. publicstaticchar[]upcase(Stringstr){
  3. char[]aa=str.toCharArray();
  4. if(aa[0]>96&&aa[0]<123)
  5. aa[0]=(char)(aa[0]-32);//小写换大写
  6. //System.out.print(aa);
  7. returnaa;
  8. }
  9. }

文件的操作等。

3、配置文件的修改,即services.xml文件的修改

征求了小叶的意见,用解析的方式进行,这样也明了。只不过其中只要传递一个参数就ok了。

Code:
  1. importjavax.xml.parsers.DocumentBuilderFactory;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.FileOutputStream;
  5. importjava.io.IOException;
  6. importorg.w3c.dom.*;
  7. importorg.xml.sax.SAXException;
  8. importjavax.xml.parsers.*;
  9. importjavax.xml.transform.*;
  10. importjavax.xml.transform.dom.DOMSource;
  11. importjavax.xml.transform.stream.*;
  12. importjavax.xml.xpath.*;
  13. publicclassXmlOpe{
  14. //参数就是生成的文件名
  15. publicstaticvoidadd(Stringservicename){
  16. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  17. Elementservice=null;
  18. ElementtheElem=null;
  19. Elementroot=null;
  20. try{
  21. factory.setIgnoringElementContentWhitespace(true);
  22. DocumentBuilderdb=factory.newDocumentBuilder();
  23. Documentxmldoc=db.parse(newFile("F://myProject//userservice//WebServices//services.xml"));
  24. root=xmldoc.getDocumentElement();
  25. //---新发布一个webservice----
  26. service=xmldoc.createElement("service");
  27. theElem=xmldoc.createElement("name");
  28. theElem.setTextContent(servicename);
  29. service.appendChild(theElem);
  30. theElem=xmldoc.createElement("serviceClass");
  31. theElem.setTextContent("com.service."+"I"+servicename);
  32. service.appendChild(theElem);
  33. theElem=xmldoc.createElement("implementationClass");
  34. theElem.setTextContent("com.service."+servicename+"Impl");
  35. service.appendChild(theElem);
  36. theElem=xmldoc.createElement("style");
  37. theElem.setTextContent("wrapped");
  38. service.appendChild(theElem);
  39. theElem=xmldoc.createElement("use");
  40. theElem.setTextContent("literal");
  41. service.appendChild(theElem);
  42. theElem=xmldoc.createElement("scope");
  43. theElem.setTextContent("application");
  44. service.appendChild(theElem);
  45. System.out.print(1);
  46. root.appendChild(service);
  47. saveXml("F://myProject//userservice//WebServices//services.xml",xmldoc);
  48. }catch(ParserConfigurationExceptione){
  49. e.printStackTrace();
  50. }catch(SAXExceptione){
  51. //TODOAuto-generatedcatchblock
  52. e.printStackTrace();
  53. }catch(IOExceptione){
  54. //TODOAuto-generatedcatchblock
  55. e.printStackTrace();
  56. }
  57. }
  58. //将Document输出到文件
  59. publicstaticvoidsaveXml(StringfileName,Documentdoc){
  60. TransformerFactorytransFactory=TransformerFactory.newInstance();
  61. try{
  62. Transformertransformer=transFactory.newTransformer();
  63. transformer.setOutputProperty("indent","yes");
  64. DOMSourcesource=newDOMSource();
  65. source.setNode(doc);
  66. StreamResultresult=newStreamResult();
  67. result.setOutputStream(newFileOutputStream(fileName));
  68. transformer.transform(source,result);
  69. }catch(TransformerConfigurationExceptione){
  70. e.printStackTrace();
  71. }catch(TransformerExceptione){
  72. e.printStackTrace();
  73. }catch(FileNotFoundExceptione){
  74. e.printStackTrace();
  75. }
  76. }
  77. }

四、调试并发现问题

调试也花了一些时间,最终还是调试成功了,但是,其中有一个问题又出现了:每次生成webservice,都必须要求服务器重新启动才能生效。小叶曾经说过可以用监听器,不过,我没有试过,不知道行不行。暂时这个先做到这吧。

大家见笑了……

分享到:
评论

相关推荐

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

     soap_init(struct soap *soap) 初始化环境变量(只需执行一次)  struct soap *soap_new() 定义并初始化环境变量并返回一个该变量的指针  struct soap *soap_copy(struct soap *soap) 定义一个环境变量并从已有...

    GFK通用框架操作说明V1

    2.所有功能通过插件式开发,通过服务器进行更新,一次部署持续更新、所有插件之间可相互调用。3.通用的权限控制,所有插件可设置多层次的角色权限。4.用户界面可自行定制、所有列表(报表)列可自由移动,并且保存...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以著述清楚明了,行文流水,言简意赅著称,在国内具有相当高的知名度,他的著作之一《Windows核心编程(第5版)》屡获殊荣,在国内外都...

    呼叫中心(软航呼叫中心)

    纯IE浏览器操作界面,无需安装客户端软件,只需一次安装服务器系统即可,其它电脑即可网络查看。 2. 基于业界流行的开放式.NET4.0技术,支持XML/WebService/SOA,易于扩展和与其它CRM、ERP系统集成。 。 3. 最新...

    彩信平台软件

    福软彩信平台是一款功能强大、界面优美、...二次开发接口 接口管理 支持HTTP方式以及存储过程方式的二次开发接口, 支持基于WebService的二次开发接口,支持第三方接口 咨询联系方式 联系QQ:84401116 电话:13950404552

    手机短信平台软件开发

    二次开发接口:支持HTTP方式以及存储过程方式的二次开发接口, 支持基于WebService的二次开发接口,支持第三方接口 提供短信平台软件.短信网关.彩信平台软件,彩信网关软件 联系QQ:84401116 电话:13950404552许风 ...

    asp.net知识库

    .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 ...

    企信通短信平台 v2.0

    企业信使/企信通短信平台是一个集多种短信业务功能和管理功能于一体的短信服务多功能运营平台,具有稳定可靠、模块化、开放性、灵活性等特点,它既适用于各行业企业集团做行业短信信应用(集团客户),也适合于短信...

    短信彩信群发系统平台源码1.0版

    其原理是:软件可以设置多长时间从数据库中取一次数据,当有数据时,会自动下载号码文件,将手机号码和短信内容,写进爱迪生6.0/7.0网络版的数据库中,短信便可自动发送。 5、网关接收系统:本系统的功能也是将号码...

    sp短信平台软件资料

    3.1 二次开发接口 支持基于WebService的二次开发接口 3.2 第三方合作方管理 合作方增加、暂停和修改,以及认证 4 应用模块 4.1 彩图下载 提供彩图下载类业务模版 4.2 铃声点播 提供铃声点播类业务模版 4.3 新闻...

    ASP EXCEL导入SQL

    这是一次飞跃,让REST的思想从网络服务的应用提升到了网络应用软件开发。利用REST思想的simply_restful插件已经成为了Rails框架的核心内容。  REST安全性  我们把现有基于SOAP的网络服务和基于REST/HTTP网络服务...

    企信通短信平台

    系统采用目前最优秀的插件开发方式,接口开发一次就可以N次配置,可以连接CMPP、SMGP、SGIP、SMPP、EMPP、Webservice、Http、Soap、卡发接口等多有协议; 系统的安全性 系统采用多种安全措施确保系统的安全,有效的...

    汇讯wiseuc企业即时通讯软件

     汇讯WiseUC有轻量级插件架构、二次开发接口,可以将企业信息系统集成,实现一站式统一办公平台。同时,可以全面满足企业沟通需求:统一通信、企业邮局、远程会议、在线客服等。  3.安全性。  对于关注企业信息...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    3.1 Linux内核定制、裁剪和添加36 3.1.1 概述36 3.1.2 内核目录简介37 3.1.3 配置文件和配置工具37 3.1.4 内核的编译命令39 实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 3.2.2 ...

    嵌入式Linux程序设计案例与实验教程-实例代码

    3.1 Linux内核定制、裁剪和添加36 3.1.1 概述36 3.1.2 内核目录简介37 3.1.3 配置文件和配置工具37 3.1.4 内核的编译命令39 实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 ...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    3.1 Linux内核定制、裁剪和添加36 3.1.1 概述36 3.1.2 内核目录简介37 3.1.3 配置文件和配置工具37 3.1.4 内核的编译命令39 实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 3.2.2 ...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    3.1 Linux内核定制、裁剪和添加36 3.1.1 概述36 3.1.2 内核目录简介37 3.1.3 配置文件和配置工具37 3.1.4 内核的编译命令39 实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 3.2.2 ...

    企业信使-.net

    “企业信使/企信通短信平台”基于企业客户对短信集成、短信发送、短信互动最直接的需求而量身定制,独立部署、自成体系,采用的多进程智能处理、多通道自动切换、多网关自动调配的机制,在同类平台设计中是独到先进...

Global site tag (gtag.js) - Google Analytics