在上一篇博文中,我简单介绍了将JPetStore 5导入MyEclipse的方法,实际上iBatis早已改名为MyBatis,其所有的demo项目都在google code上托管:https://code.google.com/p/mybatis/ ,JPetStore也已经于2011年6月推出了最新的第6版。所以这里再简单总结一下将部署JPetStore 6的方法。
在这里:https://code.google.com/p/mybatis/downloads/detail?name=mybatis-jpetstore-6.0.1-bundle.zip 下载压缩包并解压后,发现其中包含war包(可以直接部署)。但我们这里总结的是导入MyEclipse的方法,稍微麻烦一些:
将压缩包:mybatis-jpetstore-6.0.1-sources.zip,解压后,需要使用maven这一工具进行管理和部署,我之前没用过,这里简单说说(其实apache的项目用起来都差不多)。在这里:http://maven.apache.org/download.cgi 下载maven的压缩包并解压后,需要设置环境变量:首先新建一个环境变量M2_HOME,位置为maven解压包中bin目录的上一层;然后在path环境变量最后面添加:%M2_HOME%\bin。如果在cmd里面运行mvn后有结果,则说明设置成功。
在cmd中,进入mybatis-jpetstore-6.0.1-sources这一文件夹下,运行:
mvn package
成功之后再运行:
mvn eclipse:eclipse
这条命令的意思是生成eclipse项目,成功之后再运行:
mvn clean
这条命令的含义等会再说。经过这三步,就可以在MyEclipse中导入项目了。在MyEclipse选择“import”——“Existing Projects into Workspace”——定位到刚才的mybatis-jpetstore-6.0.1-sources文件夹下,导入之后需要进行一步设置:在MyEclipse菜单栏中选“MyEclipse”——“Project Capabilities”——“Add Web Project Capabilities”——然后需要在下图所示的界面中指定Web Root Directory(指定Web Project的root在什么地方)和Web Context Root(指定在Tomcat webapps目录中的文件夹名),指定方法就如图所示:
这样就基本上将JPetStore
6导入MyEclipse中了,接下来部署发布就可以了。下面解释一下为什么要运行mvn clean这条命令,如果不运行的话,部署后就会出现类似下面的报错:
Unable to read TLD "META-INF/stripes.tld" from JAR file "file:/D:/Projects/apache-tomcat-6.0.36/webapps/jpetstore/WEB-INF/lib/stripes-1.5.6.jar": org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: net.sourceforge.stripes.tag.ErrorsTagExtraInfo
搜索了一下,这个问题很容易出现,大部分原因是web project的lib和tomcat自有的lib冲突,而在maven的pom.xml中实际上已经考虑到这种冲突,但如果不运行mvn clean,就会经常出现上面的报错。更常见的是项目的jsp-api-XX.jar,jstl-XX.jar和tomcat冲突,解决的方法都是一样,通过mvn clean来避免这种冲突。
本文的前提是你已经熟悉Json,如果您还不知道什么是Json是什么,请自行查看维基百科。
一、Json.Net是什么?
Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基本数据类型等)和Json的转换。点击下载
二、为什么使用Json.Net?
我们知道在.Net中内置了读写Json的对象(DataContractJsonSerializer,JavaScriptSerializer),为什么我们还要用Json.Net呢?
在功能上:
特性
Json.Net
DataContractJsonSerializer
JavaScriptSerializer
Json
支持
支持
支持
Bson
支持
不支持
不支持
Json Schema
支持
不支持
不支持
.Net 2.0
支持
不支持
不支持
.Net 3.5
支持
支持
支持
.Net 4.0
支持
支持
支持
Silverlight
支持
支持
不支持
Windows Phone
支持
支持
不支持
Windows 8 Metro
支持
支持
不支持
Linq to Json
支持
不支持
不支持
Indented Json(有换行格式的Json)
支持
不支持
不支持
定位错误来源:
1. 使用firebug或类似于firebug的工具审查”通信失败“这几个字
2. 会发现包含这几个字的div的同级下方有个script标签,复制该script标签的src值到浏览器的新标签页并打开
3. 这个url指向的是ucenter中app模块的onping操作(ucenter/control/admin/app.php)
onping解析:
1. onping会向url中指定的应用的uc.php发出一个请求,请求的参数为要执行的存在于uc.php中的动作的动作名test以及一个时间戳
2. uc.php收到请求会执行test,并返回1
通信失败排查方法:
根据上面的解析可知,如果通信失败就说明应用中的uc.php并没有正常的返回1,此时就要排查uc.php出了什么问题:
1. 在onping中输出$url(该url为ucenter根据自己设置的应用信息组成的uc.php的url),检查该url是否可以正常访问到应用中的uc.php,如果不能请修改
2. 如果可以正常访问且没有报错,那么就要一步步的排查uc.php的执行状况了
最终的目的就是让$url的输出为1
一个比较怪异的问题:
有时候会发现$url的输出值为 "乱码1",而导致通信失败...
这里的乱码其实是uc.php文件或者uc.php加载的其他文件的bom头,要去除它,就要排查哪个文件中存在这个bom头然后去掉,如果实在找不到,还有个治标不治本的方法:
(为返回状态值做去除bom头的操作)
代码:
function rmBOM($string) { if (substr($string, 0,3) == pack('CCC',0xef,0xbb,0xbf)) { $string = substr($string, 3); } return $string; }