2012年7月

.SO域名-是否国际域名

一、.so是那里的域名
.so是分配给索马里的后缀,也就是说,这是一个国家(地区)顶级域名,和咱们的.cn是一样的,是ccTLD不是gTLD,也就是肯定不是通常所说的国际顶级域名,如果谁告诉你是国际顶级域名,绝对是忽悠你的。注意呀,QQPCC并没说这是骗你的,呵呵。为什么这样说呢?看来QQPCC要给大家解释下,其实“国际顶级域名”只是个通俗讲法,准确地应该叫“通用顶级域名”,所以世界上根本没有“国际顶级域名”这个东东,人家这么叫最多只能说是倫换概念,“骗”还算不上,呵呵。可能他们理解的“国际顶级域名”是“国际”(中国以外的)“顶级域名”,哈哈!
QQPCC再来给大家说说索马里吧,这是一个非洲国家,位于所谓的非洲之角,从赤道一直延伸到红海。面积637,000平方公里,人口约700-800万人,绝大多数是游牧或半游牧的索马里人,伊斯兰教为国教。
索马里大部分国土为半沙漠,所以经济很不发达,是世界上最贫穷的国家之一。
虽然经济落后,但索马里的战争更相当“发达”。1960年建国以来,派系斗争和内战从来没有停止过,一直到现在都是这样。而且,经常有干旱、饥荒、水灾的现象。
总之,这是一个政局动荡,经济十分落后的国家。
二、.so归谁管
.so有一个注册局,这次预注册就是注册局在做的,注册局的官方网址是:
http://www.soregistry.so
但有一个有趣的现象,有网友进行预注册和注册局进行邮件联系时,邮件中出现了鬼子的通信地址。因此可以初步判断,.so后缀现在是索马里委托给小日本在管理的。
三、.so技术支持有保障吗?
说实话,QQPCC对此持怀疑态度,留意.so的朋友应该清楚记得,预注册的时间推迟了两次,原因都是注册局的系统出了问题。作为一个国家后缀,预注册就问题频频,这说明或者是技术上存在问题,或者是准备并不充分。这样的后缀正式开放后,谁能保障它能有强大的技术支持呢?如果是由索马里人民自己来负责管理的,这样一个动荡和落后的国家能够给这个后缀提供技术保障吗?如果真如猜测的一样,是小日本管理的,似乎日本在这一块除了几个较大的公司,其他的也没有什么的优势。
四、.so到底是什么含义
国内一些公司在宣传.so时,喜欢把SO解释为读音为“搜”,QQPCC觉得这种解释太过牵强,与其这样,那QQPCC觉得他还不如前苏联的.su好。更何况,就算让你注册个china.so(当然,能注册这个的话QQPCC会绝不手软的,呵呵),你能叫他“中国搜索”吗?这样叫的话,中国人看不明白,外国人也看不明白,呵呵。
五、.so到底会定价多少
DomainMonster开始搞预注册时,价格是一年12英镑多,那时QQPCC真还有点动心了,后来调整到近15英镑,现在调整到接近25英镑,随着正式开放注册的日期越来越近,估计现在的价格比较真实了。这也和QQPCC开始预测的差不多,那就是他会把价格锁定在和.co持平的一个位置上。
也许是.so看到了.co傍上了GoDaddy这样的大款,也许是小日本看到人家推销.co大赚了一把,把价格锁定在和.co同一水平的位置上。不过如果真是这样的想法来定价的话,讲实在话,QQPCC对.so就更没有什么好感了。
好在这次.so的到来,国人总的来讲还是比较冷静,没有像玩其他几个后缀那样疯狂。这也许是.cc、.cm、.co几场战役后给大家多了更多的理性,也许是国人对小日本太不喜欢,也许是国人熟悉日语的太少,也许是……,也许是根本没有也许。

其实去年十月份就有人宣传过一通.so后缀,现在相对比较冷清了。不过最近国外的一些网站倒是在开始炒作.so后缀了,如DomainMonster最近就一直在推.so域名预注册。随着.so公开注册日期的临近,估计又会有不少朋友会把目光投向这个新后缀了,于是,QQPCC决定写一篇专稿,和好域名的朋友们侃侃.so后缀。
不过这是一个好现象,至少说明大家面对各种炒作更加理性了。



本文链接地址: http://www.haoyu.me/1130.html

javascript获取url参数和script标签中获取url参数函数代码

不要在方法中调用方法,否则可能始终获取的是最后一个js的文件的参数,要在方法中使用,请先用变量保存,在方法中直接获取。

url paramter:

复制代码代码如下:

//lastest:
var getArgs=function() {//get url querystring
var params=document.location.search,reg=/(?:^\?|&)(.*?)=(.*?)(?=&|$)/g,temp,args={};
while((temp=reg.exec(params))!=null) args[temp[1]]=decodeURIComponent(temp[2]);
return args;
};
//只取一个:
var queryString=function(key){
return (document.location.search.match(new RegExp("(?:^\\?|&)"+key+"=(.*?)(?=&|$)"))||['',null])[1];
}
var args=getArgs();
alert(args.name+" | "+args.sex+" | "+args.age);
//测试链接:<a href="?name=abc&sex=男&age=12">test getQueryString</a>

script paramter:

复制代码代码如下:

var getScriptArgs=function(){//获取多个参数
var scripts=document.getElementsByTagName("script"),
script=scripts[scripts.length-1],//因为当前dom加载时后面的script标签还未加载,所以最后一个就是当前的script
src=script.src,
reg=/(?:\?|&)(.*?)=(.*?)(?=&|$)/g,
temp,res={};
while((temp=reg.exec(src))!=null) res[temp[1]]=decodeURIComponent(temp[2]);
return res;
};
var args=getScriptArgs();
alert(args.a+" | "+args.b+" | "+args.c);
//假如上面的js是在这个js1.js的脚本中<script type="text/javascript" src="js1.js?a=abc&b=汉字&c=123"></script>

var getScriptArg=function(key){//获取单个参数
var scripts=document.getElementsByTagName("script"),
script=scripts[scripts.length-1],
src=script.src;
return (src.match(new RegExp("(?:\\?|&)"+key+"=(.*?)(?=&|$)"))||['',null])[1];
};
alert(getScriptArg("c"));

ps:不要在方法中调用方法,否则可能始终获取的是最后一个js的文件的参数,要在方法中使用,请先用变量保存,在方法中直接获取

JXL生成的excel文件+JAVA文件下载功能

一个需求,用户点击下载按钮,将指定的excel的报表模板使用数据库数据渲染,然后下载到用户本地;

通常而言,对于一个文件的下载,可以有以下几种方式:

window.location.href=文件名称URL全路径;

window.open(文件名称URL全路径);

这种方式不友好的地方在于服务器的目录结构直接暴露出去,而且在IE下很有可能会报错权限问题等,甚至firefox中会触发那个年代久远而依然没有解决的bug。所以这里不推荐。

 

对于jxl生成excel文件,有两种方式,一种是生成文件保存到磁盘,另一种是直接保存到输出流中。

对于上述需求,如果生成的文件保存到磁盘,随着系统运行,磁盘会主键被占用,需要手动去删除。由于文件都较小,所以这里采用第二种方式,直接在内存中生成文件,然后提供给用户下载的时候response回去。

 

看一个例子:

用于响应下载请求的controller

 

  1. /**
  2.      * 下载个人订单
  3.      * @param request
  4.      * @param response
  5.      * @param modelMap
  6.      */
  7.     @RequestMapping(value="/download.do", method=RequestMethod.GET)
  8.     public void processDownload(HttpServletRequest request,HttpServletResponse response
  9.             , ModelMap modelMap) {
  10.         long userId = getUserId(request);
  11.         String ids = request.getParameter("ids");
  12.         try {
  13.             Long[] idarray = getIdsFromStringArray(ids.split(","));
  14.             if (null == idarray || 0 == idarray.length) {
  15.                 return;
  16.             }
  17.             // 直接往response的输出流中写excel
  18.             OutputStream outputStream = response.getOutputStream();
  19.             // 获取文件名称
  20.             String fileName = getUserFileName(userId);
  21.             // 下载格式设置
  22.             response.setContentType("APPLICATION/OCTET-STREAM");
  23.             response.setHeader("Content-Disposition", "attachment; filename=/"" + fileName + "/"");
  24.             // 读取数据渲染模板并写入outputstream中
  25.             List<PhAdvertiseOrderDO> advertiseOrderList = phAdvertiseOrderService.getAdvertiseOrderByIds(idarray, userId);
  26.             outputStream = excelFileService.generalExcelFileInOutputStream(outputStream, advertiseOrderList);
  27.             outputStream.close();
  28.         } catch (Exception e) {
  29.             logger.error("下载报表发生异常!", e);
  30.         }
  31.     }

 

 

其中调用到的文件服务

 

  1. /* (non-Javadoc)
  2.      * @see com.netease.photography.service.ExcelFileService#generalExcelFileInOutputStream(java.lang.String, java.io.OutputStream, java.util.List)
  3.      */
  4.     public OutputStream generalExcelFileInOutputStream(OutputStream outputStream, List<PhAdvertiseOrderDO> advertiseOrderList) throws BiffException, IOException, WriteException {
  5.         // 检查参数是否合法
  6.         checkParam(tempalteFile,"no File",advertiseOrderList);
  7.         // 获取模板
  8.         Workbook templatebook = Workbook.getWorkbook(new File(tempalteFile));
  9.         WritableWorkbook writeableWorkbook = Workbook.createWorkbook(outputStream, templatebook);
  10.         // 读取数据写入模板
  11.         readDataAndWriteTemplate(templatebook, writeableWorkbook, advertiseOrderList);
  12.         return outputStream;
  13.     }

 

其中的重点就在于

 

  1. WritableWorkbook writeableWorkbook = Workbook.createWorkbook(outputStream, templatebook);

 

这句话指定了写入的数据到输出流中。

 

页面调用很简单

 

 

[javascript] view plaincopy

  1. function getOrderFileNoDirect() {
  2.     var ids ="";
  3.     for(var i=0;i<30;i++){
  4.         if($("choose"+i) != null && $("choose"+i).checked == true) {
  5.             ids += $("choose"+i).value;
  6.             ids += ",";
  7.         }
  8.     }
  9.     if(ids==""){
  10.         alert('不能建立空报表!');
  11.         return;
  12.     }
  13.     window.open("download.do?ids="+ids);
  14. }

 

参考资料:http://blog.csdn.net/quzishen/article/details/6045039

freemarker调用java静态方法以及枚举

Freemarker渲染视图采用的是一个 模型+数据 = 页面  的方式,这也是模板渲染引擎的通用模式,对于freemarker渲染页面的时候一些特殊的数据格式转换、随机数获取等需求,如果很难通过freemarker本身的标签完成,可以通过调用java静态方法来完成。前提是这个方法必须是静态。允许传递参数。

实现这个需求,使用的便是freemarker的BeansWrapper这个类,他借用TemplateHashModel可以从web容器中获取指定类名的bean并通过传统的如spring的ModelMap.setAttribute方式传递给ModelMap,然后页面可以根据指明的名称,使用$符号调用即可。

举个例子:

 

 

  1. // 需要注入给freemarker使用的class
  2.     @SuppressWarnings("rawtypes")
  3.     private static Class[] defaultStaticClasses={ PhotographyStringUtils.class,
  4.                                     RandomStringUtils.class,
  5.                                     StringUtils.class,
  6.                                     NumberUtils.class,
  7.                                     RandomUtils.class};
  8.     /**
  9.      * 将class的引用注入给freemarker,作用域为request
  10.      * @param modelMap
  11.      */
  12.     @SuppressWarnings("rawtypes")
  13.     protected static void setDefaultStaticModel(ModelMap modelMap) {
  14.         for (Class clz : defaultStaticClasses) {
  15.             String name = clz.getSimpleName();
  16.             modelMap.addAttribute(name, getStaticModel(clz));
  17.         }
  18.     }
  19.     /**
  20.      * 获取freemarker可使用的bean
  21.      * @param clz 类型
  22.      * @return
  23.      */
  24.     @SuppressWarnings("rawtypes")
  25.     private static Object getStaticModel(Class clz) {
  26.         BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
  27.         try {
  28.             return wrapper.getStaticModels().get(clz.getName());
  29.         } catch (TemplateModelException e) {
  30.             e.printStackTrace();
  31.         }
  32.         return null;
  33.     }

 

页面调用:

 

  1. ${PhotographyStringUtils.getTimeStrFromLong(_item.orderBeginTime,"yyyy-MM-dd")}

 

 

方法的调用通过反射去执行,但是如果这个方法的参数是一个泛型T怎么办呢?如何调用enum呢?

在下面找答案

http://freemarker.sourceforge.net/docs/pgui_misc_beanwrapper.html#beanswrapper_hash

 

参考资料:http://blog.csdn.net/quzishen/article/details/6044615

Yii Framework在WEB页面查看SQL语句

'components'=>array(

'errorHandler'=>array(

// use 'site/error' action to display errors

'errorAction'=>'site/error',

),

'log'=>array(

'class'=>'CLogRouter',

'routes'=>array(

array(

'class'=>'CFileLogRoute',

'levels'=>'error, warning',

),

// 下面显示页面日志

array(

'class'=>'CWebLogRoute',

'levels'=>'trace',     //级别为trace

'categories'=>'system.db.*' //只显示关于数据库信息,包括数据库连接,数据库执行语句

),

),

),

),