从表单数据创建实体对象

其他开发  |  8年前

Web应用的基本流程就是通过表单提交数据到服务器,服务器端程序以这些数据建立实体对象,经过处理后更新到数据库。而从表单数据创建实体对象的过程通常是很麻烦的,必须考虑到以下几点:

  1. 创建什么类型的对象?
  2. 表单的各项数据如何映射到对象的各项属性?
  3. 提交到服务器的数据都是字符串类型的,要还原成对应属性的数据类型。

之前我就用泛型写了一个Request工具类。不过这个类仅仅是解决了第三个问题而已,而要解决前两个问题就得靠反射了。

要解决第一个问题,还得用泛型,也就是类型作为参数传入,由此得到这个通用函数的原型:

public class ReqHelper
{
  public static T GetEntity<T>()
  {

  }
}

而函数体的第一步,自然就是建立类型T的示例:

T entity = new T();

这段代码乍一看没错,但一编译就会报错,原因是编译器并不能确定T的构造函数的原型。因此还得用where关键字进一步约束T:

public static T GetEntity<T>() where T : new()
{
  T entity = new T();
}
697次阅读,1条评论

再论Javascript下字符串连接的性能

前端开发  |  8年前

这是个老话题了,之所以再拿出来说,是因为浏览器一直在进步,以前最好的方法现在不一定是最好的。

1 如何进行字符串连接?

首先让我们来回顾一下字符串连接的两种常用方法:

1.1 使用字符串连接运算符

常用的语言(如Java、C#、PHP等)都有字符串连接运算符,Javascript也不例外,代码示例:

var str = "";
str = str + "a";

1.2 使用数组

在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串。而在Javascript中就出现了通过Array模拟StringBuilder的方案

var str = [];
for (var i = 0; i < 100; i++) {
  str[i] = "12345";
}
str = str.join("");
3077次阅读,6条评论

淘宝搜索框研究报告

前端开发  |  8年前

在输入框里面预设一段提示文字,当焦点在输入框的时候清空这段文字,这在目前来说已经不是什么新鲜事了。淘宝的搜索框就用到了这样一种设计:

淘宝搜索框

这种设计一般是用javascript监控了输入框的focus和blur事件:

<input type="text" id="q" value="请输入关键字" />
<script type="text/javascript">//<![CDATA[
$("#q").onfocus = function() {
  if ("请输入关键字" == this.value) {
    this.value = "";
  }
};
$("#q").onblur = function() {
  if ("" == this.value) {
    this.value = "请输入关键字";
  }
};
//]]></script>

这段代码有两个很明显的缺点:

  1. “请输入关键字”这段提示共出现了3次,一旦要改这段文字就得改3个地方,维护显得非常不便
  2. 为了性能优化,我们会把javascript部分放到页面末尾。然而,像门户网站首页这种代码量很大的页面,末尾的javascript很可能会延时1-2秒执行。在这段时间内,即使焦点在输入框内,提示文字也不会消失,用户需要手动删除这段文字再输入内容
1226次阅读,2条评论

使用泛型打造Request工具类

其他开发  |  8年前

在ASP.NET页面中可以使用Request对象获取指定参数的值,例如:

string value = Request["id"];

参数值都是string类型,但是进行处理的时候可能要转换成数字、日期等类型。

string value = Request["id"];
int id = Int32.Parse(value);

实际应用的时候还要考虑异常的情况。

string value = Request["id"];
int id;
Int32.TryParse(value, out id);

如果每个页面都这么写,显得非常麻烦,代码重复也很严重,还是封装成一个工具类吧。

public class ReqHelper
{
	public static string GetString(string paramName) { ... }
	public static int GetInt(string paramName) { ... }
	public static bool GetBool(string paramName) { ... }
	...
}
911次阅读,1条评论

发现搜搜两个有趣的应用

工作生活  |  8年前

今天在cnbeta的一篇文章《搜搜舞文弄墨上线,会打字就会作诗》中发现了SOSO的一个有趣应用,名为“舞文弄墨”。这个搜索引擎可以方便地搜出藏头诗。

搜索“万剑归宗”

“万剑归宗”藏头诗

顺藤摸瓜,在搜搜实验室又发现了另一个有趣的“名字印象”,输入名字后可以看到该名字的印象分,当然这个分数仅供娱乐,千万别当真,倒是给小孩起名字的时候可以参考参考。

“郭靖”印象分

530次阅读,2条评论

游西湖

工作生活  |  8年前

上周六在杭州参加了D2交流会,由于回程时间是周日下午,所以趁着周日早上有时间就去了逛西湖。

先是打车到了雷峰塔,在外面观摩了一番。

雷峰塔

接着就往西湖的方向走,途中到了一处有很多船的地方,其中最大的是一艘“龙船”。

“龙船”

553次阅读,1条评论

第四届D2报道

前端开发  |  8年前

本届D2在阿里巴巴一个报告厅内举行,该报告厅内有3个投影屏,确保各个位置的观众都可以看到演示内容。悲剧的是,报告厅内的空调(暖气)坏了,所以室内温度也很低,一天下来膝盖以下都是冷的。

阿里巴巴正门

九点多,会议正式开始,老男致开幕词。同时,前方左侧的小屏幕上也开始直播人间网上的D2讨论。这对我来说是一种很新鲜的讨论方式,好比上面在开大会,下面在开小会,但是小会并没有影响会进行,反而使大会的气氛更加活跃。

人间网D2讨论

720次阅读,7条评论

parseInt的陷阱

前端开发  |  8年前
var a = parseInt("09"), b = Number("09");

很多人会认为a和b的值都是数字9,但实际上不是。

parseInt的主要作用是把字符串转换为整数,或者把小数转换为整数。一般情况下,我们只用到它的第一个参数。但实际上,它有两个参数:

parseInt(string, radix)

parseInt会根据radix指定的进制进行转换,比如:

alert(parseInt("10", 2)); // outputs '2'

在没有指定radix或者radix为0的情况下,parseInt会按十进制进行转换。然而,这在某些情况下有点特殊:

  • 如果string的值以“0x”开头,parseInt会按十六进制进行转换;
  • 如果string的值以“0”开头,parseInt会按八进制进行转换。

说回开头的代码,由于"09"是以“0”开头,所以parseInt会按八进制进行转换,但是“9”不是合法的八进制值(八进制只有0-7八个数字),所以转换结果是0。

要避免这个陷进,可以强制指定radix:

alert(parseInt("09", 10)); // outputs '9'

 

518次阅读,1条评论

事件监听兼容处理

前端开发  |  8年前

在事件监听处理方面,IE提供了attachEventdetachEvent两个接口,而Firefox提供的是addEventListenerremoveEventListener。最简单的兼容性处理就是封装这两套接口:

function addEvent(elem, eventName, handler) {
  if (elem.attachEvent) {
    elem.attachEvent("on" + eventName, handler);
  } else if (elem.addEventListener) {
    elem.addEventListener(eventName, handler, false);
  }
}

function removeEvent(elem, eventName, handler) {
  if (elem.detachEvent) {
    elem.detachEvent("on" + eventName, handler);
  } else if (elem.removeEventListener) {
    elem.removeEventListener(eventName, handler, false);
  }
}
692次阅读,0条评论

EditPlus配置手记

其他开发  |  8年前

最近打算换主IDE,主要原因是现在用的Dreamweaver太慢太占资源,特别是打开大文件的时候。而代替者就是EditPlus。下面简单记录一下如何把EditPlus配置成一个编程IDE。

首选项

无论是什么软件,一般都要先改全局设置,也就是首选项。

常规

常规

  • 还原最近文件的光标/标记/编码方式:这个一定要勾上,否则就不能保存代码折叠
  • 使用XHTML标签:标准化网页。
  • 自动关闭HTML标签:勾上这个以后,输入“<”后就会自动补全“>”,光标在两个字符之间。
6831次阅读,7条评论