<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>没有比人更高的山 &#187; Web</title>
	<atom:link href="http://www.zhlwish.com/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zhlwish.com</link>
	<description>Where there is a will there is a way.</description>
	<lastBuildDate>Fri, 13 Jan 2012 08:13:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Spring 3 MVC 教程集合</title>
		<link>http://www.zhlwish.com/2010/12/02/spring3mvc/</link>
		<comments>http://www.zhlwish.com/2010/12/02/spring3mvc/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 13:21:18 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring3]]></category>
		<category><![CDATA[web后台]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=263</guid>
		<description><![CDATA[Spring MVC 3相对于之前的版本变化相当大，本系列文章是一个入门，非常详细，有图！ Part 1: Introduction to Spring 3.0 MVC framework Part 2: Create Hello World Application in Spring 3.0 MVC Part 3: Handling Forms in Spring 3.0 MVC Part 4: Spring 3 MVC Tiles Plugin Tutorial with Example in &#8230; <a href="http://www.zhlwish.com/2010/12/02/spring3mvc/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2010/12/02/spring3mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress旗下的bbPress内网与外网访问设置</title>
		<link>http://www.zhlwish.com/2010/06/25/bbpress_lan_wan_setting/</link>
		<comments>http://www.zhlwish.com/2010/06/25/bbpress_lan_wan_setting/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 14:47:22 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[bbpress]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=190</guid>
		<description><![CDATA[有很多WordPress使用者都想有个能和WordPress很好整合的论坛系统，现在有了bbPress，大家可以少折腾了。 作为一款轻量级的论坛程序，bbPress之前一直默默发展，几乎没有任何推广，而且使用范围和使用人数都比较少，但进入2010年一来，WordPress官方逐渐加大对bbPress的投入。 bbPress安装详细教程 OPhone俱乐部社区 是我在Dian团队的服务器上使用bbPress架设的一个小型论坛。因为服务器在网关内部，而且由于某些原因没有设置成内网也可以用域名访问，如服务器是192.168.0.3，在内网我们就用这个IP了，但外网就必须用域名。 在配置WordPress的时候也会出现，配置好了内网，外网访问不了，这个问题oo同学已经很好的解决了《wordpress内网与外网同时访问的问题》，我是google出来的，在此先恭喜oo同学。 我也尝试用同样的方法配置bbPress，结果发现不行，因为bbPress设计的时候可能还是有些不合理。最终我找到一个不能称其为方法的方法: [1]打开bbPress安装目录下的bb-includes\functions.bb-meta.php文件 [2]找到函数bb_get_option_from_db的定义 [3]在return前增加一下代码： 1 2 3 4 5 6 7 if&#40;$option == 'uri'&#41; &#123; $rip = $_SERVER&#91;'REMOTE_ADDR'&#93;; if&#40; strpos&#40;$rip, '192.168'&#41; !== false &#41; &#123; $r = 'http://192.168.0.3/ophone/bbs'; &#125; &#125;]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2010/06/25/bbpress_lan_wan_setting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>好用的WordPress代码高亮插件WP-Syntax</title>
		<link>http://www.zhlwish.com/2010/01/24/wp-syntax/</link>
		<comments>http://www.zhlwish.com/2010/01/24/wp-syntax/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 17:04:49 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=167</guid>
		<description><![CDATA[开博几个月以来一直没有使用代码高亮插件，并不是我不想，而是找到的几个代码插件实在是太让人失望：有些很安装使用很复杂，让人摸不到头脑；有些效果太夸张，界面不够简单整洁；还有些用js来实现，但是遇到代码中有&#38;gt;（大家都知道这是&#62;的转义字符）这样的代码就出错了，而我有很多代码经过Wordpress的处理有些尖括号已经被转义字符替代了，有些XML代码就更厉害，通篇都是&#38;gt; &#38;lt;，让人头疼不已。 今天偶然发现一个插件，名为WP-Syntax，顿时让我眼睛一亮，别人都说它是兼容性最好的代码高亮插件，经过试用，果不其然，我已经在本博客上全面启用这个插件了。 使用方法其实很多，不妨我罗嗦两句，兼凑个字数，也算做个笔记： 1 &#60;pre lang=&#34;java&#34; line=&#34;1&#34; escaped=&#34;true&#34;&#62;//Java代码&#60;/pre&#62; 其中标签pre的属性lang表示语言类型，line表示显示起始代码行号，如果不设置则不显示行号，escaped表示是否代码是否为转义字符，默认为false，即如果你的代码中有转义字符，则需要设置escaped=”true” 本文是本博客原创文章，您可以自由转载，但转载请注明来源。]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2010/01/24/wp-syntax/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>一些国人开发的好用JS控件</title>
		<link>http://www.zhlwish.com/2010/01/13/js_html_control/</link>
		<comments>http://www.zhlwish.com/2010/01/13/js_html_control/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 15:42:31 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jsp]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=146</guid>
		<description><![CDATA[以前都是用国外开发的像FCKEditor（已经更名为CKEditor）、Flexigrid等，很多英文文档看得头大，而且代码不一定写得很好，比如Flexigrid，我找到了至少2处bug，开发中很多时间都花费在看那上千行的js脚本上了。这里介绍几款国人开发的js控件，非常好用 My97日期控件:http://www.my97.net/dp 好处：可以选择时间，可以显示周，自定义格式，有多种皮肤可供选择，选择老年份非常方便： KindEditor: http://www.kindsoft.net 一款可见即所得编辑器，用起来非常简单，相比CKEditor和TinyMCE要简单很多，特别是TinyMCE一大堆插件，一看头就晕了，项目开发期紧张，哪有那么多时间去看这些个插件是干嘛的哟。 支持两种皮肤，其中一种就是TinyMCE的皮肤，呵呵。 基于JQuery的Inline Editor插件：http://www.wbfsaworkstation.com.cn 实在是不好意思，我不知道inline这个词怎么用中文来表达，我想每个开发人员应该心里明白是啥意思吧。支持单选按钮、多选列表、文本域、软键盘等，还有评分插件以及日历插件（日历插件基于My97） 如果遇到好的，会继续推荐，呵呵&#8230;]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2010/01/13/js_html_control/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JSF中CommandButton与CommandLink传值</title>
		<link>http://www.zhlwish.com/2009/12/31/jsf_commandbutton_commandlink/</link>
		<comments>http://www.zhlwish.com/2009/12/31/jsf_commandbutton_commandlink/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 07:48:06 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[web后台]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=139</guid>
		<description><![CDATA[f:param标签能够将一个参数添加到组件。需要注意的是f:param标签的不同表现依赖于它所关联的组件类型： 【1】如果为 h:outputText添加f:param标签，那么JSF实现将使用参数来填充占位符，例如{0}、{1}等。 【2】如果添加f:param标签到h:commandLink，JSF实现会将参数值作为请求参数传递到服务器，如： 1 2 3 &#60;h :commandLink actionListener=&#34;#{userListBean.checkUser}&#34; value=&#34;审核通过&#34;&#62;     &#60;f :param name=&#34;userId&#34; value=&#34;#{user.userId}&#34; /&#62; &#60;/h&#62; 在服务器端可以使用如下方法来获取传递到服务器端的值： 1 2 3 4 private void checkUser&#40;ActionEvent actionEvent&#41;&#123; String uid = FacesContext.getCurrentInstance&#40;&#41;.getExternalContext&#40;&#41;.getRequestParameterMap&#40;&#41;.get&#40;&#34;userId&#34;&#41;; //othe &#125; 但是f:param的传值方式对于h:commandButton是没有作用的，（如果你是用搜索引擎搜到这篇文章的话，相信你肯定是遇到了这个问题），详情可以参考http://www.javaeye.com/topic/93388 如果是h:commandButton，那么可以使用f:attribute来进行传值，示例如下： 1 2 3 &#60;h :commandButton actionListener=&#34;#{userListBean.resetPassword}&#34; &#8230; <a href="http://www.zhlwish.com/2009/12/31/jsf_commandbutton_commandlink/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/12/31/jsf_commandbutton_commandlink/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSP &amp; Servlet讲座PPT</title>
		<link>http://www.zhlwish.com/2009/12/22/jsp_servlet_ppt/</link>
		<comments>http://www.zhlwish.com/2009/12/22/jsp_servlet_ppt/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 14:02:08 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=134</guid>
		<description><![CDATA[如果听了讲座的小盆友请给个评价吧，如果没听的话给ppt一个评价吧，谢谢。]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/12/22/jsp_servlet_ppt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Appfuse中文教程</title>
		<link>http://www.zhlwish.com/2009/12/21/appfuse/</link>
		<comments>http://www.zhlwish.com/2009/12/21/appfuse/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 12:24:33 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[工具与框架]]></category>
		<category><![CDATA[appfuse]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=128</guid>
		<description><![CDATA[现在的Web应用开发人员是幸福的，有如此多的选择，Web层有Sturts2、JSF、Spring MVC、Tapestry等，持久层可以选择Hibernate、iBATIS或者JPA等，还有极为强大的Spring作为粘合剂，完美地运行时自动创 建所需的一切对象（依赖注入）。然而我们这些开发人员也是不幸的，因为要让一切完美的运行有太多太多的配置——XML、Annotation甚至是 Properties文件。当开始一个新项目时，要搭建起一个能正常运行、能真正简化开发、能真正实现模块化开发的Web应用开发骨架太难了，更不用说还 要加入DbUnit等自动测试框架。 但是有了Appfuse，一切变得简单起来，Appfuse是一个开源的Web应用骨架生成工具，支持上文提到的任何一种开发工具的组合，包括Web Services、工作流、任务调度等，能方便的生成Web开发中常用CRUD骨架，够诱人了吧。 吹了这么多，Appfuse其实很简单，你甚至不需要下载，因为她实质上是一个Maven插件，你运行mvn命令时，maven会自动帮你搞定任何事情，也就是说你只需要知道命令就行了，而且实际上你也不需要记住命令，http://appfuse.org/display/APF/AppFuse+QuickStart+-+Chinese 这个页面可以帮助你生成命令，而且是中文的，虽然翻译得不怎么样，不过看得懂。 选择好你需要的Web框架，将它帮你生成的mvn命令直接复制到命令行中，如果你已经按http://appfuse.org/display/APF/Development+Environment 配置好了环境变量的话，你可以看到maven开始下载一切需要的东西了。其实配置环境变量没有说得那么复杂，只需要将JDK、Maven、MySQL的bin目录都加入到path里面就行了，linux的用户请自己摸索一下，我不是很懂。 其实上面这些如果你是标准SSH(Struts2+Spring+Hibernate架构)还有一个选择就是Springside， 国人开发的，异常不错，强烈推荐，个人认为在SSH方面比Appfuse要更好一些。不过Appfuse还有个绝招，它还提供了一个VMWare 虚拟机镜像，可以直接下下来，里面已经装好了Subversion（版本控制）, CruiseControl（持续集成工具） 和Trac（bug追踪工具以及wiki），不过我没有尝试，不知道具体使用起来怎么样。 第一篇就到这里，要知后事如何，且听下回分解。]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/12/21/appfuse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSP中Session、Cookie的使用与“记住我的登录状态”示例程序</title>
		<link>http://www.zhlwish.com/2009/12/05/jsp_session_cookie_remember_me/</link>
		<comments>http://www.zhlwish.com/2009/12/05/jsp_session_cookie_remember_me/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 17:30:11 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[web后台]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=116</guid>
		<description><![CDATA[本文为原创文章，转载请注明来源http://www.zhlwish.com 在《session、cookie与“记住我的登录状态”的功能的实现》一文中详细讲解了Cookie和Session的原理以及“记住我的登录状态”功能的实现原理，本文以Servlet、JSP技术为例讲解Servlet中Cookie和Session的使用以及以此为基础的“记住我的登录状态”功能的实现方式，最后附上例子程序的源代码。 EL表达式 本文的样例源代码中用到了JSP EL表达式，JSP1.0中EL表达式是作为JSTL的一部分，即只能在JSTL标签中使用。JSP2.0中EL表达式可以在文本模板中使用，即可以直接在JSP页面中使用，本文的样例源代码使用${pageContext.request.contextPath}在JSP页面中获取当前Web应用的路径(context path)，关于EL表达式的使用请参见《JSTL入门：表达式语言》，关于Web应用的路径请参见《Servlet、JSP中获取Web应用路径(context path)的方法》 Servlet中的Session javax.servlet.http.HttpSession是Servlet API中定义的一个接口，其中比较重要的方法有： 将一个对象实例存放在Session中： 1 public void setAttribute&#40;String name, Object value&#41;; 通过名称获取Session中的对象实例： 1 public Object getAttribute&#40;String name&#41;; Session对象可以用过HttpServletRequest对象获取，一般在Servlet中通过request.getSession();获取一个Session对象。 Web服务器每接收到一个新的请求，服务器就会新建一个Session对象，一般会将当前用户帐号存放于Session中，当然你可以放更多的对象，这样会增加服务器的负担。Session会在一定时间后由Servlet容器销毁，这个时间可以在Web应用的web.xml里面进行设置。 Servlet中的Cookie javax.servlet.http.Cookie是一个类，有一个构造函数public Cookie(String name, String value)，一般用下面的方式创建一个Cookie对象： 1 2 3 4 5 String cookieName = &#8230; <a href="http://www.zhlwish.com/2009/12/05/jsp_session_cookie_remember_me/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/12/05/jsp_session_cookie_remember_me/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Servlet、JSP中获取Web应用路径(context path)的方法</title>
		<link>http://www.zhlwish.com/2009/12/04/servlet_jsp_context_path/</link>
		<comments>http://www.zhlwish.com/2009/12/04/servlet_jsp_context_path/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 06:36:17 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[web后台]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=112</guid>
		<description><![CDATA[在Servlet中可以直接使用request.getContextPath()获取当前web应用的路径(context path) 在JSP 2.0页面中可以使用el表达式${pageContext.request.contextPath} 如果是JSF页面，因为JSF默认使用#作为el表达式的起始符，所以应该写成#{pageContext.request.contextPath} 因为JSP2.0之前的版本不支持文本模板中的el表达式，故可以使用嵌入java代码来实现，和Servlet中一样 如果在JSP2.0之前的版本中使用了JSTL标签（el表达式的概念是JSTL 1.0推出来的），所以仍然可以配合JSTL的标签使用el表达式输出当前Web应用路径(context path)]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/12/04/servlet_jsp_context_path/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSP中获取表单中多选列表(Multiple Select)提交的值</title>
		<link>http://www.zhlwish.com/2009/11/26/jsp_multiple_select/</link>
		<comments>http://www.zhlwish.com/2009/11/26/jsp_multiple_select/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 16:56:19 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=93</guid>
		<description><![CDATA[在select标签中添加multiple=”multiple”属性，可以使下拉列表（drop down list）变成多选列表（multiple select list），但是在jsp与servlet中使用获取表单值常用的request.getParameter(“value”)获取到的只是多选列表中的第一个选中值，经过查询资料，原来HttpServletRequest还有一个方法getParameterValues(String key)，其返回值为String类型的数组，里面存放的正是多选列表中的选中的值。 也就是说，jsp和servlet中对于表单中的多选控件提交的值都是通过此getParameterValues方法来获取的，比如checkbox list（复选框列表）等，示例代码如下： &#60;form action=”index.jsp” method=”POST”&#62;     &#60;select name=”value” multiple=”multiple”&#62;         &#60;option value=”val1&#8243;&#62;Value 1&#60;/option&#62;         &#60;option value=”val2&#8243;&#62;Value 2&#60;/option&#62;         &#60;option value=”val3&#8243;&#62;Value 3&#60;/option&#62;         &#60;option value=”val4&#8243;&#62;Value 4&#60;/option&#62;         &#60;option value=”val5&#8243;&#62;Value 5&#60;/option&#62;      &#60;/select&#62;      &#60;input type=”submit” &#8230; <a href="http://www.zhlwish.com/2009/11/26/jsp_multiple_select/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/26/jsp_multiple_select/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF异常消息机制及应用</title>
		<link>http://www.zhlwish.com/2009/11/18/jsf_message/</link>
		<comments>http://www.zhlwish.com/2009/11/18/jsf_message/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 02:49:46 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[web后台]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=77</guid>
		<description><![CDATA[JSF有两种异常消息： [1] JSF提供的标准异常信息，如标准的验证器和转换器生成的异常信息等 [2] 自定义的异常信息 与消息相关的类是javax.faces.application.FacesMessage，他封装了单一的、本地化的、人类可以理解的消息，除了消息字符串本身外，FacesMessage还有三个属性：severity(严重性),summary（摘要）,detail（详细信息） serverity被定义成FacesMessage的内部类，有四种类型：Info、Warn、Error、Fatal FacesContext负责维护FacesMessage的两个逻辑集合，一个和组件相关的消息集合、一个不与组件相关的消息集合，定义了如下的和消息相关的方法 public Iterator&#60;FacesMessage&#62; getMessages(); public Iterator&#60;FacesMessage&#62; getMessages(String clientId); public Iterator&#60;String&#62; getClientIdsWithMessages();//返回有消息绑定的组件id public void addMessage(String clientId, javax.faces.application.FacesMessage message);//向FacesContext中加入一条FacesMessage public FacesMessage.Severity getMaximumSeverity();//返回最严重的问题的严重性 FacesMessage的部分源代码如下： private FacesMessage.Severity _severity; private String _summary; private String _detail; public FacesMessage() { &#8230; <a href="http://www.zhlwish.com/2009/11/18/jsf_message/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/18/jsf_message/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>session、cookie与“记住我的登录状态”的功能的实现</title>
		<link>http://www.zhlwish.com/2009/11/15/remember-me/</link>
		<comments>http://www.zhlwish.com/2009/11/15/remember-me/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 01:33:02 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[web后台]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=59</guid>
		<description><![CDATA[Cookie的机制 Cookie是浏览器（User Agent）访问一些网站后，这些网站存放在客户端的一组数据，用于使网站等跟踪用户，实现用户自定义功能。 Cookie的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的；Cookie的Expires属性标识了Cookie的有效时间，当Cookie的有效时间过了之后，这些数据就被自动删除了。 如果不设置过期时间，则表示这个Cookie生命周期为浏览器会话期间，只要关闭浏览器窗口，Cookie就消失了。这种生命期为浏览会话期的Cookie被称为会话Cookie。会话Cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间，浏览器就会把Cookie保存到硬盘上，关闭后再次打开浏览器，这些Cookie依然有效直到超过设定的过期时间。存储在硬盘上的Cookie可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存的Cookie，不同的浏览器有不同的处理方式。 Session的机制 Session是存放在服务器端的类似于HashTable结构（每一种Web开发技术的实现可能不一样，下文直接称之为HashTable）来存放用户数据，当浏览器第一次发送请求时，服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable，并将其通过响应发送到浏览器。当浏览器第二次发送请求，会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上，服务器从请求中提取出Session ID，并和保存的所有Session ID进行对比，找到这个用户对应的HashTable。 一般情况下，服务器会在一定时间内（默认20分钟）保存这个HashTable，过了时间限制，就会销毁这个HashTable。在销毁之前，程序员可以将用户的一些数据以Key和Value的形式暂时存放在这个HashTable中。当然，也有使用数据库将这个HashTable序列化后保存起来的，这样的好处是没了时间的限制，坏处是随着时间的增加，这个数据库会急速膨胀，特别是访问量增加的时候。一般还是采取前一种方式，以减轻服务器压力。 Session的客户端实现形式（即Session ID的保存方法） 一般浏览器提供了两种方式来保存，还有一种是程序员使用HTML隐藏域的方式自定义实现： [1] 使用Cookie来保存，这是最常见的方法，本文“记住我的登录状态”功能的实现正式基于这种方式的。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置这个过期时间，那么这个Cookie将不存放在硬盘上，当浏览器关闭的时候，Cookie就消失了，这个Session ID就丢失了。如果我们设置这个时间为若干天之后，那么这个Cookie会保存在客户端硬盘中，即使浏览器关闭，这个值仍然存在，下次访问相应网站时，同样会发送到服务器上。 [2] 使用URL附加信息的方式，也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置Cookie过期时间是一样的。 [3] 第三种方式是在页面表单里面增加隐藏域，这种方式实际上和第二种方式一样，只不过前者通过GET方式发送数据，后者使用POST方式发送数据。但是明显后者比较麻烦。 实现“记住我的登录状态”的功能 前面我们了解到，如果我们将Session ID通过Cookie发送到客户端的时候设置其过期时间为1年，那么在今后的一年时间内，客户端访问我的网站的时候都回将这个Session ID值发送到服务器上，服务器根据这个Session ID从内存或者数据库里面恢复存放Key-Value对的Hashtable。 其实这已经很好的实现了我们的功能了。但是，前面也提到了，实际上Session并不会一直都存在的，过了一定的时间之后，服务器上的Session就被销毁了，以减轻服务器的访问压力。当服务器上的数据被销毁后，即使客户端上存放了Cookie也没有办法“记住我的登录状态”了。 通用的实现办法是，将用户的用户名和加密之后的密码也通过Cookie的方式存放在客户端，当服务器上的Session销毁以后，使用Cookie里面存放的用户名和加密之后的密码重新执行一次登录操作，重建Session，并更新客户端上Cookie中存放的的Session ID，而这个操作是发生在用户请求一个需要身份验证的页面资源的背后，对于用户来讲是透明的，于是就达到了“记住我的登录状态”的目的了。 到目前为止，已经基本明确了“记住我的登录状态”的实现方式和理论依据，后文将使用jsp和php两种Web开发技术来具体实现这个功能。 本文是本博客原创文章，您可以自由转载，但转载请注明来源。]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/15/remember-me/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP的特点与发展的草根性</title>
		<link>http://www.zhlwish.com/2009/11/15/php/</link>
		<comments>http://www.zhlwish.com/2009/11/15/php/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 01:30:21 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=57</guid>
		<description><![CDATA[一直以来都有一个疑问，就是为什么PHP的需求这么多？会有这个疑问，是因为我发现有很多可以合作的机会都是基于PHP的，而我对于PHP技术跟本就不了解。最近有个朋友去了一家公司实习，也是做PHP——这个极大的刺激了我，于是我对比了一下我熟悉的各种Web开发框架（包括ASP,ASP.NET,JSP,Ruby on Rails, Django），发现PHP的发展充满了“草根”特性，以至于很多人都忽略了它。 首先，任何一门技术要使用都需要学习，从学习成本上讲，PHP无疑是最小的，我花了半个小时浏览了W3School的PHP教程的基础部分，花了十几分钟看了看PHP如何连接MySQL数据库，就写出了一个简单的有登录、退出功能的网站，当然在写的过程的不断的在查API。想想学习C#、ruby、python、java、vbscript都得花一个星期或者更长的时间的时候，不禁心里想要是一开始就用了PHP该有多好啊。这几个当中，我自己认为学习难度排序是:(括号中的算是一个数量级的，如果JSP再包括struts、hibernate、spring等这些的话，那么Java又比ASP.NET要高上一个数量级了)。(JSP&#62;ASP.NET)&#62;(Python&#62;ruby)&#62;(ASP&#62;PHP) 我们在比较多种技术的时候往往只是很简单的比较其开发难度，而忽视服务器维护难度和成本。试想，企业本身有一个JSF+Hibernate+Spring架构的OA系统，如果开发者或者维护者一旦离职，继任着得如何上得了手？但是如果是PHP就不一样了，看一看语法，马上就可以开始工作了，这也迎合了目前大部分公司的需要。 其次，市场需求直接决定了开发群体的大小，中国互联网最多的需求都是一些很朴实的需求——一个主页、一个简单的办公系统，中小型企业没有能力和意识去发展自身的信息化，往往只需要一个主页和一个简单办公系统而已，而且在非IT中小企业，互联网营销并没有得到管理者的重视，所以IT人员往往处于很低的地位，往往也只有几个人或者根本没有人。这样的需求PHP能很好的满足了，而且简单直接。 再次，运行成本低，自己架设服务器基本只需要电脑费用、电费、网费，托管服务器价格更便宜，一个月几十块钱就行了。而且容量大，普通PC就可以承受一定的并发需求，不需要配置专门的服务器。前面我提到的那个JSF的OA系统部署的时候就需要1G的内存，这个网站是几年前开发的，那时候内存最大还是512M，想想都有点后怕。 正因为上面几个原因，PHP的发展不是大公司的推动（像IBM推SOA），也不是像若干年前的Java（技术比较先进，相比同时期的ASP功能强大得多），它的发展有着很深厚的群众基础，预计未来的几年在中国Web市场上还将有大的需求。 不过，也因为技术的发展，很多很多额外的因素被添加到PHP中，像面向对象、各种各样的框架等，使PHP不可避免的走向复杂，如何保持其草根性、其简洁决定了PHP能走多远。]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/15/php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thickbox在IE8下不垂直居中的解决办法</title>
		<link>http://www.zhlwish.com/2009/11/15/thickbox-ie8-vertical-align/</link>
		<comments>http://www.zhlwish.com/2009/11/15/thickbox-ie8-vertical-align/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 01:12:46 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[web前端]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=41</guid>
		<description><![CDATA[这个问题应该是ie8和ie7都有同样的问题，http://jamazon.co.uk/web/2008/03/17/thickbox-31-ie7-positioning-bug/，这篇文章做了很详细的说明，而且提供了补丁，但是这个补丁在ie8下面依然有问题，出现这个问题应该是因为在ie8下，thickbox仍然当作ie6来处理，我在开头加了一个判断，如下： $.browser.msie6 = $.browser.msie &#38;&#38; /MSIE 6\.0/i.test(window.navigator.userAgent) &#38;&#38; !/MSIE 7\.0/i.test(window.navigator.userAgent) &#38;&#38; !/MSIE 8\.0/i.test(window.navigator.userAgent); 修正后的补丁下载：jquery.thickbox.js]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/15/thickbox-ie8-vertical-align/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java读取文件的编码问题</title>
		<link>http://www.zhlwish.com/2009/11/15/java-file-encoding/</link>
		<comments>http://www.zhlwish.com/2009/11/15/java-file-encoding/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 00:53:57 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=29</guid>
		<description><![CDATA[在Java的文件操作中，如果一个文件是UTF-8格式，那么一定要使用UTF-8的编码格式去读取，如果按其他格式读取之后再做转换，可能会发生不可预料的问题，如“乱码”，具体原因我没有搞清楚，因为JDK读取文件时采用了sun.nio.cs.StreamDecoder这个类，这个是sun公司的代码实现，并没有源代码可以参考。 下面就两种方式做记录： 1.Java按一定编码读取文件 InputStream is = Main.class.getResourceAsStream(fileName); BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8")); String tmp; while((tmp = br.readLine()) != null){     System.out.println(tmp); } 2.Java字符串编码转换 FileReader reader = new FileReader(fileName); BufferedReader br = new BufferedReader(reader); String tmp; while((tmp = br.readLine()) != &#8230; <a href="http://www.zhlwish.com/2009/11/15/java-file-encoding/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/15/java-file-encoding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jquery truncate插件生成日志概要的中文问题</title>
		<link>http://www.zhlwish.com/2009/11/15/jquery-truncate-chinese/</link>
		<comments>http://www.zhlwish.com/2009/11/15/jquery-truncate-chinese/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 00:49:25 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[web前端]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=26</guid>
		<description><![CDATA[以前的系统采用自己写的一个trancate的django filter，简单的对html标签进行了匹配处理，效果很是不理想，而且有时因为部分标签没有结束符导致整个页面的布局混乱，很费脑筋。 今天偶然逛到一个叫做 帕蓝映像 的网站，看到有个jquery插件叫做truncate，居然可以生成日志概要，立即下载试用了一把，果然不错（现在我的网站已经采用了这种做法，读者可以使用一下），而且使用非常简单。  jquery插件truncate网址 不过，在对于短文本生成概要的时候，遇到一个问题，js会进入一个无穷循环，调试很痛苦，因为一不小心浏览器就死掉了，在断点调试之后发现应该是“中文”的正则表达式匹配的问题，解决代码如下： $(“.comment_summary”).truncate(10, {     chars: /[^x00-xff]/,     trail: [ "...&#60;a href='#' class='truncate_show'&#62;(more)&#60;/a&#62;", "&#60;a href='#' class='truncate_hide'&#62;(hide)&#60;/a&#62;" ] }); 另外，还有一个很有用的网址也附上 常用的JavaScript验证正则表达式]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/15/jquery-truncate-chinese/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DIV与SPAN垂直居中对齐</title>
		<link>http://www.zhlwish.com/2009/11/15/div-vertical-align/</link>
		<comments>http://www.zhlwish.com/2009/11/15/div-vertical-align/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 00:46:40 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[web前端]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=23</guid>
		<description><![CDATA[    水平居中很简单，设置text-align:center就可以了，但是垂直居中一直都不得其解！ 以前总是尝试着调padding-top,但是有的时候好使，更多的时候不行，今天同样，当height值不大时，增加padding-top就会增加了整个DIV或者SPAN的高度，很恼火！ 正在想理论上vertical-align的默认值应该是baseline啊，不会顶对齐啊，突然想起字体有个line-height属性，于是很显然其默认值就是一个字那么高，于是将line-height值改得和DIV或者SPAN的height相同！ 于是，DIV和SPAN中的文字垂直居中对齐了！ 后来在百度里面一搜，耐着性子多翻了几页，终于在一个不大论坛里面发现了同样的方法！要是以前能耐心一点不早就搞定这个问题了么，何必还浪费这么多时间？让人又想起了贝尔发明电话的老故事&#8230;sigh&#8230;不想了！]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/15/div-vertical-align/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>网站实现文件下载防盗链以及防爬虫</title>
		<link>http://www.zhlwish.com/2009/11/15/anti-leech/</link>
		<comments>http://www.zhlwish.com/2009/11/15/anti-leech/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 00:44:00 +0000</pubDate>
		<dc:creator>周亮</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[防盗链]]></category>

		<guid isPermaLink="false">http://www.zhlwish.com/?p=21</guid>
		<description><![CDATA[在google华莽用户组看到关于这个话题的文章，中间提到一种办法很简单实用，而且和Web服务器完全解耦，在任何平台下都可以通用，记录如下： 首先，在数据库中保存真实地址的hash值，在网页上只显示hash值，提交后根据hash再找到真实地址，返回重定向反馈。这一步实现了URL的隐藏，但是对于有些下载工具（如迅雷），可以找出hash地址和重定向地址。 然后，将网页显示url增加一个参数，编程http://www.aa.com/down/hashkey.mp3?key=123，其中key的值是MD5加密当前日期或者是时间（不能太过于精确了，不然一个网页打开几分钟链接就失效了）的值，提交到服务器之后，Web应用程序再对服务器日期或者时间进行MD5加密，然后对比，如果发现不一致，那么肯定是有人（或者爬虫）把你的链接盗用过去了。 这样即使是下载工具找到了你的重定向地址也失效了，就防止了盗链和爬虫了。]]></description>
		<wfw:commentRss>http://www.zhlwish.com/2009/11/15/anti-leech/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.aa.com/down/hashkey.mp3?key=123" length="0" type="audio/mpeg" />
		</item>
	</channel>
</rss>

