axis2之webservice
Axis2之webservice超详细教程
Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术,本教程是主要阐述如何构建一个基本的Axis2 webservice应用,里面的许多环节高手可直接略过,本教程完全针对新手。
一、环境安装
安装myeclipse
下载地址: http://www.xlpan.com/file/4238159/48030981-6b56-40a4-a93b-8f424ee4f33a
安装mysql
下载地址:http://www.xlpan.com/file/4238159/de64cf2f-4217-4e11-bb98-8e6c5dd24155
安装mysql-workbench(mysql可视化工具)
下载地址:http://www.xlpan.com/file/4238159/becf913f-56a6-4d68-b248-134113b73535
安装tomcat
下载地址:
http://www.xlpan.com/file/4238159/ec6a2250-99ff-464e-a978-be184c96e4e7
下载Axis2服务包
下载地址: http://www.xlpan.com/file/4238159/bb3db6e3-2f7d-4343-b472-c1fa714dba95
下载Axis2开发插件包
下载地址: http://www.xlpan.com/file/4238159/aa39505f-079b-43be-9479-15a2d3e98cbb
安装jdk
下载地址: http://www.xlpan.com/file/4238159/7ba342f9-277f-4b9c-b5e7-b0c5b7dfc151
二、环境配置
1) Java环境配置
a) 设置JAVA_HOME
图1.
图2
设置JAVA_HOME= D:\Program
Files\Java\jdk1.6.0_10
*
D:\Program Files\Java\jdk1.6.0_10为笔者本机的JDK安装目录,请开发者根据实际安装路径来填写,注意环境变量最后面不能加分号,D:\Program
Files\Java\jdk1.6.0_10;这么写是错误的。
b)
设置CLASSPATH
图1
设置CLASSPATH= .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
* 要加.表示当前路径
c)
设置path
设置path=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
2)
tomcat环境配置
a)
设置CATALINA_HOME
CATALINA_HOME=F:\apache-tomcat-6.0.30
*
F:\apache-tomcat-6.0.30为笔者本机的JDK安装目录,请开发者根据实际安装路径来填写。
b)
测试Axis2服务包
将axis2服务包(axis2.war)放入F:\apache-tomcat-6.0.30\webapps下
点击F:\apache-tomcat-6.0.30\bin下的startup.bat文件
在浏览器中输入 http://localhost:8080/axis2/
若出现图中所示页面,那么说明axis2的服务包已经发布成功了;
在F:\apache-tomcat-6.0.30\webapps目录下会自动生成一个axis2文件夹,这个留待后面的说明中一并叙述,下面继续配置。
3)
myeclipse环境配置
a)
配置axis2插件包
将axis2插件包下的Axis2_Codegen_Wizard_1.3.0和Axis2_Service_Archiver_1.3.0文件夹拷贝至Myeclipse8.5\dropins
目录下
点击FileàNewàOther
若出现图中2个高亮显示的插件名,那么说明Axis2开发插件已经安装成功。
b)
myeclipse下的tomcat配置
点击WindowàPreferences
点击MyEclipseàServersàTomcat, 选择Configure
Tomcat 6.x
按照图中所示配置tomcat
c)
myeclipse下的jre配置
点击JavaàInstalledJREs,点击Search按钮,选择D:\Program Files\Java\jdk1.6.0_10路径(开发者根据实际路径自己调整)
如图中所示进行配置,点击OK
4)
Mysql数据配置
a)
数据库安装配置
实例配置时,笔者选择的是服务器。
服务器字符集选择的是utf-8
数据库连接设置为:
用户名:root
密码:123456
b)
测试数据库建立
笔者采用的是可视化工具建库(mysql-workbench-gpl-5.2.37-win32)
打开mysql-workbench
点击图中标注的按钮,新建一个库
新建库名为webservice
新建student表,建表语句如下
DROP CREATE `id` int(11) NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, `name` varchar(45) DEFAULT NULL, `tel` varchar(45) DEFAULT NULL, `address` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB LOCK INSERT UNLOCK |
双击左侧webservice库名,将其设为默认库,默认库的名字会加粗显示,如果不设置默认库,会影响下面的数据导入。
将建表语句复制进来,执行;
数据导入成功。
三、
正式开发
1)
服务端开发
a)
工程建立
打开myeclipse
点击NewàWeb Project新建一个Web工程
新建工程名为myservice,一直默认执行。
右键点击工程,右键菜单里选择Properties,将工程编码设置为UTF-8
b)
编写mysql数据库访问功能模块
将mysql的连接驱动包(mysql-connector-java-5.1.7-bin.jar)拷贝至WebRoot\WEB-INF\lib下
在src目录下新建一个database包,分别录入以下4个类,因为牵涉到jdbc封装类的开发,这里就不详细阐述,仅贴出源代码。
(一)
ConnectionFactory.java (连接工厂类)
package database; import java.sql.Connection; import java.sql.DriverManager; import java.util.ResourceBundle; /** 类名:ConnectionFactory<br> * 作用:产生数据库连接对象<br> * 属性:<br> * 方法:Connection * 作用:返回数据库连接对象<br> * 参数:无<br> * 返回:数据库连接对象<br> * 其它:返回的aConnection不会自动提交JDBC事务<br> * 创建人:陶尚明<br> * */ public abstract class ConnectionFactory { /** 数据库系统的属性文件名: */ private static final String propertiesFileName = "using_which_dbms"; /** 获取Connection对象 * * @return Connection对象 * @throws Exception SqlException异常 */ static synchronized public Connection getConnection() throws Exception { String dbSystem=null; Connection aConnection; ResourceBundle db = ResourceBundle.getBundle("dbsystem"); //读取配置文件 dbSystem=db.getString(propertiesFileName); ResourceBundle rb = ResourceBundle.getBundle(dbSystem); //读取配置文件 Class.forName(rb.getString("database.driver")).newInstance(); aConnection = DriverManager.getConnection(rb.getString("database.url"),rb.getString("database.username"),rb.getString("database.password")); //创建aConnection对象 aConnection.setAutoCommit(false); //设置不自动提交事务 return aConnection; //返回aConnection对象 } /** 当前使用的数据库系统名称 * * @param echoable 如果启用回显将在控制台输出描述当前数据库系统的信息 * @return dbSystem 数据库系统名称 */ public static String getCurrentDBMS(boolean echoable) { String dbSystem=null; ResourceBundle rb = ResourceBundle.getBundle("dbsystem"); //读取配置文件 dbSystem=rb.getString(propertiesFileName); if (echoable)System.out.println("the database system return dbSystem; } } |
(二)
IOperationCore.java(数据库操作接口)
/** * 数据库常用操作封装 */ package database;
import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection;
/** 类名:IOperationCore<br> * * 作用: 该接口封装了数据库操作的大部分方法<br> * * 创建人:陶尚明<br> */ public interface IOperationCore { /** sql更新语句 * * @param * @return 返回一个<code>ResultSet</code>结果集 * * @exception ResultSet /** * sql更新语句 * * @param * @return 更新数据库影响行数 * * @exception int /** * 读取行个数 * * @param * @return * * @exception int /** * 读取列数个数 * * @param * @return * * @exception int /** * 读取列名 * * @param columIndex * @param * @return * * @exception String /** * 读取queryString查询结果集<code>ResultSet</code>表中的所有列名 * * @param * @return 表中的所有列名 * @throws /** * 读取queryString查询结果集<code>ResultSet</code>表中的所有字段类型名称 * * @param * @return 表中的所有字段类型名称 * @throws /** * 获取ResultSet二维表中指定位置的值,目前只支持mysql * * @param rowIndex 行索引 * @param * @param * @return 指定位置的数据记录 * * @exception Object /** * 释放系统连接资源 * <br>一旦关闭,数据库的操作将全部无效 * @exception void dispose()
} |
(三)
OperationCoreImpl.java(数据库操作接口实现)
package database; import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; /** 类名:OperationCoreImplements<br> * * 作用: 该类实现IOperationCore接口的所有方法<br> * * 创建人:陶尚明<br> * */ public class OperationCoreImpl implements protected Connection aConnection = null; protected Statement aStatement = null; protected ResultSet aResultSet = null; protected ResultSetMetaData rsmd = null; protected static OperationCoreImpl m_instance = null; /** Singleton 即单例(态)模式,用来生成对象唯一实例的方法 * * @return OperationCoreImplements的一个实例 * @throws Exception */ public static OperationCoreImpl createFactory() throws Exception { if(m_instance==null) m_instance=new OperationCoreImpl(); return m_instance; } /** @exception Exception */ private OperationCoreImpl() throws Exception { init(); } /** * 负责初始化Connection连接 * @throws Exception */ private void init() throws Exception{ aConnection=ConnectionFactory.getConnection(); } /** * 释放系统连接资源 *<br>一旦关闭,数据库的操作将全部无效 */ public void dispose() { try { if(aResultSet!=null) aResultSet.close(); } catch (SQLException e) { e.printStackTrace(); } try { if(aStatement!=null) aStatement.close(); } catch (SQLException e) { e.printStackTrace(); } try { if(aConnection!=null) aConnection.close(); } catch (SQLException e) { e.printStackTrace(); } } /** sql更新语句 * * @param queryString 查询语句 * @return 返回一个<code>ResultSet</code>结果集 * * @exception SQLException */ public ResultSet executeQuery(String queryString) { try { aStatement = aResultSet = } catch (SQLException e) { aResultSet=null; e.printStackTrace(); } return aResultSet; } /** * sql更新语句 * * @param updateString 数据库更新语句 * @return 更新数据库影响行数 * * @exception SQLException */ public int executeUpdate(String updateString) { int effectedRows=0; try{ aConnection.setAutoCommit(false); aStatement = effectedRows = aConnection.commit(); }catch(SQLException ex){ System.out.println("数据库写操作失败!"); if(aConnection!=null) { try { aConnection.rollback(); System.out.println("JDBC事务回滚成功"); } catch (SQLException System.out.println("JDBC事务回滚失败"); e.printStackTrace(); } } } return effectedRows; } /** * 读取queryString查询结果集<code>ResultSet</code>表中的所有列名 * * @param queryString 用于返回<code>ResultSet</code>结果集的语句 * @return 表中的所有列名 * @throws SQLException */ public Collection<String> getColumnNames(String queryString) { ArrayList<String> ColumnNames=new try { aResultSet=executeQuery(queryString); ResultSetMetaData int j=rsmd.getColumnCount(); for(int k=0;k<j;k++){ ColumnNames.add(rsmd.getColumnName(k+1)); } } catch (SQLException e) { ColumnNames=null; e.printStackTrace(); } return ColumnNames; } /** * 读取queryString查询结果集<code>ResultSet</code>表中的所有字段类型名称 * * @param queryString 用于返回查询结果集的语句 * @return 表中的所有字段类型名称 * @throws SQLException */ public Collection<String> getColumnTypeNames(String queryString) ArrayList<String> ColumnNames=new try { aResultSet=executeQuery(queryString); ResultSetMetaData int j=rsmd.getColumnCount(); for(int k=0;k<j;k++){ ColumnNames.add(rsmd.getColumnTypeName(k+1)); } } catch (SQLException e) { ColumnNames=null; e.printStackTrace(); } return ColumnNames; } /** * 读取列名 * * @param columIndex 列索引 * @param queryString 提供ResultSet二维表的查询字符串 * @return ResultSet表中的指定的列名 * * @exception SQLException */ public String getColumnName(int columIndex, String queryString) { String columnName=null; try { aResultSet=executeQuery(queryString); rsmd=aResultSet.getMetaData(); columnName=rsmd.getColumnName(columIndex } catch (SQLException e) { e.printStackTrace(); } return columnName; } /** * 读取列数个数 * * @param queryString 查询语句 * @return Transact-SQL 查询后的虚拟表的列数 * * @exception SQLException */ public int getColumnCount(String queryString) { int columnCount=0; try { aResultSet=executeQuery(queryString); ResultSetMetaData columnCount = rsmd.getColumnCount(); } catch (SQLException e) { e.printStackTrace(); } return columnCount; } /** * 读取行个数 * * @param queryString 查询语句 * @return Transact-SQL 查询后的虚拟表的行数 * * @exception SQLException */ public int getRowCount(String queryString) { int rowCount=0; try { aResultSet=executeQuery(queryString); while(aResultSet.next()) rowCount=aResultSet.getInt(1); } catch (SQLException e) { e.printStackTrace(); } return rowCount; } /** * 获取ResultSet二维表中指定位置的值,目前只支持mysql * * @param rowIndex 行索引 * @param columnIndex 列索引 * @param queryString 产生一个ResultSet结果集的查询语句 * @return 指定位置的数据记录 * * @exception SQLException */ public Object getValueAt(int rowIndex, int columnIndex, String Object values=null; try { aResultSet=executeQuery(queryString); //指针下移一行 aResultSet.absolute(rowIndex + 1); values=aResultSet.getObject(columnIndex } catch (SQLException e) { e.printStackTrace(); } return values; } } |
(四)
DBOperationAdapter.java (对用户透明的数据库操作类)
package database; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; /** 类名:DBOperationAdapter<br> * 作用: * * 说明:该类使用了<b>Adapter</b> * 类自身为Adpater,OperationCoreImplements为Adapte类;<br> * 实例化类自生对象的时候用到了Singleton模式,<br> * 即<code>DBOperationAdapter.getInstance()</code><br> * 创建人:陶尚明<br> */ public class DBOperationAdapter extends private static private static private try { objIOperationCore=OperationCoreImpl.createFactory(); } catch (Exception e) { e.printStackTrace(); } } public static if(m_instance==null) m_instance=new DBOperationAdapter(); return m_instance; } /** sql更新语句 * * @param * @return 返回一个<code>ResultSet</code>结果集 * * @exception public return } /** sql更新语句 * * @param * @return 更新数据库影响行数 * * @exception public int return } /** sql删除语句:updateString * * @param * @return 删除数据影响行数 * * @exception public int return } /** sql插入语句:insertString * * @param * @return 插入数据影响行数 * * @exception public int executeInsert(String return } /** * 读取行个数 * * @param * @return * * @exception public int return } /** 读取列数个数 * * @param * @return * * @exception public int return } /** * 读取列名 * * @param * @param * @return * * @exception public String return } /** * 读取queryString查询结果集<code>ResultSet</code>表中的所有字段类型名称 * * @param * @return 表中的所有字段类型名称 * @throws public return } /** * 读取queryString查询结果集<code>ResultSet</code>表中的所有列名 * * @param * @return 表中的所有列名 * @throws public return } /** * 获取ResultSet二维表中指定位置的值,目前只支持mysql * * @param * @param * @param * @return 指定位置的数据记录 * * @exception public Object return } /** * 释放系统连接资源 * <br>一旦关闭,数据库的操作将全部无效 * @exception public void objIOperationCore.dispose(); } } |
(五)
编写数据库配置属性文件
dbsystem.properties
using_which_dbms=mysql |
mysql.properties
# mysql # DB System #================================================= database.driver=com.mysql.jdbc.Driver database.url=jdbc:mysql://127.0.0.1:3306/webservice database.username=root database.password=123456 |
其中数据库连接地址请各位根据实际情况酌情修改
如上图所示,数据库访问功能模块至此已经编写完毕。
c)
编写业务模块
(一) 简单java实体类的建立
在src目录下新建一个entity包,下面有一个Student类,与数据库中的student表对应起来
Student.java
package entity; import java.io.Serializable; /* * 学生实体对象 * */ public class Student implements Serializable{ private static final long serialVersionUID = private int id; private int number; private String name; private String tel; private String address; /** * @return the id */ public int getId() { return id; } /** * @param id the */ public void setId(int id) { this.id = id; } /** * @return the */ public int getNumber() { return number; } /** * @param number */ public void setNumber(int number) { this.number = number; } /** * @return the */ public String getName() { return name; } /** * @param name */ public void setName(String name) { this.name = name; } /** * @return the tel */ public String getTel() { return tel; } /** * @param tel the */ public void setTel(String tel) { this.tel = tel; } /** * @return the */ public String getAddress() { return address; } /** * @param address */ public void setAddress(String address) { this.address = address; } /** * @return the serialversionuid */ public static long getSerialversionuid() { return serialVersionUID; } public String toString() { return this.id +"#"+this.number+"#"+ this.name +"#"+this.tel+"#"+this.address; } } |
注意此Student类实现了可序列化接口,否则无法正常传输至客户端
(二)Service发布类的编写(核心部分!!!!!!)
在src目录下新建一个entity包,下面有一个TestService类
TestService.java
package service; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import database.DBOperationAdapter; import entity.Student; /* * WebService测试类 */ public class TestService { //返回学生列表信息 public Student[] queryStudents() { DBOperationAdapter Student st = null; List<Student> retList = new try { ResultSet rs=dbtools.executeQuery("select * from student"); while(rs.next()){ st = new Student(); st.setId(rs.getInt(1));//设置学生ID st.setNumber(rs.getInt(2));//设置学生学号 st.setName(rs.getString(3));//设置学生姓名 st.setTel(rs.getString(4));//设置学生电话 st.setAddress(rs.getString(5));//设置学生住址 retList.add(st); } } catch (SQLException e) { e.printStackTrace(); } return retList.toArray(new Student[0]); } //测试欢迎方法 public String getGreeting(String { return "你好"+name; } } |
这个类是专门用来发布服务的,对外开放了2个接口方法:queryStudents和getGreeting方法,
其中特别注意queryStudents方法返回值是自定义对象类型(Student)的对象数组,因为webservice不支持
复杂的集合类传递,譬如list和map,需要转化为数组类型或者axis2里的axiom对象模型。这里是转化为
数组类型,axiom对象模型感兴趣的同学可搜索资料进一步学习,这里篇幅所限,不再进行赘述。
d)
发布服务
在左侧视图点击鼠标右键,选择NewàOther
选择Axis2
Service Archiver
打包编译文件选择myservice工程下\myservice\WebRoot\WEB-INF\classes目录,记得红色标记处的勾选取消掉。
略过wsdl文件选择
将\myservice\WebRoot\WEB-INF\lib 目录下的mysql-connector-java-5.1.7-bin.jar文件
一并打包进来,否则服务无法正常访问mysql数据库
自动设置service.xml配置文件
填写需要发布的webservice名称以及对外开放的服务类名称,服务类名称前面要带包名,
勾选Search declared method only,可以在下面的列表框中看见我们对外发布的方法名。
将打好的aar包发布至tomcat的\webapps\axis2\WEB-INF\services下
点击Run Server启动Tomcat服务
在浏览器中输入:http://localhost:8080/axis2/services/listServices 出现如上图所示页面,红色标注的就是我们自己发布的服务,
点击MyService链接
显示发布服务的wsdl文件
浏览器中输入:http://localhost:8080/axis2/services/MyService/getGreeting?name=guoxingquan
调用getGreeting方法,并传入一个
字符参数,返回欢迎语。
浏览器中输入:http://localhost:8080/axis2/services/MyService/queryStudents 调用queryStudents方法,从数据库中查询学生列表信息
2)
客户端开发
客户端开发使用了一个struts2工程,struts2工程如何建立不再赘述,我们直接导入myclient工程
源代码下载地址请参考教程的最后部分的附件一览。
导入myclient工程
上图中高亮显示的几个文件是需要重点说明的
a)
Wsdl文件生成
在左侧视图中点击NewàOther,选择上图所示高亮部分选项
如上图选择
填入之前我们服务端开放的类名,包括包路径,点击Add Folder,将服务端工程的编译文件输出文件夹
加入进来,点击Test Class Loading,继续下一步
注意我们之前发布的服务名称为MyService,请填写正确,继续下一步
继续下一步,完毕
b)
根据Wsdl文件生成客户端用户存根
在左侧视图中点击NewàOther,选择上图所示高亮部分选项
继续下一步
选择我们刚才生成wsdl文件,注意路径正确
注意红色部分,自动生成的代码会直接放在service包下
如上图进行选择
直接下一步,配置完毕
自动生成的代码为MyServiceCallbackHandler.java和MyServiceStub.java,其中我们这个工程里用到的只有
MyServiceStub.java,这个是根据服务器端在客户端生成的存根代码,自动封装了一系列远程调用配置,以及
对象类型以及方法的转换,大大节约了开发人员的工作量;MyServiceCallbackHandler.java主要牵涉到一系列回调,
感兴趣的同学可以进一步研究,这里不再进行说明。
c)
业务调用代码
FindstudentsAction.java
package com; import import import import import public class public String execute() throws Exception //设置远程服务调用地址 String target = try { //根据地址构造用户存根 MyServiceStub stub = new //调用查询学生列表方法 MyServiceStub.QueryStudentsResponse //返回学生类型对象数组 Student[] sts = //将数组输出至前台页面 ActionContext.getContext().getSession().put("sts", } catch (RemoteException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return SUCCESS; } } |
d)
运行代码
选择Add Deployment发布服务
选择myclient来进行发布
点击Run Server来启动服务
在浏览器中输入:http://localhost:8080/myclient/ 点击学生
客户端调用学生查询方法成功。
四、
附件一览
webservice源代码下载地址:
http://www.xlpan.com/file/4238159/cb8cd3f2-1110-4e46-a036-d0cb32a4856e
axis2之webservice的更多相关文章
- axis2开发webservice程序
一.环境 eclipse + jdk 6.0 + win7 64位 +tomcat7.0 二.创建服务端程序 1.新建web项目,webserviceTest 2.下载axis2,将lib目录下的ja ...
- Java借助axis2发布WebService
Webservice: 1.Xml: 2.WSDL: Web service描述语言(WSDL)就是这样一个基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web service及其函数.参 ...
- 使用Axis2实现WebService的发布和调用
一.Axis2的下载和安装 1.可从http://ws.apache.org/axis2/ 下载Axis2的最新版本: 可以下载如下三个zip包: axis2-1.7.3-bin.zip(用 ...
- 使用Axis2编写webservice客户端,服务端
1.编写客户端 Axis2开发WebService客户端 的3种方式 [参考帖子] http://blog.csdn.net/wangjinwei6912/article/details/851259 ...
- 用AXIS2发布WebService的方法
Axis2+tomcat6.0 实现webService 服务端发布与客户端的调用. 第一步:首先要下载开发所需要的jar包 下载:axis2-1.6.1-war.zip http://www.apa ...
- Axis2创建WebService服务端接口+SoupUI以及Client端demo测试调用
第一步:引入axis2相关jar包,如果是pom项目,直接在pom文件中引入依赖就好 <dependency> <groupId>org.apache.axis2</gr ...
- Axis2开发WebService客户端 的3种方式
Axis2开发WebService客户端 的3种方式 在dos命令下 wsdl2java -uri wsdl的地址(网络上或者本地) -p com.whir.ezoffi ...
- 转载 使用axis2构建webservice
axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice 1:可以使用这个插件来发布webservice,可以看网址:http://clq9761.iteye.co ...
- tomcat 用AXIS2发布WebService 网站的方法
Axis2+tomcat7.0 实现webService 服务端发布与客户端的调用. Aixs2开发webService的方法有很多,在此只介绍一种比较简单的实现方法. 第一步:首先要下载开发所需要的 ...
随机推荐
- 新发现一个函数:GradientFill
位于Msimg32.dll之中 https://msdn.microsoft.com/en-us/library/windows/desktop/dd144957(v=vs.85).aspx
- bzoj1664 [Usaco2006 Open]County Fair Events 参加节日庆祝
Description Farmer John has returned to the County Fair so he can attend the special events (concert ...
- 生成excel文件
java操作Excel最常用的开源组件有poi与jxl.jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007.poi是apache下的一个子项目,poi应该是处理ms的o ...
- C#两个时间的时间差的方法
今天遇到一问题,计算两个时间的时间差,看网上的写法较为复杂,找到个简单点的,记录下作为自己的总结. 关键函数: DateTime.Subtract 函数解释: 从此实例中减去指定的日期和时间,返回一个 ...
- 诺基亚HERE地图
1.基本图层 2.3D图层 3.卫星图层 4.地形图层 5.在线帮助
- UESTC_摩天轮 2015 UESTC Training for Dynamic Programming<Problem K>
K - 摩天轮 Time Limit: 10000/4000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Submi ...
- UESTC_秋实大哥打游戏 2015 UESTC Training for Data Structures<Problem H>
H - 秋实大哥打游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- 【bzoj1031】[JSOI2007]字符加密Cipher
题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作:JSOI07 ...
- WLW 截屏插件
转载:http://www.xtit.net/post/1030/ 一直以来用WLW更新博客,刚刚在DailyApps看到一个关于Windows Live Writer的截屏插件,相当不错. 是由MS ...
- SQL SERVER中如何格式化日期(转)
原文地址:http://blog.sina.com.cn/s/blog_95cfa64601018obo.html 1. SELECT convert(varchar, getdate(), 10 ...