-
web 开发 - 编译工具1
2010-11-12 00:26:00保证每个项目的开发人员都可以一键发布,新加入的开发人员可快速在本机进行部署。江南白衣在四种软件开发实践中建议每三个礼拜就发布一次。我认为在项目开发开始后,每个礼拜都进行软件的发布,每三个礼拜进行一次...在项目开始编程的第一天就发布你的HelloWorld.
我们编写的程序最终需要发布,我的建议是在项目的第一天就建立好的你的发布脚步,在开发的过程中随时发布最新的进展到dev服务器上。每次项目会议时,demo演示环节,访问服务器而不是开发人员的本机。 保证每个项目的开发人员都可以一键发布,新加入的开发人员可快速在本机进行部署。
江南白衣在四种软件开发实践中建议每三个礼拜就发布一次。我认为在项目开发开始后,每个礼拜都进行软件的发布,每三个礼拜进行一次内部开发版本的增加(0.00 ~ 0.01)。每个开发人员都知道目前软件的全景,在进行软件feature 的brain storm时,非常清晰的界定哪些是已实现,哪些还是思维中孕育的云雾。基本上在一个feature的雏形出来后,下一个最重要的feature就跃然脑中了。往往你的头脑可以同时做两件事:当前feature的细节实现(coding),下一个feature的定义(requirements)。这种交替对你stuck时非常有益处。
Ant
如果你是c/c++程序员,相信你必然写过不少的make脚本。如果你是java程序,ant就是你必须掌握的第一个(如果你从notepad 下的helloworld开始)或者第二个工具(假如你从eclipse平台开始)。
Ant是什么?
Ant is a Java-based build tool. 主要完成以下三个任务:
-
编译
-
打包/发布
-
运行测试
为什么不直接使用javac来编译我的程序,然后使用jar来打包我的程序?
兄弟,想必你也了解任何一个非hello world的程序都会引用到许多的其他lib,任何一个web类的java程序在打包时都会有一大堆WEB-INF(页面,config,css,javascript)的文件。Ant就是来自动帮你来include lib引用,组织你的web app文件...
Hello Ant
任何一个hello world 类的 tutorial,包含以下四步:
-
Find a simple example
-
Try it
-
Have some basic concept
-
Know how to dig it more.
在学习踢球时,教练一般是先跟你示范,然后让你模仿,最后是跟你理论。同样,我们学习任何一个工具,框架,语言时,基本上遵守三步走的原则: color: #000000;">示范,模仿,理论。如果你悟性较高,就会有第四步:创新。学习的另外一个基本原则就是从整体到局部。假如你给一位老先生讲解汽车的结构,首先你拿出一个单独的轮子,告诉他汽车有四个这样的轮子,接着整出一单独的方向盘,随后又是一个单独的油罐,一单独的发动机,除非老先生是Karl Benz,否则他是断然不能从这些零件中组装拼凑出一个完整的汽车模样。
我们学习任何一样新的事物,第一件事情,总是Find a example and try it,有一个整体的认识后,对一个个局部的概念组件进行分解。废话略过,翠花,上hello, ant
Download
下载工具和文档
http://ant.apache.org/bindownload.cgi
注意下载最新的版本,阅读相应版本的文档(除非你找不到对应的文档)。ant的zip包里面已经包含有manual,所以不用另外下载。当然你也可以bookmark其manual文档网址http://ant.apache.org/manual/index.html
Install
- 解压到电脑任何一个有空间的地方,比如D:/apache-ant/ant-1.7
- 将ant的bin(D:/apache-ant/ant-1.7/bin)路径加入到path,(windows下:我的电脑 – 右键 property - 高级 – 环境变量)。习惯的做法是创建一个ANT_HOME的环境变量,指向ant目录(D:/apache-ant/ant-1.7),然后修改path为
path=%ANT_HOME%/bin;%PATH%
打开一个新的CMD窗口,输入 ant,验证是否设置成功。
如果提示你找不到build.xml,安装成功;如果提示没有ant这个命令,请google如何设置环境变量.
Try it
java 源文件 hello ant
build.xml文件
使用ant,就从build.xml文件开始。在CMD下面运行ant命令,默认会读入当前目录下build.xml文件,执行指定的target.
目录结构
-Myproject
-src
-Hello.java
-build.xml
使用ant命令,打开CMD,切换到Myproject目录,执行不同的task,观察CMD控制台输出和Myproject目录下新文件的生成
> ant
> ant clean
> ant init
> ant compile
> ant dist
麻雀虽小,可也五脏俱全。ant到底做了哪些事情?从build文件结构即可看出端倪:
变量定义properties: 如同java程序中,我们经常会抽取重复的字面常量为一个静态变量,以便修改,ant中的property的一个重要作用就是定义对字符串常量的引用,比如你可以将一个很长的路径定义为property
<property name=”long.path” value=””/>
在引用该路径时,只需要使用${long.path}即可。这样如果改路径修改为E:/xx/yy/zz,你只需要修改该property即可,而不用对所有使用到该路径的地方进行replace。Property另外一个重要的作用则对构建过程进行customize。比如我们在dev(开发), test(测试), prod(产品)中分别有不同的config文件(数据库的连接,不同的数据库服务器的ip),在打包时,我们希望生成的jar/war根据需要包含相应的config。这时我们可以使用${config.target},在执行ant命令时,通过-D参数选项来指定这个property值。
ant -Dconfig.target=prod
初始化 init: 生成build目录,编译过程中产生的class文件,放于在此目录
编译compile(javac): 将给定目录下(src)的所有java文件进行编译,指定目标目录为init中生成的build目录
打包 dist(jar): 将给定目录下(build)的class文件,打成jar包
清理clean:将构建中生成的一些临时目录删除
Ant Concept
project
熟悉XML文件的都知道,一个xml文件的node tree从一个根节点开始。build.xml 文件的根节点是project, 有三个很有用的属性
-
name – 可使用 ${ant.project.name} 来引用, 关于property,下文会进一步说明
-
default – 默认运行的target
-
basedir – build.xml 文件中所有相对路径的参考路径
target
官方文档: A target is a container of tasks that cooperate to reach a desired state during the build process
target对应我们构建过程中的一个环节, 编译,打包...。在ant中,则是task的容器(xml包含task子节点的父节点)。
我们在构建中,各个环会有先后依赖关系,要打包生成jar文件,首先需要编译生成class文件。Target的depends属性 制定依赖关系。例子中dist依赖于compile,compile依赖于init。
In a chain of dependencies stretching back from a given target such as D above, each target gets executed only once, even when more than one target depends on it.
两个最基本的属性
-
name
-
depends
task
官方文档: A task is a piece of code that can be executed.
Ant不过是脚本, 真正做事情的是什么呢? 编译,jdk bin下面的 javac; 生成目录,bat的mkdir命令... ant中的task则是调用这些命令的接口。Ant 的build-in task 很多,最常用的以下5种
property
最简单的property就是一变量,有两个最基本的属性
- name
- value
比如,<property name="foo.dist" value="dist"/>, 然后可使用${foo.dist}引用
你可以从properties文件里一次引入多个property,<property file="foo.properties"/> 还可以引入环境变量 <property environment="env"/> <echo message="ANT_HOME is set to = ${env.ANT_HOME}"/> 此外,ant 还有一些内建的property
Build_in_property: 使用频率最高的当是前面提到的${ant.project.name} 和 ${basedir}
path like structures
在我使用ant的初期,最常用而又最迷糊的就是path 类的结构。
我们编译时候,往往需要classpath,来包含给类的依赖jar包;在打包文件时,往往需要指定哪些文件需要被包含。
这正是path/classpath 用武之地。
例子
定义一个path结构,在javac中使用classpathref来应用这个path,从而指定依赖的jar包
下面例子中包含${lib.dir}目录下所有的jar包(包括子目录中的jar)
注意,ref引用时不需要${}来引用, path 中可以通过refid嵌套另外一个path,通过refid来引用另外一个path也是直接使用名称即可
也可以直接嵌套classpath,不过我们为了复用,往往另外定义path
从上面的例子中可以看出,path类结构有以下几种写法
- pathelement
- 指定location属性,指向单个文件或目录
- 指定path属性, 以; 或 : 分隔的多个location, 或者引用另外一个path
- 使用refid 进行嵌套 (或者classpathref 属性进行引用)
- 包含resouces colloection,其中最常用的当属于FileSet,通常我们指定一个dir,通过include和exclude来选出我们要包含的文件
<include name="**/*.java"/> <exclude name="**/*Test*"/>
模式pattern,经常用到两种,* 和 **。我们都知道*表示匹配任意的character(包括空)。ant中是进行path匹配,因此考虑嵌套结构(子目录):
单个*,则指对一层目录(per-directory)结构进行匹配,
两个**,则表示0层或者多层目录结构,
test/* 只匹配 test目录下的文件, such as test/x.java, test/y.html, but not test/foo/bar/xyz.html
test/** 匹配所有嵌套目录(子目录),
such as
test/x.java
, ortest/foo/bar/xyz.html
, but not/xyz.xml
.Reference
(如有雷同,纯属拷贝):
http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html
http://ant.apache.org/manual/tutorial-writing-tasks.htmlHow to dig it more ?
本人也尚在dig之中,但以为要想dig more,无非以下几种
-
practice more 更多的练习
-
use it more 更多的使用。我们经常说用english来思考,用java来思考,同样的,用ant进行思考。换一种说法,真正的运用它来帮助你解决实际的问题。如果你在开发中总是重复的做一件事情,比如将生成的war包拷贝到Tomcat的webapp目录下来测试最新的代码,这时就该想想使用ant来自动化copy。老赵说他说c++,几次下来都没有坚持到底。我有同感,学校上机考试用的都是c++,可工作后从没有使用c++,现在也忘得差不多了。为什么? c++难吗?非也,未用而已。如果在某人的简历上写着精通c/c++,java,delphi, python, php, ruby, perl, javascript,...十多种语言,一定要问问这些语言是否解决过实际的问题,是否有真正的生产力。如果仅仅是hello world和toy,一天通一门非难事。
-
read more ant build file in open source project。外行看热闹,内行看门道。优秀的开源项目不仅是源代码一流,build文件和文档往往也是一流。
-
go through the manual。1), 2), 3)是点滴的经验积累,要想通盘掌握,了然于胸,go through是必不可少的环节。同样的,在熟悉掌握一个框架时,go through 所有的class和API也是你自己挖掘隐藏属性的好方法。
-
summary。本文也是summary之作...
-
jump out of ant: other tools, maven。
-
-
asp.net web开发框架_Web前端开发必不可少的9个开源框架
2020-11-20 19:16:29开源最前线(ID:OpenSourceTop) 猿妹编译链接:https://opensource.com/article/20/4/open-source-css-frameworks大多数人想到Web开发时,通常会想到HTML或JavaScript,往往忽略了CSS,根据Wikipedia的说法,CSS既是...
大多数人想到Web开发时,通常会想到HTML或JavaScript,往往忽略了CSS,根据Wikipedia的说法,CSS既是网页中最重要也是最常被遗忘的部分之一,尽管它是万维网的三大基础技术之一。今天就和大家分享9个流行的、强大的前端开源框架,帮助你轻松构建漂亮的网站前端。1、BootstrapBootstrap无疑是最流行的CSS框架,它是最早的Web前端框架,由Twitter开发。Bootstrap还提供了许多示例来帮助你入门。开源最前线(ID:OpenSourceTop) 猿妹编译
链接:https://opensource.com/article/20/4/open-source-css-frameworks
使用Bootstrap,你可以将不同的组件和布局组合在一起,从而创建有趣的页面设计。它还提供了大量详细的文档。目前在Github上已经有1100多个贡献者,19000多个提交。(Github地址:https://github.com/twbs/bootstrap)2、PatternFlyPatternFly是Red Hat的开源CSS框架,和Bootstrap不同的是,Bootstrap是为那些想要创建漂亮网站的人而设计的,而PatternFly主要专注于企业应用程序开发人员,提供诸如条形图、图表、导航之类的组件,实际上Red Hat就是使用它创建了OpenShift。
除了静态HTML,PatternFly还支持ReactJS框架,这是Facebook开发的流行JavaScript框架。PatternFly具有许多适用于企业级应用程序的高级组件,如条形图,图表,模式和布局。PatternFly在GitHub上一共有1,050多个提交和44个贡献者。(Github地址:https://github.com/patternfly/patternfly)3、Material Components for the webMaterial Components for the web(MDC Web),是谷歌专为Web设计的全新前端框架。MDC Web可帮助开发人员执行Material Design,组件由谷歌的核心工程师团队和UX设计人员开发。这些组件可以建立可靠的开发工作流程,以构建美观且功能强大的Web项目。
MDC Web在Github上共有5700多个提交和349个贡献者。(Github地址:https://github.com/material-components/material-components-web)4、PureBootstrap,Patternfly和MDC Web是功能非常强大的CSS框架,但它们可能非常繁琐和复杂。如果你想要一个轻量级的CSS框架,可以尝试Pure.css,它本身更接近于CSS编程,但又可以帮助你构建一个不错的网页。Pure是具有最小占用空间的轻量级CSS框架,它由Yahoo开发,根据BSD许可是开源的。
Pure在Github上共有565多个提交和59个贡献者。(Github地址:https://github.com/pure-css/pure)5、FoundationFoundation声称是世界上最先进的响应式前端框架。它提供了用于构建专业网站的高级功能和教程。许多公司,组织都使用该框架,并且该框架具有大量可用的文档。
Foundation在Github上有将近17000个提交和1000个贡献者。(Github地址:https://github.com/foundation/foundation-sites)6、BulmaBulma是一个基于Flexbox的开源框架,可根据MIT许可证开源。Bulma是一个非常轻量级的框架,因为它只需要一个CSS文件。Bulma拥有简洁明了的文档,可轻松选择你想要的主题。它还具有许多Web组件,你可以在设计中使用它们。
Bulma在Github上有1400多个提交和300个贡献者。(Github地址:https://github.com/jgthms/bulma)7、Skeleton如果说还有什么框架比Pure更加轻量级,那一定是Skeleton。Skeleton库只有大约400行,并且该框架仅提供一些基本的CSS框架组件。尽管如此,Skeleton还是提供了详细的文档来帮助你快速上手。
Skeleton在Github上共有167个提交和22个贡献者,但它不是最活跃的项目,它最新一次的更新是在2014年。(Github地址:https://github.com/dhg/Skeleton)8、Materialize Materialize 是一个基于 Material Design风格的一个现代化的响应式前端框架,解决了最繁重的工作,结合你的自定义组件,为你提供默认的样式。Materialize的文档页面非常全面,并且很容易遵循。其组件页面包括按钮,卡片,导航等。
Materialize在Github上共有3800多个提交和250个贡献者。(Github地址:https://github.com/Dogfalo/materialize)9、BootflatBootflat是从Twitter的Bootstrap派生的开源CSS框架。与Bootstrap相比,Bootflat更简单,并且更加轻量级。Bootflat的文档似乎几乎受到了IKEA的启发,大部分都是图像,没有太多的文字。
Bootflat是在MIT许可证下开源的,在Github上有159个提交和8个贡献者。(Github地址:https://github.com/bootflat/bootflat.github.io)●编号975,输入编号直达本文
●输入shuku获取免费电子资源●输入m获取到文章目录
-
IDEA 下开发web项目部署时,配置文件没有编译的问题
2018-06-26 16:23:16本文转自:https://blog.csdn.net/dennk/article/details/51834508#commentBox以前用eclipse开发web项目时,配置文件直接放在src目录下面,部署的时候会把配置文件也编译到classpath下面。用IDEA可不同了,同样的...本文转自:https://blog.csdn.net/dennk/article/details/51834508#commentBox
以前用eclipse开发web项目时,配置文件直接放在src目录下面,部署的时候会把配置文件也编译到classpath下面。
用IDEA可不同了,同样的做法部署时classpath下没有找到配置文件。
解决方案:
将配置文件放在resources路径下即可(如果没有则新建一个,右击resources——>Mark directory As——>resources root)
-
codeforces-upsolving-helper:使用Flask开发的Web应用程序,可编译您尝试(至少提交一次)但无法获得...
2021-02-05 03:45:24使用Flask开发的Web应用程序,它会编译您尝试(至少提交一次)但无法获得“接受判决”的所有Codeforce问题。 为了方便起见,可以按索引(即A,B等)或等级(即小于1000、1000和1200之间,依此类推)对问题进行区分。... -
zwitterion:一个Web开发服务器,可让您导入任何内容*-源码
2021-01-28 17:04:50Web开发服务器,可让您导入任何内容* *如果您的意思是:JavaScript ES2015 +,TypeScript,JSON,JSX,TSX,AssemblyScript,Rust,C,C ++,WebAssembly,将来还会编译成JavaScript或WebAssembly。 Zwitterion... -
基于Axis2的自动化可配置的Web Service开发
2013-05-11 22:00:43基于Axis2和Tomcat的自动化可配置Web Service开发 目录 一、背景介绍...3 二、自动创建流程...3 1. Web Service Request.3 2. Web Service名称获取... 3 3. Web Service代码生成... 3 4. Web ...基于Axis2和Tomcat的自动化可配置Web Service开发
目录
1. Simple Service Properties.6
1. simpleService.properties.10
一、背景介绍
为了加快Tomcat环境下基于Axis2引擎的WebService开发,将开发Web Service的处理如参数解析,方法调用和结果返回进行了封装,生成一个Axis2Service.jar包,实现了Web Service的输入,处理和输出的可配置,简化了WebService的开发工作,并使用Axis2的hotupdate和hotdeploy功能,直接从WebService的properties或XML配置文件生成WebService代码,自动编译成class发布,简化了WebService的开发,并可部署相应的URL转换Servlet,缩短了WebService的调用URL。
二、自动创建流程
1. Web Service Request
用户或系统Server发出Web Service Request请求,包括Request URL以及相应的参数
例如http://10.139.8.167:8080/TestService/beeCommission?
strXMLParameter=<?xml version='1.0' encoding= 'UTF-8'?><requestversion='1.0'><beeCommissionCommand><Parameters><sessionID>112843584</sessionID><startDate>20130101</startDate><endDate></endDate></Parameters></beeCommissionCommand></request>
这是XML格式的RequestParameter;
http://10.139.8.167:8080/TestService/javaMethod?userId=leoliao&orderTime=20130326111259
这是String格式的RequestParameter
2. Web Service名称获取
从服务器上响应上述URL的Servlet收到的的Request URI中获取Web Service的名称。例如上述Web Service Request中,获得Service Name为:TestService
3. Web Service代码生成
Web Service的配置文件分为两种:
一种是XML文件,是全配置的Web Service,输入,执行操作和输出都可配置;
另一种是properties文件,是简单配置Web Service,直接将Web Service Mapping到指定的java方法。
根据Tomcat路径下conf目录中WSConfigure活页夹中所有的web serviceconfigure XML文件及properties文件,依次加载每一个XML文件到WebService对象,加载每一个properties文件到SimpleWebService对象,并生成相应的public java 方法,加上import的Axis2Service jar包中的语句,组成Web Service的java文件,放在Axis2缺省发布class文件作为web service的目录下。
每个Web Service配置文件都会有Debug的开关,如果所有的Web Service的配置文件中的Debug都是关闭的,则Web Service的自动生成和编译就不会运行。(Web Service Debug完成,正式发布后,应该把所有配置文件中的Debug都关掉。)
例如,上述例子中,读取Web Service XMLconfigure文件的路径为:E:\java\Tomcat7022\conf\WSConfigure
生成的Web Service代码文件为TestService.java,存放路径为:
E:\java\Tomcat7022\webapps\axis2\WEB-INF\pojo
4. Web Service代码编译
调用Java 的runtime,执行javac,编译生成的Web Service java代码,生成class文件,被自动发布为Web Service,java代码里面的每一个公共方法,都将发布成一个Web Service方法。
5. Web Service调用
转换短的Web Service调用URL,并处理所有参数,生成新的Web Service URL然后把调用Redirect到新的Web Service URL,完成Web Service调用。
例如:
http://10.139.8.167:8080/TestService/javaMethod?userId=leoliao&orderTime=20130326111259
将被转换为:
http://10.139.8.167:8080/axis2/services/TestService/javaMethod?userId=leoliao&orderTime=20130326111259
三、开发准备
— Install JDK set System VariableJAVA_HOME
— Install Tomcat apache-tomcat-7.0.22.exe (Tomcat7.exe)
安装完毕后,在IE中输入http://localhost:8080应能看到如下Tomcat的启动界面
如果无法看到此界面,说明Tomcat安装不成功,请检查相关配置及安装文件并重新安装直至成功。
— Downloadaxis2-1.6.1-bin.zip,unzip,set System variable AXIS2_HOME
— Download axis2.war,copy toTomcat7 webapps
Tomcat会自动解压axis2.war,在webapps目录中生成一个axis2的活页夹,所有axis2 Web Service引擎的应用文件都在这个目录下。
Axis2安装完毕,在IE中输入http://localhost:8080/axis应能看到如下Axis2的主界面:
如果看不到这个界面,说明Axis2安装不成功,请检查相关设置,确保Axis2安装成功。
— 取得Axis2Service.jar包,放入tomcat的lib目录中。
— 在tomcat的conf目录下的web.xml,增加TestService(要开发的WebService的名称)的servlet注册:
<servlet>
<servlet-name>TestService</servlet-name>
<servlet-class>com.foxconn.cmmsg.itss.URLTransfer</servlet-class>
</servlet>
并mapping到对所有以TestService开始的URL,也就是TestService所包含的所有API访问路径,都会由这个Servlet来处理:
<servlet-mapping>
<servlet-name>TestService</servlet-name>
<url-pattern>/TestService/*</url-pattern>
</servlet-mapping>
4. Axis2设定
— 使用Axis2用最简单的缺省POJO方式发布Web Service,避免打包成aar文件再发布的繁琐步骤:
直接把编译好的TestService.class文件放到axis2\WEB-INF\pojo目录中
如果没有pojo目录,则建立该目录;
如果需要使用其他目录名称,请修改axis2\WEB-INF\conf\axis2.xml中:
<deployer extension=".class"directory="pojo"class="org.apache.axis2.deployment.POJODeployer"/>
缺省的pojo为其他的目录名。
— 修改axis2\WEB-INF\conf\axis2.xml中:
<parametername="hotdeployment">true</parameter>
启用热发布功能,Tomcat不需要重新启动就可以自动发布Web Service。
— 修改axis2\WEB-INF\conf\axis2.xml中:
<parameter name="hotupdate">true </parameter>
启用热更新功能,Tomcat不需要重新启动就可以更新已发布成功的Web Service。
四、Web Service配置文件
使用Axis2Servic.jar包所包含的框架进行Web Service的开发,最主要的工作就是配置Web Service的XML或properties configure文件。这些configure文件缺省路径在Tomcat的conf目录下的WSConfigure文件夹:
1.Simple Service Properties
Web Service的Properties configure配置文件比较简单:
例如simpleService.properties内容如下:
sevice.version =1.0 service版本
service.ame=simpleService service名称
service.debug=true 是否打开debug
service.datasource=hiverService 数据源JNDI名称
service.classfolder=WSClass 加载类文件的活页夹
Mapping2JavaMethod=ServiceImpl.simpleService service mapping到的java类和公开静态方法名称
Parameters=para1,para2,para3 service的参数列表
Web Service的XMLconfigure配置文件主要分四部分,依次介绍如下:
2. Service Header
<?xml version="1.0" encoding="UTF-8"?>
<service name="JavaMethod" tag="JavaMethod"version="1.0"
debug="true"datasource="hiver" classfolder="WSClass">
<errormessageList>
<errormessage>Success.</errormessage>
<errormessage>Your accountis locked.</errormessage>
<errormessage>Fail to pairyour account.</errormessage>
<errormessage>API version isincorrect.</errormessage>
</errormessageList>
这里定义了WebService方法的名称,显示的Tag,API版本,是否打开debug,使用的数据源以及如果使用Java方法,引用的javaclass的活页夹。
errormessageList部分可以有一条或多条,是针对此web service定义的error message,顺序位置为对应的errorcode。
每个Web Service方法都必须有。
3.RequestParameters
<requestParameters format="String">
<requestParameter>
<name>userId</name>
<tag>userId</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>_userid</mapping><!--mappingto field -->
</requestParameter>
….
这里定义了Web Service方法RequestParameter的格式,可以有XML,JSON及STRING(通过URL QueryString)三种格式;随后是各个RequestParameter的具体定义,可以有0到多个RequestParameter。
RequestParameter定义中:
name为parameter的名字,
tag为parameter在XML,JSON及URL中输入时的tag,通常和name保持一致,
type为parameter的类型,可以是text或numeric,double,float,integer,int或digital,
required为parameter是否必须,如果为1,y,t,yes或true,则此parameter不许为空,
mapping为parameter作为下一步ServiceOperation输入参数时的参数名称。
4. ServiceOperations
<serviceOperations name="{call sp_checkSession(?,?,?) }"
format="sp">
<operationParameter>
<name>_userid</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>userId</mapping>
</operationParameter>
这里定义了Web Service方法要进行的ServiceOperation,格式可以是SP,name就是调用SP的语句,包括sp名称;或者java,则name就是要执行的java方法的包名及类名;如果此java方法有参数,则name以@@结尾。
下面ServiceOperations的各个operationParameter定义。可以有0到多个参数:
name为parameter的名字,
mode为parameter的模式,IN,OUT或INOUT
type为parameter的类型,因为此类型可能要对应到数据库参数类型,所以有CHAR,VARCHAR,FLOAT,DOUBLE,INTEGER,BIGINT,JAVA方法,可以都填VARCHAR
preprocess为parameter的预处理,目前有以下几种:
trim,
tolowercase,
touppercase,
md5,
sha1或sha-1,
base64,
decode(base64 decode),
uuid(随机UUID字符串,value为长度,如果value为空,缺省长度为16),
hex(随机16进制字符串,value为长度,如果value为空,缺省长度为16),
random(随机字符串,value为长度,如果value为空,缺省长度为16),
ip,
format(?),其中?为一整数,对value取证到?位,
hex(?),其中?为一整数,对value转换到16进制?位。
mapping为parameter mapping到Request Parameter的名字,此parameter会取相应的RequestParamter的值;
如果mapping字符串包含.,则为mapping到java方法取值,如果mapping字符串中不包含(…),则为Java方法无参调用;否则,为有参java方法调用,mapping字符串中方法名后括号中的字符串为参数列表,多个参数以@@分隔,参数名 mapping到RequestParamter取值。
5.ResponseOutput
<responseOutput format="xml">
<outputParameter>
<name>Success</name>
<tag>Success</tag>
<mapping>NULL</mapping>
</outputParameter>
这里定义的是Web Service方法返回的格式,有XML,JSON和STRING,以及参数,可以有1到多个参数,其中参数name为errorcode的若值为0,表示成功,其余值表示失败:
Outputparameter定义中:
name 为parameter名,
tag为parameter显示在XML,JSON或String中的tag,通常和name保持一致,多级tag中间加.,例如<output><time>这种tag,应设定为output.time,
mapping为parametermapping到ServiceParameter或RequestParameter的名字,
如果mapping字符串为不含.则为参数取值,NULL表示空值,其余表示mapping到Service Parameter或Request Parameter取值;
若mapping字符串包含.,则为mapping到java方法取值,如果mapping字符串中不包含(…),则为Java方法无参调用;否则,为有参java方法调用,mapping字符串中方法名后括号中的字符串为参数列表,多个参数以@@分隔,参数名 mapping到RequestParamter或ServiceParameter取值。
五、Service代码开发
由于web service的代码已经根据配置文件自动生成了,所以这里的代码开发实际上指的是为了实现web service的特定功能,需要通过反射机制调用的一些java方法的实现。
例如,<serviceOperationsname="ServiceImpl.SampleService@@"
format="java">
此处定义Web Service的serviceOperationsformat为java,那么我们就需要实现其name中指定的class及方法,如本例中,要实现ServiceImpl class中的SampleService方法。具体方法及参数定义可见前面Web Service XML Configure文件的解释。
再比如:<outputParameter>
<name>sellCountList</name>
<tag>NULL</tag>
<mapping>ServiceImpl.getBeeSellCountList</mapping>
</outputParameter>
此处定义此输出参数mapping到ServiceImpl类中的getBeeSellCountList方法,那么我们就需要实现ServiceImpl class中的getBeeSellCountList方法。具体方法及参数定义可见前面Web Service XML Configure文件的解释。
要注意的是,定义在指定class中的方法都必须是静态方法,而且参数顺序要和Web Service XML configure中定义一致。同一个class中的方法名及调用参数必须唯一。这些class文件的缺省路径在E:\java\Tomcat7022\conf\WSClass,也可以在web service的configure文件中指定为conf目录下不同的活页夹作为class folder。
六、Web Service开发实例
此处给出一个simpleService的properties文文件实例和三个实际的Web Service的XML configure 文件的实例。
1. simpleService.properties
sevice.version=1.0
service.name=simpleService
service.debug=true
service.datasource=hiverService
service.classfolder=WSClass
Mapping2JavaMethod= ServiceImpl.simpleService
Parameters=para1,para2,para3
2. login.xml
<?xml version="1.0" encoding="UTF-8"?>
<service name="login" tag="loginCommand"version="1.0" debug="true" datasource="hiver"classfolder="WSClass">
<errormessageList>
<errormessage>Your account is locked.</errormessage>
<errormessage>Fail to pair your account.</errormessage>
<errormessage>API version is incorrect.</errormessage>
</errormessageList>
<!--request parameter -->
<requestParametersformat="xml">
<requestParameter>
<name>name</name>
<tag>name</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>myaccount</mapping><!--mappingto field -->
</requestParameter>
<requestParameter>
<name>password</name>
<tag>password</tag>
<type>text</type>
<required>Yes</required>
<mapping>psw</mapping>
</requestParameter>
</requestParameters>
<serviceOperations name="{callsp_login(?,?,?,?,?,?,?,?,?,?,?) }"
format="sp">
<operationParameter>
<name>myaccount</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>name</mapping>
</operationParameter>
<operationParameter>
<name>psw</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>md5</preprocess>
<mapping>password</mapping>
</operationParameter>
<operationParameter>
<name>mysessionid</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>mysessionid</mapping>
</operationParameter>
<operationParameter>
<name>myaccountname</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>Name</mapping>
</operationParameter>
<operationParameter>
<name>myemail</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>email</mapping>
</operationParameter>
<operationParameter>
<name>myphone</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>phone</mapping>
</operationParameter>
<operationParameter>
<name>myareas</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>areas</mapping>
</operationParameter>
<operationParameter>
<name>myWMD</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>wmd</mapping>
</operationParameter>
<operationParameter>
<name>myjoindate</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>joindate</mapping>
</operationParameter>
<operationParameter>
<name>myGender</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>Gender</mapping>
</operationParameter>
<operationParameter>
<name>errorcode</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>errorcode</mapping>
</operationParameter>
</serviceOperations>
<responseOutputformat="xml">
<outputParameter>
<name>sessionID</name>
<tag>sessionID</tag>
<mapping>mysessionid</mapping>
</outputParameter>
<outputParameter>
<name>userInfo</name>
<tag>NULL</tag>
<mapping>com.hiver.service.nda.ServiceUtility.getUserInfo(myaccountname@@myemail@@myphone@@myareas@@myWMD@@myjoindate@@myGender)</mapping>
</outputParameter>
</responseOutput>
</service>
3.beeCommission.xml
<?xml version="1.0" encoding="UTF-8"?>
<service name="beeCommssion"tag="beeCommssionCommand" version="1.0" debug="true"datasource="hiver" classfolder="WSClass">
<errormessageList>
<errormessage>Your account is locked.</errormessage>
<errormessage>Fail to pair your account.</errormessage>
<errormessage>API version is incorrect.</errormessage>
</errormessageList>
<!--request parameter -->
<requestParameters format="xml">
<requestParameter>
<name>SessionID</name>
<tag>sessionID</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>_sessionid</mapping><!--mappingto field -->
</requestParameter>
<requestParameter>
<name>StartDate</name>
<tag>startDate</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>StartDate</mapping><!--mappingto field -->
</requestParameter>
<requestParameter>
<name>EndDate</name>
<tag>endDate</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>EndDate</mapping><!--mappingto field -->
</requestParameter>
</requestParameters>
<serviceOperations name="{call sp_checkSession(?,?,?) }"
format="sp">
<operationParameter>
<name>_sessionid</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>SessionID</mapping>
</operationParameter>
<operationParameter>
<name>beeid</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>beeid</mapping>
</operationParameter>
<operationParameter>
<name>errorcode</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>errorcode</mapping>
</operationParameter>
</serviceOperations>
<responseOutput format="xml">
<outputParameter>
<name>beeCommission</name>
<tag>NULL</tag>
<mapping>ServiceImpl.getBeeCommission(beeid@@StartDate@@EndDate)</mapping>
</outputParameter>
</responseOutput>
</service>
4. javaMethod.xml
<?xml version="1.0"encoding="UTF-8"?>
<servicename="JavaMethod" tag="JavaMethod" version="1.0"
debug="true"datasource="hiver" classfolder="WSClass">
<errormessageList>
<errormessage>Your account islocked.</errormessage>
<errormessage>Fail to pair youraccount.</errormessage>
<errormessage>API version isincorrect.</errormessage>
</errormessageList>
<!--request parameter -->
<requestParametersformat="String">
<requestParameter>
<name>userId</name>
<tag>userId</tag><!--tag -->
<type>text</type><!--type -->
<required>Yes</required><!--isRequired -->
<mapping>_userid</mapping><!--mapping to field -->
</requestParameter>
<requestParameter>
<name>orderTime</name>
<tag>orderTime</tag>
<type>text</type>
<required>Yes</required>
<mapping>_ordertime</mapping>
</requestParameter>
</requestParameters>
<serviceOperationsname="ServiceImpl.SampleService@@"
format="java">
<operationParameter>
<name>_userid</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>userId</mapping>
</operationParameter>
<operationParameter>
<name>_ordertime</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>orderTime</mapping>
</operationParameter>
<operationParameter>
<name>errorcode</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>errorcode</mapping>
</operationParameter>
<operationParameter>
<name>JavaReturn</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>_userid</mapping>
</operationParameter>
<operationParameter>
<name>JavaTime</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>_ordertime</mapping>
</operationParameter>
</serviceOperations>
<responseOutputformat="xml">
<outputParameter>
<name>Success</name>
<tag>Success</tag>
<mapping>NULL</mapping>
</outputParameter>
<outputParameter>
<name>Return</name>
<tag>Out.Return</tag>
<mapping>JavaReturn</mapping>
</outputParameter>
<outputParameter>
<name>Time</name>
<tag>Out.Time</tag>
<mapping>JavaTime</mapping>
</outputParameter>
</responseOutput>
</service>
七、注意事项
1. 数据源加载失败的话,会缺省加载tomcat conf目录下的jdbc_ws.properties
2. 定义在Web Service properties中作为Service mapping及XML配置文件中作为parameter mapping的Java方法,必须是public和static,返回字符串;
3. 定义在XML配置文件中作为Service Operation mapping的java方法,七返回类型为List<String>,其值依次为各个Service Operation输出参数的取值。
4. Tomcat conf目录下WSConfigure活页夹中的所有properties和xml文件,都会被当成service配置文件而加载,只要其中有一个Debug为true,整个Service就会重新生成,编译和自动部署发布。当系统正式运行后,可以把所有的service中的Debug配置的改为false,以提高Web Service的访问效率。
全部代码及测试工程可到我的资源中下载。
-
渡一教育公开课web前端开发JavaScript精英课学习笔记(五)函数及预编译
2019-01-24 08:42:06被调用时执行的可重复使用的代码块。 函数定义 <script type = "text/javascript"> //函数的定义方式,命名方式要遵循小驼峰形式。 function funcName(){ var a = 1; document.write(a); } ... -
-
静态Web开发 JavaScript
2015-07-29 15:51:00静态Web开发 JavaScript 三章 Javascript 1节javascript基本语法和注意事项 脚本,一条条的文字命令。执行时由系统的一个解释器,将其一条条的翻译成机器可识别的指令,然后执行。(不需要编译)... -
Flutter Web开发 浏览器运行
2020-12-30 16:13:18新建Flutter 工程,默认只支持Android,iOS,可以通过命令行配置运行Web ...如果配置成功并且电脑上有Chrome浏览器,在可调试工具即可看到Chrome(web),选择Chrome然后运行编译便会打开host的Flutter网页 ... -
-
MFC对话框使用CEF浏览器内核vs2012可编译运行
2019-07-11 18:19:18非常简单的一个实例,可在此基础上开发自己的作品。 CEF功能强大 但使用起来比 Web Browser 复杂的多,而且它的官方例子 cefsimple 和 cefclient 都是使用 Win32 API 开发的,这给大家...vs2012及更高版本可编译运行。 -
web-developer-site:web开发网站汇总-源码
2021-02-20 09:08:14编译原理:parser,语义分析,代码优化,类型推导,静态检查,机器代码 工具: zabbix-Zabbix是由Alexei Vladishev开发的一种网络监视,管理系统,基于服务器-客户端架构。可用于监视各种网络服务,服务器和网络... -
【WEB】web开发基础知识整理(3)
2018-11-06 22:40:33WEB开发技术基础知识整理(3) 第三部分——JavaScript 简介 直译客户端脚本语言,不需要预编译,浏览器直接解释运行。 动态,跨平台,等等…… HTML定义用户互交事件,当事件发生时可执行指定JS代码 ECMAScript,... -
使用CGI规范进行WEB开发
2020-11-02 13:46:452: 编译为可执行程序 不可直接修改 编译后是可执行程序 不允许直接修改 只能通过反汇编工具进行修改 但是可以通过就加壳技术提高安全性 3: 高扩展性 C语言开发CGI可以像开发普通应用程序那样调用系统库 也可调用第... -
Goweb开发框架ecgo.zip
2019-07-19 08:47:54ecgo 是一个易学、易用、易扩展的go web开发框架。核心功能包括:自动规则路由,支持RESTfulrequest的二次封装可以直接使用格式化的Get,Post,Cookie,Session等变量来处理请求数据方便的上传文件操作response二次... -
(二)搭建Java Web开发环境
2021-01-13 12:00:10JDK和JRE是在Java环境下进行开发所必不可少的,只有很好地掌握它们的配置与使用方法,才能进行以后的Java Web开发。 Tomcat服务器是当今进行Java Web开发使用最广泛的Servlet/JSP服务器。这是因为它运行稳定、性能... -
小谈springboot web开发
2019-07-28 21:28:56背景 从出道以来两年半许,记得从在学校学习的JSP,再到前后端分离,再到现在公司自己想的的html混合开发。从技术栈角度分析:JSP:...接下来从编译的角度简单分析一下:JSP-----实际编译为servlet文件执行,可直接... -
痉挛:用D编写可编译为Webassembly的单页应用程序-源码
2021-02-05 05:37:22Spasm是一个库,用于在D中开发可编译为Webassembly的单页应用程序。 它包含对最常用的Web api的绑定,包括dom,fetch,audio和webgl。 以及一个很小但功能强大的SPA框架,其中包括CSS。 是。 CSS-in-wasm。 目录... -
vs2015 web开发_Web设计人员和开发人员的新鲜资源(2015年7月)
2020-06-07 00:08:35Web开发人员很幸运,他们在网上找到了免费的工具和资源,我们每个月都会在我们的“新鲜资源”系列中尽职收集这些工具和资源。 如果您错过了上个月的批处理,请在此处重新访问,或查看今年初编译的其余新资源 。 ... -
浅谈Web开发中的定时任务
2016-09-05 20:47:29曾经做过Windows server下的定时任务的业务,最近又做了一些Linux下使用...比如:你开发了一个Windows可执行程序,并将其编译成demo.exe,然后你需要该任务每到特定的时间都自动进行执行... 步骤1:打开"开始" -> -
Go语言的几个Web开发框架
2019-09-16 05:10:41对比下来,Revel的资料还是比较多...Revel Web开源框架是一个高效的Go语言Web开发框架, 其思路完全来自 Java 的 Play Framework。https://github.com/robfig/revel特点:热编译,简单可选,同步(每个请求都创建自己... -
全栈:家庭作业(全栈Web开发示例)-源码
2021-02-18 18:59:57完整的Web开发),AyrıcaLarvel,Vue,Vuex的项目。 格里克西尼姆勒 MySQL 5.7以上 PHP 7.3以上 节点JS 作曲家 Proje'nin当地OrtamaKurulması git clone git@github.com:ozgunz/full-stack.git .env.... -
C#Web应用开发项目源码及教程
2018-02-02 06:49:02C#Web应用开发项目源码及PPT教程,,可在VS2008~VS2017下直接编译运行 -
IDEA大法好之开发编译热加载
2018-01-09 17:59:06今天用springboot和vue.js通过gradle搭了一个项目,写的...然后想了想不用springboot的开发web的时候可以update classes and resources,用了springboot可不可以这么做呢,我注意到run这个选项卡里面有一个reload chan -
bootplus:流畅,直观,功能强大的Google风格的前端框架,可更快,更轻松地进行Web开发-源码
2021-01-28 17:53:38Bootplus是一个前端框架,可根据创建和维护的最新Google+外观启发更快,更轻松地进行Web开发。 Bootplus基于要开始使用,请访问 ! 快速开始 提供三个快速入门选项: 。 克隆仓库: git clone git://github.... -
16 款优秀的Web开发辅助工具推荐
2013-11-09 14:16:38本文整理了16款重要的Web开发工具,涵盖CSS、JavaScript、图像优化和其他方面的Web开发工作,希望对你的开发工作能有所帮助。 一、CSS工具 1. Simpless 这是一个免费的离线LESS代码编译器。如果你... -
mimogear:Mimogear:完整的静态网站生成器和Web开发样板-源码
2021-02-03 16:47:21Mimogear是用于开发静态站点的完整的Web开发样板。 装在Mimogear中,您会找到 , 和样板,以帮助您入门。 对于任何静态站点来说,新手和专业人员都将拥有一个良好的开端! 只需运行gulp构建! 强调 特征 概要 Gulp...
-
yum是干什么的
-
记录JAVAMail发送附件的坑
-
基于公路交通速度数据的减少冗余和节假日速度预测
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
机器学习
-
Java - JDBC
-
使用vue搭建微信H5公众号项目
-
Flutter | 布局组件
-
代码创建addressables Group
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
libFuzzer视频教程
-
.NET中的委托
-
Jdk和Cglib的动态代理对象
-
fcn内网穿透MAC版
-
Ubuntu的搜狗输入法终端重启
-
HadoopHama项目–BSP模型的实现
-
零基础极简以太坊智能合约开发环境搭建并开发部署
-
MySQL 存储过程(创建海量数据实验环境)
-
Gstreamer之gst_buffer_map()用法(十七)
-
Jmeter-plugins-manager下载安装和使用