<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye论坛最新讨论</title>
    <description>JavaEye论坛最新讨论 - Java编程，Ruby编程，微软.net，AJAX，敏捷软件开发，综合软件技术</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>现在用grails来做项目是不是太激进</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vansention.javaeye.com">范三山</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250349" style="color:red;">http://www.javaeye.com/topic/250349</a>&nbsp;
          发表时间: 2008年10月08日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在要做一个互联网的项目，不是很大。人员大概就是两个java程序员，美工另算。我一直以为，用java来做中小型的互联网项目不是一个明智的选择。这个项目如果我们按照以往的方法不外乎是struts2+spring+hibernate，我觉得效率不是很高。<br />&nbsp;&nbsp;&nbsp; 我前一段时间自己弄过一下grails，写了一个blog程序，感觉非常棒。我想这个项目用grails十分的不错，因为时间比较紧，用grails来做会非常的快。但是我现在有一些担心<br />&nbsp;&nbsp;&nbsp; 1.grails的性能问题，不过我不太相信瓶颈会出现在程序端，怎么说也是数据库先有瓶颈。<br />&nbsp;&nbsp;&nbsp; 2.将来的维护问题，如果我们不在了维护的人还得学grails。<br />&nbsp;&nbsp;&nbsp; 3.ide不怎么好用，几乎是完全没有作用。我写grails程序一般用netbeans，不知道那位老兄会不会不习惯。IntelliJ IDEA是不会考虑的，实在没有兴趣去搞注册码。<br />&nbsp;&nbsp;&nbsp; 虽然很看好grails，但是还是会有些担心，不知道大家怎么看的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250349" style="color:red;">已有 <strong>53</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 15:47:12 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250349</link>
        <guid>http://www.javaeye.com/topic/250349</guid>
      </item>
          <item>
        <title>大家帮忙看一下吧,这样的简历能找个什么样的工作</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://infinity.javaeye.com">infinity</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252419" style="color:red;">http://www.javaeye.com/topic/252419</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          毕业生找工作,没啥经验,对自己把握不足,请大家帮忙看看,这样的简历在北京能找个什么样的公司,大概能拿多少月薪,谢谢!<br />(简历内容基本没有水分,欢迎拍砖提意见,呵呵.)<br />------------------------<br />申请职位: 软件工程师<br /><br />个人信息 : <br />姓名: ** [**]<br />出生日期: ************<br />性别: 男<br />移动电话: ************<br />电子邮件: ************<br /><br />个人特点 :<br />勤奋好问, 热爱程序设计和IT事业, 能够快速学习掌握新技术;<br />具备扎实的计算机理论基础, 具有一定的开发和测试工作经验, 善于解决棘手问题;<br />工作负责, 办事仔细, 具有良好的团队精神.<br /><br />职业目标 :<br />首先努力成为一名经验丰富的程序员, 然后做一名优秀的软件架构设计师.<br /><br />教育背景 :<br />2006.9 - 至今	免试推荐至北京XX大学研究生院攻读计算机软件理论硕士学位.<br />2002.9 - 2006.7 	于北京XX大学信息学院计算机科学与技术系攻读工学学士学位.<br /><br />专业技能 :<br />* 3年以上的实际项目开发经验.<br />* 1年以上的软件测试开发工程师实习经验.<br />* 熟悉Java语言和基于J2SE的Java开发技术.<br />* 熟悉Rational Function Tester以及自动化测试的实施, 熟悉测试理论和一般测试流程.<br />* 熟悉基于J2EE标准的Java Web开发, 包括JSP, Servlet, JavaBean, JSTL.<br />* 熟悉Struts, Hibernate框架并具有一定实际开发经验, 了解Spring框架.<br />* 熟悉常用Java开源组件和工具, 如Log4j, Ant, JUnit, JFreeChart, JForum, mvnForum等.<br />* 熟悉基于AWT/Swing, SWT/JFace的GUI应用程序开发, 了解Eclipse Plugin机制和Eclipse RCP开发.<br />* 熟悉XML, 熟悉基于DOM模式和SAX模式的XML编程.<br />* 熟悉JavaScript, 熟悉基于DIV+CSS标准的Web UI模式.<br />* 熟悉Linux, 能够在命令行下熟练的进行开发和部署工作, 配置常用的服务(www, db, ftp, cvs).<br />* 熟练使用vi, 熟悉shell命令和shell脚本, 能够进行简单的shell编程.<br />* 熟悉Tomcat, 了解WebSphere, JBoss的配置和管理.<br />* 熟悉SQL语言, 熟悉数据库编程, 熟练使用MySQL和MSSQL, 了解DB2的部署和管理.<br />* 熟悉常用的设计模式, 能够在不同开发场景中合理选择应用.<br />* 熟悉UML建模, 熟练使用Rational Rose.<br />* 扎实的计算机理论基础.<br />* 良好的面向对象设计和开发能力.<br />* 具备一定的C/C++控制台程序, VC/VB桌面应用程序和基于ASP技术的Web应用程序开发经验.<br /><br />外语能力 :<br />通过国家英语六级, 具有良好的英语听说读写能力.<br /><br />实习&amp;项目经历 : <br />* 2007.10 - 2008.9	IBM中国软件研发中心BI Team - 软件测试开发<br />IBM DB2 Data Warehouse Edition (DWE)提供了一种包含数据仓库和挖掘工具的基础架构, 使大中型企业能在其之上构建自己的数据分析应用. DWE主要包括SQL Warehouse(SQW), Cube View(CV), Intelligence Mining(IM)三部分, IBM CSDL BI Team主要负责DWE的产品质量保证以及DWE辅助工具的研发.<br />主要职责:<br />1. 拓展了基于RFT(Rational Function Tester)的基础自动化测试框架, 提出一种数据模型驱动测试的概念, 并独立将其实现并整合到测试框架中, 取得了良好的实施效果.<br />2. 负责测试框架的维护以及自动化测试用例的开发.<br />3. 负责多平台的测试环境的搭建(Win2003, Linux, AIX, Solaris), 产品的部署(WebSphere, DB2).<br /><br />* 2005.6 - 2005.9	北京汉王科技有限公司 - 软件测试<br />汉王科技有限公司立足于模式识别领域, 专注于手写, 语音, OCR, 生物特征等识别技术的研究和推广, 拥有多项国际领先的核心技术和自主知识产权.<br />主要职责:<br />1. 参与了汉王嵌入式OCR文字识别核心的测试工作.<br />2. 使用VC/MFC开发了一个测试辅助工具(自动统计OCR文字识别核心的识别成功率), 提高了整个测试团队的工作效率.<br />3. 学习Rational Rose, 负责翻译了部分Rational Rose 英文用户手册.<br /><br />* 2007.9 - 2008.7	基于GPS/GPRS/GIS的车辆调度管理解决方案 - 系统开发<br />基于GPS/GPRS/GIS的车辆调度管理解决方案由车载终端和监控中心端构成, 车载终端是一个集成GPRS、GPS模块的硬件设备, 而监控中心端是一套基于GIS技术的车辆监控系统. 车载终端通过卫星获取GPS定位数据, 经由GPRS数据链路将包含车辆定位坐标及附加信息的数据包发送至监控中心端, 由监控中心软件系统处理GPS定位数据并将车辆位置显示于GIS地图上. 监控中心可以给车载终端发送调度信息, 并且能够对所有的车辆信息进行管理.<br />主要职责:<br />1. 独立负责需求采集、解决方案设计、软件架构设计.<br />2. 设计数据传送方式, 并定义数据包的信息结构.<br />3. 负责监控中心端车辆调度管理系统的实现, 使用了SWT/JFace技术、ArcGIS Engine组件.<br /><br />* 2007.8 - 2007.10	帮帮365分类信息网 - Web应用开发<br />帮帮365分类信息网是一个综合各种信息的网络平台, 将用户发布的各种交友联谊、房屋租赁、企业宣传以及一般的供求信息加以分类处理, 以方便快捷的形式提供. 该Web应用采用JSP/Servlet, Ajax技术, MVC模式实现.<br />主要职责:<br />1. 与客户沟通, 采集需求和处理需求变更.<br />2. 完成用户权限模型设计, 以及信息数据模型设计.<br />3. 独立完成网站后台管理系统的设计和实现, 采用mvnForum搭建网站论坛.<br />4. 完成该应用在Linux服务器上的部署以及后期维护工作.<br /><br />* 2007.6 - 2007.11	国家林业局北京沙产业协会官网 - Web应用开发<br />北京沙产业协会是国家林业局下属机构, 负责推广林业生产和风沙治理相关的产品和技术, 应其要求为其建设一个集产业宣传推广、会员发展和管理、信息产品交流于一体的网上平台. 该应用采用JSP, Struts和Hibernate技术构建.<br />主要职责:<br />1. 项目主要负责人, 协调团队完成从需求采集、系统设计、系统实现到部署安装的全部工作.<br />2. 完成数据库设计、系统架构设计以及角色权限设计.<br />3. 实现会员注册管理、产品信息发布、用户网上交流等核心模块.<br />4. 独立完成网站UI设计.<br /><br />* 2006.10 - 2007.3	EGOV 办公自动化系统 - 代码维护 &amp; 功能拓展<br />EGOV办公自动化系统是一套基于ASP技术的OA系统, 内嵌一套小型工作流引擎, 可辅助处理中小型公司的日常事务. 应北京嘉友房地产公司要求, 对其原有系统进行维护, 拓展公文处理, 人事管理, 绩效考核等功能模块.<br />主要职责:<br />1. 修正原有系统中公文流转处理模块中的Bug, 增加工程清单附件传送功能.<br />2. 负责设计和实现人事管理模块和绩效考核模块.<br />3. 负责与客户联络沟通, 处理客户的需求变更.<br /><br />* 2006.3 - 2006.7	PetriFlow工作流管理系统 - 工作流图形化显示 &amp; XML文件解析 &amp; 数据持久化<br />PetriFlow工作流管理系统采用Spring, Hibernate, Struts, MySQL 等技术构建, 使用了开源项目Shark和JAWE的部分组件. 系统对XPDL协议(工作流过程的XML描述)进行解析, 将XPDL定义的工作流信息转换为Web图形显示, 并可对工作流的执行进行控制和管理.<br />主要职责:<br />1. 将XML描述的XPDL 进行解析.<br />2. 根据XPDL节点元素关联关系, 设计数据库和对象映射模型将工作流信息持久化. <br />3. 利用JAWE的组件将XPDL定义的工作流信息转化为Web图形显示.<br /><br />* 2005.10 - 2007.3	中军门禁管理系统 - 系统开发<br />中军门禁管理系统采用VC/MFC技术开发, 应用于一些对安全性要求较高的机构. 系统通过磁卡、照片以及指纹, 记录和辨认进出的人员和车辆, 提供完善的门禁管理服务.<br />主要职责:<br />1. 完成车辆登记模块和员工管理模块的设计和实现.<br />2. 与客户进行沟通, 采集需求, 当需求变更时, 对系统进行修改维护.<br /><br />奖项荣誉 :<br />2006年 北京XX大学”XX”奖学金.<br />2005年 北京XX大学二等奖学金.<br />2005年 北京XX大学”三好标兵”.<br />2004年 北京XX大学一等奖学金.<br />2004年 北京XX大学”三好标兵”.<br />2003年 北京XX大学二等奖学金.<br /><br />社团工作 :<br />2007.9 - 至今	北京XX大学信息学院研究生会体育部.<br />2006.9 - 2007.9	北京XX大学信息学院研究生会实践部.<br />2005.9 - 2006.7	班级助管, 就业联系人.
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252419" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 23:25:51 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252419</link>
        <guid>http://www.javaeye.com/topic/252419</guid>
      </item>
          <item>
        <title>hibernate一直的疑问</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nlvivian.javaeye.com">nlvivian</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251460" style="color:red;">http://www.javaeye.com/topic/251460</a>&nbsp;
          发表时间: 2008年10月10日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 <br /><br />用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化. <br />用户B访问B机,创建了一个session.并对tableA做更新操作. <br />用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗?
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251460" style="color:red;">已有 <strong>6</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Oct 2008 21:16:49 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251460</link>
        <guid>http://www.javaeye.com/topic/251460</guid>
      </item>
          <item>
        <title>表单域与json数据间的交互</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://johncon.javaeye.com">johncon</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250780" style="color:red;">http://www.javaeye.com/topic/250780</a>&nbsp;
          发表时间: 2008年10月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>找了几个javascript的框架，都没有找到我想要的： <br />提供函数，把某个表单的所有域封装成json数据格式的对象，唯有自己实现一个。 <br /><br />包括对象中有集合属性、对象中引用其他对象属性：&nbsp;</p>
<p>&nbsp;</p>
<pre name="code" class="js">/**
**json对象数据设置到表单域中
*/
function jsonObjectToForm(form, jsonObject){
	for(i = 0, max = form.elements.length; i &lt; max; i++) {
		e = form.elements[i];
		eName = e.name;
		if(eName.indexOf('.') &gt; 0){
			dotIndex = eName.indexOf('.');
			parentName = eName.substring(0, dotIndex);
			childName = eName.substring(dotIndex+1);
			//迭代判断eName，组装成json数据结构
			eValue = iterValueFromJsonObject(jsonObject, parentName, childName);
		}else{
			eValue = jsonObject[eName];
		}
		if(eValue &amp;&amp; eValue != "undefined" &amp;&amp; eValue != "null"){
			switch(e.type){
				case 'checkbox': 
				case 'radio': 
					if(e.value == eValue){
						e.checked = true;
					}
					break;
				case 'hidden': 
				case 'password': 
				case 'textarea':
				case 'text': 
					e.value = eValue;
					break;
				case 'select-one':
				case 'select-multiple':
					for(j = 0; j &lt; e.options.length; j++){
						op = e.options[j];
						//alert("eName : " + eName + "; op value : " + op.value + "; eValue : " + eValue);
						if(op.value == eValue){
							op.selected = true;
						}
					}
					break;
				case 'button': 
				case 'file': 
				case 'image': 
				case 'reset': 
				case 'submit': 
				default:  
			}
		}
	}
}

/**
* json数组读写有两种方式
* 1: a.bs[0].id
* 2: a["bs"][0]["id"]
* 把表单转换成json数据格式
*/
function formToJsonObject(form){
	var jsonObject = {};
	for(i = 0, max = form.elements.length; i &lt; max; i++) {
		e = form.elements[i];
		em = new Array();
		if(e.type == 'select-multiple'){
			for(j = 0; j &lt; e.options.length; j++){
				op = e.options[j];
				if(op.selected){
					em[em.length] = op.value;
				}
			}
		}
		switch(e.type){
			case 'checkbox': 
			case 'radio': 
				if (!e.checked) { break; } 
			case 'hidden': 
			case 'password': 
			case 'select-one':
			case 'select-multiple':
			case 'textarea':
			case 'text': 
				eName = e.name;
				if(e.type == 'select-multiple'){
					eValue = em;
				}else{
					eValue = e.value.replace(new RegExp('(["\\\\])', 'g'), '\\$1');
				}
				//判断是否是对象类型数据
				if(eName.indexOf('.') &gt; 0){
					dotIndex = eName.indexOf('.');
					parentName = eName.substring(0, dotIndex);
					childName = eName.substring(dotIndex+1);
					//迭代判断eName，组装成json数据结构
					iterJsonObject(jsonObject, parentName, childName, eValue);
				}else{
					jsonObject[eName] = eValue;
				}
				break; 
			case 'button': 
			case 'file': 
			case 'image': 
			case 'reset': 
			case 'submit': 
			default:  
		}
	}
	return jsonObject;
}

/**
* 把表单元素迭代转换成json数据
*/
function iterJsonObject(jsonObject, parentName, childName, eValue){
	//pArrayIndex用于判断元素是否是数组标示
	pArrayIndex = parentName.indexOf('[');
	//判断是否集合数据，不是则只是对象属性
	if(pArrayIndex &lt; 0){
		var child = jsonObject[parentName];
		if(!child){
			jsonObject[parentName] = {};
		}
		dotIndex = childName.indexOf('.');
		if(dotIndex &gt; 0){
			iterJsonObject(jsonObject[parentName], childName.substring(0, dotIndex), childName.substring(dotIndex+1), eValue);
		}else{
			jsonObject[parentName][childName] = eValue;
		}
	}else{
		pArray = jsonObject[parentName.substring(0, pArrayIndex)];
		//若不存在js数组，则初始化一个数组类型
		if(!pArray){
			jsonObject[parentName.substring(0, pArrayIndex)] = new Array();
		}
		//取得集合下标，并判断对应下标是否存在js对象
		arrayIndex = parentName.substring(pArrayIndex+1, parentName.length-1);
		var c = jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex];
		if(!c){
			jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex] = {};
		}
		dotIndex = childName.indexOf('.');
		if(dotIndex &gt; 0){
			iterJsonObject(jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex], childName.substring(0, dotIndex), childName.substring(dotIndex+1), eValue);
		}else{
			jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex][childName] = eValue;
		}
	}
}

/**
* 迭代json数据对象设置到表单域中
*/
function iterValueFromJsonObject(jsonObject, parentName, childName){
	//pArrayIndex用于判断元素是否是数组标示
	pArrayIndex = parentName.indexOf('[');
	//判断是否集合数据，不是则只是对象属性
	if(pArrayIndex &lt; 0){
		dotIndex = childName.indexOf('.');
		if(dotIndex &gt; 0){
			return iterValueFromJsonObject(jsonObject[parentName], childName.substring(0, dotIndex), childName.substring(dotIndex+1));
		}else{
			return jsonObject[parentName][childName]
		}
	}else{
		pArray = jsonObject[parentName.substring(0, pArrayIndex)];
		//取得集合下标，并判断对应下标是否存在js对象
		arrayIndex = parentName.substring(pArrayIndex+1, parentName.length-1);
		var c = jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex];
		dotIndex = childName.indexOf('.');
		if(dotIndex &gt; 0){
			return iterValueFromJsonObject(jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex], childName.substring(0, dotIndex), childName.substring(dotIndex+1));
		}else{
			return jsonObject[parentName.substring(0, pArrayIndex)][arrayIndex][childName]
		}
	}
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>欢迎大家讨论，最近在研究jsp页面纯净，只与js有关，但这将导致rich client</p>
<p>&nbsp;</p>
<p>so bad&nbsp; 不知道有什么好的建议没&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250780" style="color:red;">已有 <strong>21</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Oct 2008 15:14:28 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250780</link>
        <guid>http://www.javaeye.com/topic/250780</guid>
      </item>
          <item>
        <title>再谈IOC</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bloodrate.javaeye.com">bloodrate</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252418" style="color:red;">http://www.javaeye.com/topic/252418</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天看POJOs IN ACTION书中有类似这样一段话“传统的J2EE应用程序使用JNDI作为一个组件访问另外一个组件的依据，比如JNDI访问EJB组件，JNDI访问Datasource获取服务器上的数据库连接池中的连接，但是JNDI的弱点在于它把应用程序和应用服务器耦合在一起，难于测试和维护。而Spring提供的IOC可以提供一种更为灵活的一个组件访问一个另一个组件的机制，并且与应用服务器脱离耦合。”<br /><br />那么我可以简要分析出，IOC是某种意义上是作为JNDI的取代品出现的，这也和Martin Fowler对IOC的讲法一致：IOC作为一个系统中“组件插槽”的身份出现的，IOC鼓励程序员基于组建开发督促程序员多写POJO，而绝非是DaoFactory这样的工厂类替代品。<br /><br />那么我产生疑惑，IOC作为一个系统访问各个基础组件的访问机制，是否能起到真正作用呢？是否它真的比JNDI强呢？考虑这样一种情况：如果一个很大型的系统，有很多子系统，而这些子系统有公用了一些服务，由你来开发这个服务。<br />如果是JNDI，你将服务部单独署在应用服务器里，然后告诉每个系统负责人你的JNDI，他们就可以访问使用，如若你想维护更新修改你的服务，你只需进行自己的修改而不用告诉大家，因为大家只用你的jndi接口。如果是IOC，你维护了你自己写的服务，还要告诉大家“喂，开会了，大家把我新写的JAR拷走吧，部署在你们的classpath下”这看起来没什么，但是子系统多了，难免出现版本混乱问题。<br /><br />我是觉得IOC确实看起来只像是一个工厂，而不像一个注册服务的地方。至少它没能让服务组件实现“可单独维护”，反而JNDI接近服务理念，服务的目的就是服务的变化相对于服务使用者透明。。。。。。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252418" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 23:12:19 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252418</link>
        <guid>http://www.javaeye.com/topic/252418</guid>
      </item>
          <item>
        <title>IOC?真的IOC了？还是Factory?</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yananay.javaeye.com">yananay</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252235" style="color:red;">http://www.javaeye.com/topic/252235</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在google上搜索 “spring ioc”，会出来一堆堆的搜索结果，随便点哪一个进去，都会看到这样的教程：<br /><br /><pre name="code" class="java">
ClassA a = (ClassA) beanFactory.getBean("A");
</pre><br /><br />ok, 教程中都说这是Spring的ioc用法， ClassA 是被 Spring管理的，ClassA中的需要set的变量都是“自动注入”的，例如：<br /><br /><pre name="code" class="java">
public class ClassA {
  private ClassB b;
  public void setB(ClassB b) {
    this.b = b;
  }
}
</pre><br /><br />所有的教程，文档，甚至Spring的文档，都说这是 <strong>IOC</strong>。<br /><br />但是很少有人提及这一点：<strong>beanFactory.getBean("A") 是一个工厂模式</strong>。<br /><br />前一阵经过梁兄的指点，俺才发现：<strong>这明明就是工厂模式呀</strong>！也就是说你要使用 IOC，前提是要使用工厂模式。虽然 ClassA 是被自动装配的，但那之前，你必须使用工厂模式来得到装配后的 ClassA。<br /><br />换个比喻来说：如果你要使用一个手枪，必须先用火柴去点燃手枪里的火药。<br /><br />不晓得大家对这个问题怎么个看法，至少俺觉得有些别扭，其实我们完全可以不使用工厂模式。考虑下面这个类：<br /><br /><pre name="code" class="java">
public class StandardConfiguration {

	private static Logger logger = Logger.getLogger(StandardConfiguration.class);
	
	private ImportBusiness importBusiness;
	
	public StandardConfiguration(BeanFactory beanFactory) {
		
		Method[] methods = getClass().getMethods();
		
		for(Method method : methods) {
			
			String methodName = method.getName();
			Class returnType = method.getReturnType();
			if(methodName.startsWith("get")) {
				
				String fieldName = getFieldName(methodName);
				
				Object bean = null;
				try {
					bean = beanFactory.getBean(fieldName);
					
				} catch (NoSuchBeanDefinitionException e) {
					
					logger.debug("StandardConfiguration - " + fieldName + " NoSuchBeanDefinitionException, ignore.");
					continue;
				}
				
				String setMethodName = "set" + createFieldMethodVar(fieldName);
				
				Method setMethod = null;
				try {
					setMethod = getClass().getMethod(setMethodName, new Class[]{returnType});
					setMethod.invoke(this, bean);
					
				} catch (NoSuchMethodException e) {
					
					logger.debug("StandardConfiguration - " + fieldName + " has no set method.");
					
				} catch (InvocationTargetException e) {
					
					logger.error("StandardConfiguration - " + fieldName + " invoke failed.");
				} catch (IllegalAccessException e) {
					
					logger.error("StandardConfiguration - " + fieldName + " IllegalAccessException.");
				}
			}
		}
		
	}
	
	private String getFieldName(String methodName) {
		
		String fieldName = methodName.substring(3, methodName.length());
		fieldName = fieldName.substring(0, 1).toLowerCase() +
						fieldName.substring(1, fieldName.length());
		
		return fieldName;
	}
	
	private String createFieldMethodVar(String fieldName) {
		
		return fieldName.substring(0, 1).toUpperCase() +
				fieldName.substring(1, fieldName.length());
	}

	public ImportBusiness getImportBusiness() {
		return importBusiness;
	}

	public void setImportBusiness(ImportBusiness business) {
		this.importBusiness = business;
	}
}
</pre><br /><br />这个类按照下面的方式来使用：<br /><br /><pre name="code" class="java">
StandardConfiguration config = new StandardConfiguration(beanFactory)
ImportBusiness importBusiness = config.getImportBusiness();
</pre><br /><br />其中 beanFactory 是 Spring 中的 BeanFactory，ImportBusiness 是一个普通的类。<br /><br />ok，我们避免了 beanFactory.getBean("A") 的用法，我可以说：<strong>当我 new 一个 StandardConfiguration 的时候，里面的变量都是自动注入的。</strong><br /><br />但是有人说：你这是穿裤子放屁--你不是还得使用 BeanFactory？<br /><br />没错，没错，这也是我想说的主要话题之一，<strong>如果 BeanFactory 能修改一下该多好</strong>！<br /><br />我设想的情况是这样使用：<br /><br /><pre name="code" class="java">
public class StandardConfiguration extends BeanFactory {
  private ImportBusiness importBusiness;
  public ImportBusiness getImportBusiness() {
    return importBusiness;
  }

  public void setImportBusiness(ImportBusiness business) {
     this.importBusiness = business;
  }
}
</pre><br /><br />这样当我 new 一个 StandardConfiguration 的时候，里面的变量就自动装配起来。这样的话，BeanFactory 似乎应该叫 BeanConfiguration 更好了。<br /><br />通过这样的方式，我们完全可以避免工厂模式的出现。这样做有什么好处呢：<br />1、避免了工厂模式的使用，单一的IOC更加简单。<br />2、避免了通过 bean name（beanFactory.getBean("A");） 来获得某一个对象。其实也就是避免了hardcode。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252235" style="color:red;">已有 <strong>5</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 15:08:41 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252235</link>
        <guid>http://www.javaeye.com/topic/252235</guid>
      </item>
          <item>
        <title>西安信利</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen-516888.javaeye.com">chen-516888</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252410" style="color:red;">http://www.javaeye.com/topic/252410</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          西安信利待遇如何?<br />有前辈在那吗?<br />谢谢
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252410" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 22:47:53 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252410</link>
        <guid>http://www.javaeye.com/topic/252410</guid>
      </item>
          <item>
        <title>Struts验证框架与一些技巧</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangyuan.javaeye.com">folie2006</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251827" style="color:red;">http://www.javaeye.com/topic/251827</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>还是通过一些步骤例子说明 <br />首先建立Struts工程的时候要启动验证框架。 <br />它称为Validator验证框架 <br />主要依赖与两个.jar文件</p>
<p>&nbsp;<br />Jakarta-oro.jar <br />Commons-validator.jar&nbsp;<br /> <br />这个是在struts-config.xml文件中如下加入配置之后即代表该工程已经使用验证框架的插件了&nbsp;</p>
<pre name="code" class="xml">&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt; 
        &lt;set-property property="pathnames" value="/WEB-INF/validator-rules.xml, 
                                                  /WEB-INF/validation.xml"/&gt; 
&lt;/plug-in&gt;</pre>
<p>&nbsp; <br />完成好了之后以注册的例子说明它的主要使用方法 <br />1.建立一个注册的页面；包含用户名: 密码: 年龄: 邮箱:都不能为空。密码长度必须大于或等于8位，邮箱格式验证等 <br />显示方式一：使用错误消息显示在相应的控件后面。 <br />2.建立注册页相对应的表单Bean(ActionForm),重点在这里，因为要使用验证框架的话该表单类需要修改 <br />1)修改该类的继承&nbsp;</p>
<pre name="code" class="java">  import org.apache.struts.validator.ValidatorForm;// 导入要继承的类 
  public class 表单类 extends ValidatorForm //修改继承类</pre>
<p>&nbsp; <br />2) //修改该类且不包含validate()方法. <br />3、在validation.xml 中配置验证规则 <br />&nbsp; 这个验证规则依赖与validator-rules.xml此文件已经配置好的验证类 <br />&nbsp; 大概介绍几种规则吧{}中的为参数 <br />&nbsp;&nbsp; errors.required={0} is required.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须的，或者不能为空的 <br />&nbsp;&nbsp; errors.minlength={0} can not be less than {1} characters. {某某}不能小于{多少}位 <br />&nbsp;&nbsp; errors.maxlength={0} can not be greater than {1} characters.{ 某某}不能大于{多少}位 <br />&nbsp; errors.range={0} is not in the range {1} through {2}.{0}是不能在{1}与{2}之间</p>
<pre name="code" class="xml">&lt;form-validation&gt;   &lt;!--以下是配置一些常用的验证规则 --&gt;
  &lt;formset&gt; 
&lt;form name="regActionForm"&gt;  
&lt;!--表单名，为验证哪个表单而配置，这里的name指定struts中form-bean的别名 --&gt;
    &lt;field property="username" depends="required"&gt; 
      &lt;arg0 key="tip.username"/&gt; 
    &lt;/field&gt;         arg0指要为该规则传入的第一个参数 
&lt;!--property为表单中的属性，depends为要验证的规则key为消息资料文件中的配置键 --&gt;
&lt;!-- 验证密码最小长度不小于8位 要一个控件属性验证两个规则的话真正以逗号分开, --&gt; 

&lt;field property="userpass" depends="required,minlength"&gt; 
      &lt;arg0 key="tip.userpass"/&gt; 
      &lt;arg1 key="${var:minlength}" name="minlength" resource="false"/&gt; 
      &lt;var&gt; 
        &lt;var-name&gt;minlength&lt;/var-name&gt; 
        &lt;var-value&gt;8&lt;/var-value&gt; 
      &lt;/var&gt; 
    &lt;/field&gt; 
 
    &lt;!--绿色的为变量名,好像定义也有规则，必须是那样而resource 则是配置是否从资源文件中查找key --&gt;
    

&lt;field property="email" depends="required,email"&gt; 
      &lt;arg0 key="tip.email"/&gt; 
    &lt;/field&gt; 
 
&lt;!-- 验证年龄在一定范围之内 --&gt;
    &lt;field property="age" depends="required,intRange"&gt; 
      &lt;arg0 key="tip.age"/&gt; 
      &lt;arg1 key="${var:min}" name="intRange" resource="false"/&gt; 
      &lt;arg2 key="${var:max}" name="intRange" resource="false"/&gt; 
       &lt;var&gt; 
         &lt;var-name&gt;min&lt;/var-name&gt; 
         &lt;var-value&gt;1&lt;/var-value&gt; 
       &lt;/var&gt; 
       &lt;var&gt; 
         &lt;var-name&gt;max&lt;/var-name&gt; 
         &lt;var-value&gt;100&lt;/var-value&gt; 
       &lt;/var&gt; 
    &lt;/field&gt; 
    &lt;/form&gt; 
  &lt;/formset&gt; 
&lt;/form-validation&gt; 

</pre>
<p>&nbsp;</p>
<p>4、编写消息资源文件</p>
<p>验证规则的配置文件中所用key的名字为该资源文件所配置</p>
<pre name="code" class="python"># errors.required={0}不能为空. 
# tip.username=用户名 
# tip.userpass=密码 
# errors.minlength={0}不能少于{1}个字符. 
# errors.email={0} 格式不合法. 
# tip.email=邮箱 
# tip.age=年龄 
# errors.range={0} 必须在 {1} - {2} 之间. 

errors.required={0}\u4e0d\u80fd\u4e3a\u7a7a. 
tip.username=\u7528\u6237\u540d 
tip.userpass=\u5bc6\u7801 
errors.minlength={0}\u4e0d\u80fd\u5c11\u4e8e{1}\u4e2a\u5b57\u7b26. 
errors.email={0} \u683c\u5f0f\u4e0d\u5408\u6cd5. 
tip.email=\u90ae\u7bb1 
tip.age=\u5e74\u9f84 
errors.range={0} \u5fc5\u987b\u5728 {1} - {2} \u4e4b\u95f4. 
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5.在struts-config.xml中配置Action验证失败跳转页面，属性为input指向的地方 <br /><br />二、手工验证； <br />1、用户名、密码不能为空； <br />2、密码长度不能小于8位； <br /><br />（1）验证代码写在哪儿？ <br />ActionForm的validate()方法中，如果该方法返回的ActionErrors中没有包含错误消息，认为验证通过。 <br /><br />（2）错误集合存在哪儿？ <br />由 RequestProcessor 将错误集合存储在 Request 中，键名为 <br />Globas.ERROR_KEY； <br /><br />（3）如何显示错误消息？&nbsp;</p>
<pre name="code" class="html">&lt;html:errors/&gt; &lt;!--显示所有消息 --&gt;
&lt;html:errors property="xx"/&gt; &lt;!--显示指定的消息--&gt;</pre>
<p>&nbsp; <br /><br />三、生成JavaScript <br />（1）ActionForm继承 org.apache.struts.validator.ValidatorForm； <br />（2）ActionForm中无 validate() 方法； <br />（3）表单JSP页中加： <br />&lt;html:form .... onsubmit="return validateRegForm(this);"&gt;颜色字体一致，首字母大写 <br />&lt;html:javascript formName="regForm"/&gt; <br />（4）在validation.xml中配置验证规则； <br /><br /><br /><br />另外再说一个不怎么常用的标签，它的作用一般就是方便表单Bean对象的重复代码</p>
<pre name="code" class="html">&lt;%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %&gt; 
&lt;h1&gt;用户注册&lt;/h1&gt; 
&lt;html:form action="reg.do" method="post"&gt; 
  &lt;nested:nest property="user"&gt;   
    用户名:&lt;nested:text property="username"/&gt;&lt;br/&gt; 
    密码:&lt;nested:text property="userpass"/&gt;&lt;br/&gt; 
  &lt;/nested:nest&gt; 
  &lt;html:submit value="提交"/&gt; 
&lt;/html:form&gt; 
</pre>
<p>&nbsp;</p>
<p>要使用该配置，在ActionForm中要实例化一个user对象才可以通过以上配置使用对象中username的属性</p>
<pre name="code" class="html">&lt;hr&gt; 
&lt;h1&gt;用户注册&lt;/h1&gt; 
&lt;html:form action="reg.do" method="post"&gt; 
    用户名:&lt;html:text property="user.username"/&gt;&lt;br/&gt; 
    密码:&lt;html:text property="user.userpass"/&gt;&lt;br/&gt; 
  &lt;html:submit value="提交"/&gt; 
&lt;/html:form&gt; </pre>
<p>&nbsp;<br /><br />上面的代码也可以实现刚才的功能，但是在验证框架中就不能那么使用了 <br /><br /><span style="color: #ff00ff;">Tiles标签 <br /></span></p>
<pre name="code" class="html">&lt;tiles:insert page="header.jsp" flush="true"/&gt;&lt;!--标头内容 --&gt;</pre>
<p>&nbsp;<br />作用与嵌套网页，可以定制好一个模板，然后在模板中使用相应的可编辑内容</p>
<pre name="code" class="html">&lt;h1&gt;t1.jsp&lt;/h1&gt; 
111111111111111 
&lt;hr&gt; 
&lt;!--page表示所要插入的网页，flush是否及时更新 --&gt;
&lt;tiles:insert page="footer.jsp" flush="true"/&gt;&lt;!--末尾内容 --&gt;</pre>
<p>&nbsp;<br /><br />第二种情况是以一个定制了的模板生成个新的网页</p>
<pre name="code" class="html">&lt;tiles:insert attribute="header"/&gt; 
&lt;tiles:insert attribute="footer"/&gt; 

&lt;tiles:insert page="template1.jsp" flush="true"&gt;   &lt;!--已经存在一个template1.jsp模板 --&gt;
&lt;tiles:put name="header" value="header.jsp"/&gt;  &lt;!--往属性header设置嵌入页面 --&gt;
&lt;tiles:put name="footer" value="footer.jsp"/&gt;    &lt;!--往属性footer设置嵌入页面 --&gt;
&lt;/tiles:insert&gt; 
</pre>
<p>&nbsp;<br />（1）防止重复提交；&nbsp; Action <br />原理是通过在请求里面加入一些身份标记，在请求的时候判断是否事先存放的标记，如果不是则是第二次非正常提交 <br /></p>
<pre name="code" class="java">this.saveToken(request);        //在第一次点击请求的时候存入然后存转发到另一个JSP页面 
//判断令牌是否有效； 
if(! this.isTokenValid(request) ){     //如果是刚才的页面转发过来的话则它返回真 
saveToken(request); 
return ( new ActionForward(mapping.getInput()) );  
//跳转到Action配置的input中的页面 
} 
//最后正常执行完业务逻辑就把先前存的Token删除 
request.removeAttribute(mapping.getAttribute()); 
this.resetToken(request); 
</pre>
<p>&nbsp;<br /><br />（2）动态ActionForm（对应的JAVA类是动态产生的，JAVA类中的属性在struts-config.xml文件中动态配置） <br />1.配置Struts-config.xml中的 &lt;form-bean/&gt;，在其中声明 <br />表单中要包含的字段元素； <br />---------------------------------------- <br />例如页面上有以下一个表单 ，分别有属性username userage</p>
<pre name="code" class="html">&lt;form action="dynaReg.do" method="post"&gt; 
username:&lt;input size=10 name="username"&gt;&lt;br&gt; 
userage:&lt;input size=10 name="userage"&gt;&lt;br&gt; 
&lt;input type="submit" value=" OK "&gt; 
&lt;/form&gt; 
</pre>
<p>&nbsp;</p>
<p>那么对应这个表单就要在Struts-config.xml中配置一个与其对应的form-bean</p>
<pre name="code" class="xml">&lt;form-bean name="dynaRegForm" dynamic="true" type="org.apache.struts.action.DynaActionForm"&gt; &lt;!--指定该bean为动态的，并类型是该类 
如果使用了动态FORMBEAN也想用验证框架的话这里的TYPE就要指定DynaValidatorActionForm --&gt;
        &lt;form-property name="username" type="java.lang.String"/&gt; 
        &lt;form-property name="userage" type="java.lang.Integer" initial="0"/&gt; 
&lt;/form-bean&gt; 
  </pre>
<p>&nbsp;---------------------------------------------------- <br />2.配置Struts-config.xml中的 &lt;action/&gt;，将动态ActionForm <br />与某个Action结合起来; <br />只要name属性名称一致就可以了 <br />在Action中的业务方法有些改动，因为它自动生成表单bean,所以取值的时候要像这样取,get中填写xml配置中的属性名字,把form强转换成DynaActionForm类对象，使用.get方法，返回Object，所以相应的再强转成想要的类型 <br />String username=(String)((DynaActionForm)form).get("username"); <br />Integer userage=(Integer)((DynaActionForm)form).get("userage"); <br />3.客户使用表单,表单中名称与&lt;form-bean&gt;中声明的相同； <br /><br />最后在使用完表单bean之后要删除掉刚才生成的bean;方法如下 <br />request.removeAttribute(mapping.getAttribute());//删除FormBean <br /><br /><br />(3)DispatchAction类，可以在一个Action中编写多个业务方法; <br />1、编写Action，要继承DispatchAction，且无execute()方法； <br />2、在Action类中提供多个业务方法； <br />3、在表单/超链接中生成请求时，用URL： xxxxx.do?method=XX <br />4、使用该类，可以节省Action的个数; <br /><br />测试DispatchAction类(一个Action处理多种业务): <br />加math.do?method=add <br />减math.do?method=dec <br />乘math.do?method=mul <br /><br />在Action类中要写入相应的方法。</p>
<pre name="code" class="java">public ActionForward add(ActionMapping mapping, 
                            ActionForm form, 
                            HttpServletRequest request, 
                            HttpServletResponse response) 
    throws Exception { 
    System.out.println("add...."); 
    request.setAttribute( "mathresult","add...." ); 
    return mapping.findForward( "success" ); 
    } </pre>
<p>&nbsp;<br />其他几个以此类推。。。。。。。。。。。。 <br /><br />(4)一个表单实现多种业务（计算器）----LookupDispatchAction; <br />LookupDispatchAction(一个表单对应多个处理方法): <br /><br />1、编写Action，继承LookupDispatchAction类； <br />2、重写LookupDispatchAction类的getKeyMethodMap()，在该方法内对提交按钮文字&ldquo;键名&rdquo;和&ldquo;业务方法名&rdquo;进行映射；</p>
<pre name="code" class="java">protected Map getKeyMethodMap(){ 
Map map=new HashMap(); 
map.put("页面显示的按钮","本类中的业务方法名"); 
map.put("button.add ","add"); 
return map; 
} </pre>
<p>&nbsp;<br />3、编写业务方法；</p>
<pre name="code" class="java">//add 
    public ActionForward add(ActionMapping mapping, 
                                 ActionForm form, 
                                 HttpServletRequest request, 
                                 HttpServletResponse response) 
    throws Exception 
    { 

        int num1 = ((Math2Form) form).getNum1(); 
        int num2 = ((Math2Form) form).getNum2(); 
request.setAttribute( "math2Result", ""+(num1+num2) ); 
        request.removeAttribute(mapping.getAttribute()); 
        return (mapping.findForward("success")); 
    } </pre>
<p>&nbsp;<br />4、表单中的提交按钮中，显示文字时使用</p>
<pre name="code" class="html">&lt;bean:message key="xxx"/&gt;</pre>
<p>&nbsp; <br />5、使用该类，可以出现许多避免重复性表单；(如下为前台表单显示的内容)</p>
<pre name="code" class="html">&lt;html:submit property="action"&gt; 
&lt;bean:message key="button.add"/&gt; 
&lt;/html:submit&gt; 
</pre>
<p>&nbsp;<br />(5)ForwardAction</p>
<pre name="code" class="html">&lt;action    
path = "/jsp1" 
type = "org.apache.struts.actions.ForwardAction" 
parameter ="/jsp1.jsp" 
/&gt; 

&lt;action    
path = "/jsp1" 
forward="/jsp1.jsp" 
/&gt; 
</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251827" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Oct 2008 16:36:01 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251827</link>
        <guid>http://www.javaeye.com/topic/251827</guid>
      </item>
          <item>
        <title>杭州上海比较不错的公司</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://seman18.javaeye.com">seman18</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252403" style="color:red;">http://www.javaeye.com/topic/252403</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          IBM，微软，sap。。。，autodesk，这些大公司都是不错的选择，不过还是有很多不为大多数人所知的公司，他们无论在待遇，环境等等方面都不比这些耳熟能详的公司来的差，大家可以把自己知道的一起分享一下吗，谢谢！<br />上海：<br />摩根斯坦利， EMC<br /><br />杭州：<br />microstrategy，triology（现在已经没落了，本来应届硕士能达到1w/月以上），ask，淘宝/阿里（貌似现在也不错了，还有期权，加班比较多），道富（待遇在杭州也算顶尖的，应届硕士基本在8-9k/月）
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252403" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 22:37:37 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252403</link>
        <guid>http://www.javaeye.com/topic/252403</guid>
      </item>
          <item>
        <title>等哪天我开了公司</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hyys2008.javaeye.com">hyys2008</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251991" style="color:red;">http://www.javaeye.com/topic/251991</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          等哪天我开了公司，我要以最优厚的待遇给所有的员工<br />等哪天我开了公司，我要以最真诚最诚挚的心对待所有的员工<br />等哪天我开了公司，我要让所有的员工都认为这是为他们自己在工作<br />等哪天我开了公司，……………………………………………………<br /><br />等哪天我开了公司，那这样的公司绝对是最伟大的公司.<br /><br /><br /><img src="/images/smiles/icon_biggrin.gif"/>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251991" style="color:red;">已有 <strong>11</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 01:45:20 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251991</link>
        <guid>http://www.javaeye.com/topic/251991</guid>
      </item>
          <item>
        <title>让你的 Ibatis2 也支持Annotation</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnoss.javaeye.com">cnoss</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251047" style="color:red;">http://www.javaeye.com/topic/251047</a>&nbsp;
          发表时间: 2008年10月10日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><span style="color: Blue">在支持xml配置方式的基础上增加了对annotation的支持，用户可以根据自己的喜好来选择或者两种方式并存。</span></strong><br /><br />详情请大家看：<a href="http://www.rest4g.org/viewthread.php?tid=12&amp;extra=page%3D1" target="_blank">http://www.rest4g.org/viewthread.php?tid=12&amp;extra=page%3D1</a><br /><br />代码示例如下：<br />Account.java<pre name="code" class="java">
package org.jrest4guice.persistence.ibatis;
public class Account {
  private int id;
  private String firstName;
  private String lastName;
  private String emailAddress;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public String getEmailAddress() {
    return emailAddress;
  }

  public void setEmailAddress(String emailAddress) {
    this.emailAddress = emailAddress;
  }

}
</pre>AccountService.java<pre name="code" class="java">
package org.jrest4guice.persistence.ibatis;

import java.sql.SQLException;
import java.util.List;

import org.jrest4guice.persistence.ibatis.annotations.Delete;
import org.jrest4guice.persistence.ibatis.annotations.IbatisDao;
import org.jrest4guice.persistence.ibatis.annotations.Insert;
import org.jrest4guice.persistence.ibatis.annotations.Result;
import org.jrest4guice.persistence.ibatis.annotations.ResultMap;
import org.jrest4guice.persistence.ibatis.annotations.Select;
import org.jrest4guice.persistence.ibatis.annotations.Update;
import org.jrest4guice.transaction.annotations.Transactional;
import org.jrest4guice.transaction.annotations.TransactionalType;

import com.google.inject.Inject;
import com.ibatis.sqlmap.client.SqlMapClient;

@IbatisDao
@SuppressWarnings("unchecked")
@Transactional
@ResultMap(id = "accountResultMap", result = {
		@Result(property = "id", column = "id"),
		@Result(property = "firstName", column = "firstName"),
		@Result(property = "lastName", column = "lastName"),
		@Result(property = "emailAddress", column = "emailAddress") }, resultClass = Account.class)
@Cachemodel(id = "account-cache", flushInterval = "24", flushOnExecute = {
		"insertAccount", "updateAccount", "deleteAccount" }, type = "LRU", 
		property = { @Property(name = "size", value = "100") })
public class AccountService {
	@Inject
	private SqlMapClient sqlMapper;

	@Select(id = "selectAllAccounts", sql = "select * from ACCOUNT", 
			resltMap = "accountResultMap", cacheModel = "account-cache")
	@Transactional(type = TransactionalType.READOLNY)
	public List&lt;Account> findAll() throws SQLException {
		return sqlMapper.queryForList("selectAllAccounts");
	}

	@Select(sql = "select id ,firstName,lastName,emailAddress from "
			+ "ACCOUNT where id = #id#")
	@Transactional(type = TransactionalType.READOLNY)
	public Account getAccountById(int id) throws SQLException {
		return (Account) sqlMapper.queryForObject("getAccountById", id);
	}

	@Insert(id = "insertAccount", sql = "insert into ACCOUNT (id,firstName,"
			+ "lastName,emailAddress) values (#id#, #firstName#, #lastName#, "
			+ "#emailAddress#)")
	public void createAccount(Account account) throws SQLException {
		sqlMapper.insert("insertAccount", account);
	}

	@Update(sql = "update ACCOUNT set firstName = #firstName#,lastName = "
			+ "#lastName#,emailAddress = #emailAddress# where id = #id#")
	public void updateAccount(Account account) throws SQLException {
		sqlMapper.update("updateAccount", account);
	}

	@Delete(id = "deleteAccount", sql = "delete from ACCOUNT where id = #id#")
	public void deleteAccount(int id) throws SQLException {
		sqlMapper.delete("deleteAccount", id);
	}

	@Select(id = "queryAccounts", 
		sql = "select * from ACCOUNT "
			+ "&lt;dynamic prepend=\"where\">"
			+ " &lt;isNotNull prepend=\"and\" property=\"firstName\">"
			+ "    firstName = #firstName#" 
			+ " &lt;/isNotNull>"
			+ " &lt;isNotNull prepend=\"and\" property=\"lastName\">"
			+ "    lastName = #lastName#" 
			+ " &lt;/isNotNull>"
			+ " &lt;isNotNull prepend=\"and\" property=\"emailAddress\">"
			+ "    emailAddress = #emailAddress#" 
			+ " &lt;/isNotNull>"
			+ "&lt;/dynamic> " 
			+ "order by lastName", resltMap = "accountResultMap", 
			cacheModel = "account-cache")
	@Transactional(type = TransactionalType.READOLNY)
	/**
	 * 动态SQL查询
	 */
	public List&lt;Account> queryAccounts(Account account) throws SQLException {
		return sqlMapper.queryForList("queryAccounts",account);
	}
}
</pre>AccountServiceTest.java<pre name="code" class="java">
package org.jrest4guice.persistence.ibatis;

import java.sql.SQLException;
import java.util.List;

import junit.framework.Assert;

import org.jrest4guice.guice.GuiceContext;
import org.jrest4guice.guice.PersistenceGuiceContext;
import org.junit.BeforeClass;
import org.junit.Test;

public class AccountServiceTest {
	private static AccountService service;

	@BeforeClass
	public static void setUp() throws Exception {
		// 初始化JRest4Guice
		PersistenceGuiceContext.getInstance().useIbatis(
				"org.jrest4guice.persistence.ibatis").init();
		// 获取服务
		service = GuiceContext.getInstance().getBean(AccountService.class);
	}

	@Test
	public void doTest() {
		List&lt;Account> accounts;
		try {
			Account account = new Account();
			account.setFirstName("张");
			account.setLastName("学友");
			account.setEmailAddress("jackey@rest4g.org");
			// 添加
			service.createAccount(account);

			account = new Account();
			account.setFirstName("刘");
			account.setLastName("学友");
			account.setEmailAddress("test@rest4g.org");
			// 添加
			service.createAccount(account);
			
			//查询（按lastName）
			Account queryCondition = new Account();
			queryCondition.setLastName("学友");
			accounts = service.queryAccounts(queryCondition);
			Assert.assertEquals(2, accounts.size());
			
			//查询（按firstName和lastName）
			queryCondition.setFirstName("张");
			accounts = service.queryAccounts(queryCondition);
			Assert.assertEquals(1, accounts.size());

			// 修改
			account = accounts.get(0);
			account.setFirstName("何");
			service.updateAccount(account);
			account = service.getAccountById(account.getId());
			Assert.assertNotNull(account);
			Assert.assertEquals("何", account.getFirstName());

			//查询所有
			accounts = service.findAll();
			Assert.assertEquals(2, accounts.size());

			// 删除
			for (Account ac : accounts){
				service.deleteAccount(ac.getId());
			}
			
			//断言删除的结果
			accounts = service.findAll();
			Assert.assertEquals(0, accounts.size());
		} catch (SQLException e) {
			Assert.fail(e.getLocalizedMessage());
		}
	}
}
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251047" style="color:red;">已有 <strong>46</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Oct 2008 07:17:02 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251047</link>
        <guid>http://www.javaeye.com/topic/251047</guid>
      </item>
          <item>
        <title>易保面试题目</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liliugen.javaeye.com">liliugen</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250871" style="color:red;">http://www.javaeye.com/topic/250871</a>&nbsp;
          发表时间: 2008年10月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.你平时都知道怎么写过高效率的SQL<br />2.<br />SPRING 的事务处理你们放在哪一层处理<br />3.两个DAO进行交互，一个DAO失败了是不是另外一个也失败，那这样怎么办啊·<br />4.JSF什么个框架· <strong>jsf与struts的异同</strong><br />5.STRUTS&nbsp; 里面ACTIONSERVLET在容器里面是不是就一个？<br /><br />6 如果你说是5的答案一个，就问，那么多人访问你的应用，那么多线程就一个ActionServlet，安全吗？
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250871" style="color:red;">已有 <strong>49</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Oct 2008 17:56:41 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250871</link>
        <guid>http://www.javaeye.com/topic/250871</guid>
      </item>
          <item>
        <title>★新手面试经验分享(更新中)★</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://collonn.javaeye.com">collonn</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251008" style="color:red;">http://www.javaeye.com/topic/251008</a>&nbsp;
          发表时间: 2008年10月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;"><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">&nbsp;
<p><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><strong>总结了一些新手面试经验，希望能有帮助</strong></span></p>
<p><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">1</span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：简历不能太实在，两个项目参考就可以了，但要对你在项目的做的什么工作很清楚</span></p>
<p><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">2</span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：让你自我介绍时，就说说自己在大学是怎么学习编程的，自己做了哪些实践，实习时又干了些什么，当</span></p>
<p style="text-indent: 13.5pt; mso-char-indent-count: 1.5;"><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">然你可以编，但要有准备</span></p>
<p><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">3</span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：在网上搜集一些</span><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">Java</span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">面试题做做，背背是很有必要的</span></p>
<p><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">4</span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：一定要会数据结构中的</span><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;"> </span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">选择和排序</span><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;"> </span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">算法，一定要在记事本中写出来，并在</span><span style="font-size: 9pt; color: #000000; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">命令提示符下</span><span style="font-size: 9pt; color: #000000; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">测试</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">5</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">J2SE</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的基本配置最好</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;"> </span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">了如指掌</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">6</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：进了公司后，实在，实在是呆不下去了，可以申请离职</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">7</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：面试回来后，感觉不错就给公司回个邮件</span></p>
<p><span style="color: #0000ff;"><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">8</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：工资要求不要太高，不相信？那你试试吧</span></span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">9</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：简单的数据库表设计要会，一定要会这两个查找</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>A</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：找出一个表中重复的记录</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>B</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：删除表中重复记录，只留一条即可</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">(</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">网上有好多答案，自己搜吧</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">)</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">10</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">Struts</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">一定要熟悉，什么配置了，处理流程了，等</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">11</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">Hibernate</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">一定要熟悉，什么配置了，持久化类的设计了，</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">ORMapping</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的配置了，如何提高</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">Hb</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的性能</span></p>
<p style="text-indent: 18pt; mso-char-indent-count: 2.0;"><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">了，等，从零开始，如完成一个数据的</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">CRUD</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">功能</span></p>
<p style="text-indent: 18pt; mso-char-indent-count: 2.0;"><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">至于spring，对新手几呼没有考过，最多写一个类的注入配置文件</span></p>
<p><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">12</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：面试时不要迟到，实在是来晚了，见了人家要先说：&ldquo;对不起，犯了个错误，来晚了&rdquo;，什么原因就</span></p>
<p style="text-indent: 18pt; mso-char-indent-count: 2.0;"><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">不用说了，说了只会产生腹面影响</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">最后再次提醒一下：</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">工资不要太高，正常加班可以接受就行，离家不能太远</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">(2</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">小时</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">??)</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，搞程序开发的，一定要是软件公司，专开发开发</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">Web</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或桌面程序</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">(</span><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">针对中小公司而言</span><span style="font-size: 9pt; font-family: 'Times New Roman'; mso-bidi-font-family: 宋体;">)</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><strong>我们也要选择公司(java web开发)</strong></span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">1：没有项目的不去</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">2：没有笔试的要考虑</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">3：只做本公司门户网站的不去</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">4：一线开发人员少的不去(至少得有几个真正懂得java 代码的老员工吧)</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">5：搞CMS维护的不去，要去也得去搞开发CMS(java版)的公司</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">6：工资太低的不去(低于2K)</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">7：疯狂加班的不去，如明确说朝9晚9，周一到周六，适当加班</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">8：只邮件通知不打电话的公司不去</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">9：如果你是编程的，面试你时，连几个有关编程技术的问题都不问(或者就根本不提)的公司不去</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>如果你要跳槽，不防看看以下几点</strong></p>
<span style="font-size: small;"><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">
<p>
<p>
<p>告诉人事经理，我没空</p>
<p>(此为转载)<br />　　　　 <br />　　引言:尽信书不如无书,同样,以下注意几点并非全对,罗列出来,只是相对高级人才而言.发表抗议的朋友,正一步步在晋级自己的级别! <br />　　 <br />　　有一些著名公司，以打广告为目的，招人为幌子，一个破烂职位能放一两年。 <br />　　 <br />　　<span style="color: #0000ff;">只给你发邮件而不打电话叫你去面试的公司，必须不予理睬</span>。通常是一些垃圾公司，没有能力满足你的基本要求。他们自己也没把握雇得起你，所以连电话费也免了。 <br />　　 <br />　　<span style="color: #0000ff;">第一次电话就让你于某月某日几点钟去哪里面试的公司，必须立刻回绝</span>。因为你到时候到那里一看，一堆刚毕业2、3年的年轻后生正爬在桌子上填写简历。你跟这些人竞争的结果就是你的工资最多只有他们的1倍高，5、6千顶天了。那么应该怎么回答呢？告诉人事经理，我没空，我只有莫月某日下午几点钟才有空，若不然，就不用去了，浪费时间，肯定是低级职位。 <br />　　 <br />　　<span style="color: #0000ff;">去公司面试前必须问清楚是谁面试你</span>，如果得知不是总经理或副总经理来面你，那么我劝你立刻回绝这个职位，因为如果面你的是个低三下四的中层干部，那么你的职位肯定是低四下五的低贱职位。总之，打扮得笔挺结果给猪看了，即花钱又浪费时间。 <br />　　 <br />　　<span style="color: #0000ff;">一进门就让你填一堆表格的公司，必须立马走人</span>，因为这是招聘中低等员工的惯用伎俩，特别是对那些喜欢出一些狗屁不通的试卷的公司，千万不要跟他们浪费时间。况且，应聘的人为了得到这份工作，根本就不可能按自己的真实情况回答这种测试卷，废纸一堆，招聘的人根本不懂人事管理。 <br />　　 <br />　　<span style="color: #0000ff;">如果公司所在城市离你较远，需要飞机前往，一定要问明公司报销不报销路费</span>。如果不报销，或者说如果录取就报销的公司，建议不要冒险去试。即使十个面试者中最后被你淘汰了九个，你还是会发现该公司的福利待遇极差极差。惨痛教训，切记勿再试。 <br />　　 <br />　　<span style="color: #0000ff;">要知道一个公司的整体面貌和素质如何，那就请留意人事部职员的面貌</span>，尤其是人事经理的素质往往是一个公司整体素质的缩影。如果接待你的人事经理较热心较礼貌周到，那么该公司的工作氛围一般较好，如果人事经理较冷漠或不很礼貌，那么该公司同事关系往往较残酷较冷漠。 <br />　　 <br />　　不要试图跟新加坡或台湾老板共事，否则你就等着身心接受摧残和扭曲吧。 <br />　　 <br />　　注意HR的职业病，几乎每个HR都有窥探癖和多疑症。他们更象是猎狗，他们嗅觉灵敏，对打探个人隐私有着狂热而又执着的癖好，往往是工作没给你，却把你现在工作的公司，以前工作的公司闹得沸沸扬扬。如果你不想丢掉现在的工作，不想让你以前的同事议论非非，那么，请慎重透露你的隐私给HR。切记切记。 <br />　　 <br />　　 <br />　　<span style="color: #0000ff;">当你跳槽时，所有的SB都会装模做样地问你，你将来的职业规划是什么</span>？你可千万别说是准备从研发、测试转测试、管理之类的屁话。更不要说将来可能会去出国深造。说者无心听者会乱想。 <br />　　 <br />　　 <br />　　 <br />　　<span style="color: #0000ff;"><strong>最后一条，也是最重要的一条，12年的跳槽经验表明，较好的中国公司及正规的外企正愈来愈倾向于日本企业的终身雇佣制度，即：拒绝跳槽，拒绝人才流动。</strong></span>所有的HR都有一种固执而又变态的心理：他不希望成为你的第一个雇主，但却强烈地希望是你的第二个雇主，并且是在该领域被第一个雇主用了5年到八年之后，同时希望自己是你的最后一个雇主。所以HR对你的跳槽经历往往怀有一种强烈的偏见和关注，对你跳槽原因的研究兴趣近乎变态。</p>
<span style="font-size: small;"><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">
<p>&nbsp;</p>
<p>&nbsp;</p>
</span></span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">写到这了，想到什么会再补的</span></p>
<p><span style="font-size: 9pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">祝所有新手：早日入职</span></p>
</p>
</span></span></span><span style="font-size: small;">
<p>&nbsp;</p>
</span></span></p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251008" style="color:red;">已有 <strong>3</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Oct 2008 23:26:26 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251008</link>
        <guid>http://www.javaeye.com/topic/251008</guid>
      </item>
          <item>
        <title>ie 浏览器比较神奇</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liwei.javaeye.com">liwei</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252347" style="color:red;">http://www.javaeye.com/topic/252347</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天碰到一个问题，不知是我没有理解，还是ie 的问题？<br />我在jsp 里有一个form 其中有一个hidden name="content" id="content" ,通过js 重新对content付值后提交，奇怪的事发生了在后台action 里request.getParameter("content")却得不到content 的值。一直是初始值，无奈之下换了一个name ,提交<br />后成功获得值，不知为何。（我用的是ie7）
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252347" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 18:10:49 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252347</link>
        <guid>http://www.javaeye.com/topic/252347</guid>
      </item>
          <item>
        <title>Show一下ROR结合Ext的成果</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://taito.javaeye.com">taito</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250835" style="color:red;">http://www.javaeye.com/topic/250835</a>&nbsp;
          发表时间: 2008年10月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用到<strong>ext</strong>的 data, tree, grid,form, panel, layout等<br /><br />主要是生成ext 的 <strong>json</strong>格式数据，及<strong>ror </strong><strong>rest</strong>方法有些麻烦，其它的到还好，多看API文档就行了。<br /><br />其中rails后台部分，用到了betternestedset插件。<br /><br /><br />*:<br /><br /><span style="color: brown">因为还没有找到一家稳定又方便的ror服务器提供商，所以现在在网上看不到实际的应用效果。<br /><br />目前为止只能在本机浏览，有提供ror支持的服务器商可以推荐一下。</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250835" style="color:red;">已有 <strong>4</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Oct 2008 16:46:46 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250835</link>
        <guid>http://www.javaeye.com/topic/250835</guid>
      </item>
          <item>
        <title>RadioGroup和CheckboxGroup的赋值问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://microboat.javaeye.com">microboat</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250048" style="color:red;">http://www.javaeye.com/topic/250048</a>&nbsp;
          发表时间: 2008年10月07日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在Ext2.2的Ext.form.FormPanel中如果有RadioGroup或者CheckboxGroup，那么FormPanel.form.setValues方法对这2个东东内部的radio和checkbox无法动态赋值，需要对Ext.form.BasicForm的findField方法进行修正，代码如下：</p>
<pre name="code" class="js">Ext.override(Ext.form.BasicForm,{
    findField : function(id){        
        var field = this.items.get(id);        
        if(!field){
            this.items.each(function(f){
                if(f.isXType('radiogroup')||f.isXType('checkboxgroup')){
                    f.items.each(function(c){
                        if(c.isFormField &amp;&amp; (c.dataIndex == id || c.id == id || c.getName() == id)){
                            field = c;
                            return false;
                        }
                    });
                }
                                
                if(f.isFormField &amp;&amp; (f.dataIndex == id || f.id == id || f.getName() == id)){
                    field = f;
                    return false;
                }
            });
        }
        return field || null;
    } 
});</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250048" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 07 Oct 2008 20:28:55 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250048</link>
        <guid>http://www.javaeye.com/topic/250048</guid>
      </item>
          <item>
        <title>贴一段遍历memcached缓存对象的小脚本</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robbin.javaeye.com">robbin</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252345" style="color:red;">http://www.javaeye.com/topic/252345</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          memcached因为性能的缘故，没有提供遍历整个缓存当中对象的功能，不过memcached也提供了很多命令来监控memcached的状态，例如stats命令就有：<br /><br /><pre name="code" class="ruby">stats
stats reset
stats malloc
stats maps
stats sizes
stats slabs
stats items
stats cachedump slab_id limit_num
stats detail [on|off|dump]</pre><br /><br />不一一详细解释了，比较有价值的是stats items和stats cachedump，以及stats detail dump这几个命令，用前两条命令，实际上我们可以遍历整个memcached缓存(尽管效率低下)，后一条命令则可以显示最近memcached当中对缓存对象的详细操作情况。<br /><br />因为我想详细了解一下JavaEye在线运行的memcached服务器当中缓存对象的详细情况，所以花了几十分钟用ruby写了一个小脚本，用来方便的统计缓存对象，此外它还可以让你方便的发送stats命令。用法很简单：<br /><br />1、统计memcached server当中的对象：<br /><br />./memcached.rb <br /><br />输出的结果大致是这样的：<br /><br /><pre name="code" class="java">Problem : 4564
GroupPost : 5643
User : 27133
Group : 144
...
Post : 44442
PostText : 255286
......
views : 36260
Forum : 27
Category : 15065</pre><br />可以告诉你每个对象缓存的确切数量，比方说PostText被缓存了25万个对象，页面被缓存了3.6万个。这个统计方法是根据Rails内置的Cache生成的key做的解析，也许你要根据自己的应用调整一下解析代码。<br /><br />2、统计memcached的对象和对象的大小<br /><br />./memcached.rb stats sizes<br /><br />3、监控memcached的缓存操作情况<br />./memcached.rb stats detail on<br />./memcached.rb stats detail dump<br />./memcached.rb stats detail off<br /><br />以下是该脚本的源代码，写的很粗糙。<br /><br /><pre name="code" class="ruby">#!/usr/bin/env ruby
require 'socket'

# stats
# stats reset
# stats malloc
# stats maps
# stats sizes
# stats slabs
# stats items
# stats cachedump slab_id limit_num
# stats detail [on|off|dump]

class Memcache
  class &lt;&lt; self
    def open(host, port)
      s = TCPSocket.open(host, port)
      yield s if block_given?
    ensure
      s.close if s
    end
  
    def command(command_string, s)
      s.send(command_string + "\r\n", 0)
      buff = []
      until ["END", "OK", "DELETE", "ERROR"].include?(line = s.gets.strip) do
        buff &lt;&lt; line 
      end
      buff
    end
  
    def exec(command_string, host = "javaeye", port = 11211)
      open(host, port) { |socket| command(command_string, socket).each {|line| puts line } }
    end
    
    def cache_stats(host = "javaeye", port = 11211)
      cache_objects = {}
      open(host, port) do |socket|
        slabs = []
        command("stats items", socket).each do |line|
          slab_id = line.split[1].split(":")[1].to_i
          slabs &lt;&lt; slab_id unless slabs.include?(slab_id)
        end
        slabs.each do |slab_id|
          puts "browse slab #{slab_id}..."
          command("stats cachedump #{slab_id} 0", socket).each do |item|
            key = item.split[1].split("/")[0].to_s
            cache_objects.include?(key) ? cache_objects[key] += 1 : cache_objects[key] = 1
          end
        end
      end
      cache_objects.each_pair {|key, value| puts "#{key} : #{value}"}
    end
  end
end

if ARGV.size == 0
  Memcache.cache_stats
else
  Memcache.exec(ARGV.join(" "))
end
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252345" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 18:07:21 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252345</link>
        <guid>http://www.javaeye.com/topic/252345</guid>
      </item>
          <item>
        <title>理解渐进增强（Progressive Enhancement）</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lifesinger.javaeye.com">lifesinger</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250687" style="color:red;">http://www.javaeye.com/topic/250687</a>&nbsp;
          发表时间: 2008年10月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="post-content">
<p>原文：<a href="http://www.alistapart.com/articles/understandingprogressiveenhancement">Understanding Progressive Enhancement</a><br />
作者：<a href="http://www.alistapart.com/authors/g/aarongustafson">Aaron Gustafson</a><br />
翻译：<a href="http://lifesinger.org/">http://lifesinger.org/</a></p>
<p><img class="alignright size-full wp-image-302" title="progressive-enhancement" src="http://lifesinger.org/blog/wp-content/uploads/2008/10/progressive-enhancement.jpg" height="452" alt="" style="float: right;" width="270" /><br />
从1994年开始，Web开发社区就敲响了<a href="http://en.wikipedia.org/wiki/Graceful_degradation">优雅降级（Graceful Degradation）</a>的
鼓声。这个概念来自工程世界，其核心理念是给最新最强大的浏览器全套餐式的体验，而给那些不幸还在使用Netscape
4的可怜人们只留些残羹冷炙般的基本功能。毫无疑问，这发挥了作用。但是它并不很符合Tim
Berners-Lee（译注：万维网之父）关于普遍可访问性网络（Universally Accessible Web）的原始愿景。</p>
<p>大约10年后，一些聪明的家伙开始质疑优雅降级，发现它在很多层面上有不足之处。他们将精力集中在内容可用性（Content
Availability）、总体可访问性（Overall
Accessibility）和移动设备浏览器的能力上，寻找到了一条Web开发的新途径&mdash;&mdash;此方法将内容作为关注焦点，而不只是对旧设备的支持嘴上说说
却没有实际行动。</p>
<p>在2003年的<a href="http://sxsw.com/">SXSW</a>会议（译注：一个关于电影、音乐和交互的会议）中，Steve Champeon和Nick Finck做了一个名为 &ldquo;<a href="http://www.hesketh.com/publications/inclusive_web_design_for_the_future/">面向未来的全方位Web开发</a>&rdquo; 的演讲。这样，他们揭示了这种Web开发新方法的蓝图。Steve还给它取了个名称：渐进增强（<a href="http://en.wikipedia.org/wiki/Progressive_enhancement">Progressive Enhancement</a>）。</p>
<p>&nbsp;</p>
<h3>这里有个（微妙的）差别</h3>
<p>如果你挠着头想弄清楚优雅降级和渐进增强的区别，我告诉你，这是一个关于视角的问题。优雅降级和渐进增强都考虑一个网页在各种设备的各种浏览器上如何良好运转。两者区别的关键在于它们各自关注的焦点，以及这种关注对工作流程的影响。</p>
<p>&nbsp;</p>
<h4>优雅降级的视角</h4>
<p>优雅降级关注于在最先进/最全能的浏览器上构建网站。在被认为&ldquo;老的&rdquo;或能力不足的浏览器中的测试，经常要等到开发周期的最后一个环节才进行，并且通常限制在主流浏览器（如IE、Mozzila等）的前一个发布版本中。</p>
<p>在这种模式下，老的浏览器只可能提供差强人意（poor, but passable）的体验。或许会做些小补丁来适应某个特定浏览器，但这些浏览器毕竟不是关注的焦点，除了修正重大的错误，也不会再费多大的神了。</p>
<p>&nbsp;</p>
<h4>渐进增强的视角</h4>
<p>渐进增强关注于内容。请注意区别：我甚至都没提及浏览器。</p>
<p>内容是我们最初创建网站的原因。有些网站传播内容，有些收集内容，有些请求内容，有些操作内容，有些网站以上所有功能都有，然而它们都需要内容。这就是渐进增加成为一种更适合的模式的关键所在。这也是Yahoo!迅速采纳这种模式并用它创建了<a href="http://developer.yahoo.com/yui/articles/gbs/">分级浏览器支持（Graded Browser Support）</a>策略的原因。</p>
<p>&nbsp;</p>
<h3>它是怎样运作的</h3>
<p>进入渐进增强的思维方法很简单：只要从内容开始往外想。内容形成坚实的基石，在此之上你才能添加样式和交互。如果你爱吃糖果，可以将它想像成一颗M&amp;M花生巧克力：<br />
<img class="alignnone size-full wp-image-300" title="m-m" src="http://lifesinger.org/blog/wp-content/uploads/2008/10/m-m.png" height="231" alt="" width="500" /><br />
（图示：渐进增强的巧克力层）</p>
<p>从你的内容花生开始，将其标记为富含语义的(X)HTML. 接着给内容裹上一层富含奶油的CSS. 最后，添加JavaScript作为糖果硬壳，这就做成了一颗可口无比的美味（并使得它不会在你手里融化）。</p>
<p>如果你非常熟悉Web标准化运动的口号&mdash;&mdash;分离、分离、分离&mdash;&mdash;这个类比就相当清楚了。基于Web标准的开发经常被比作<a href="http://www.flickr.com/photos/aarongustafson/83123599/">夹心蛋糕</a>（或者，可以更富想像力地比作为<a href="http://www.stuffandnonsense.co.uk/archives/web_standards_trifle.html">松糕</a>（译注：一种多层蛋糕，可以夹水果、奶油、沙司等））。</p>
<p>我更倾向拿M&amp;M花生巧克力来类比，因为它的外层把内容完全包裹住了，这和我们的样式与脚本将内容包裹起来几乎是一样的。</p>
<p>如果你允许我的食物类比论再多讲一点（希望不会让你感觉饥饿），我将解释为什么这种方式更好以及在这种模式下各层之间是如何交互的。</p>
<p>&nbsp;</p>
<h4>花生仁</h4>
<p>有些人喜欢花生。实际上，有人喜欢花生胜过M&amp;M花生巧克力。类似地，有些家伙（以及像搜索引擎爬虫这类东西）只想要内容。</p>
<p>还有些人无福消受花生上的巧克力和糖果层（例如糖尿病患者）。和他们类似，移动设备或老浏览器用户可能无法看到你漂亮的设计，或者与你流畅的AJAX驱动的界面交互。</p>
<p>确保你的标记能够将所包裹的内容的细节最大限度地传达出来，这对于给这些用户提供基本体验至关重要。</p>
<p>&nbsp;</p>
<h4>巧克力外衣</h4>
<p>接下来，你可以将内容小心地浸入芳香美味的CSS暖浴中了。不过在你跳进糖果硬壳之前，还有些额外的考虑。</p>
<p>有的人爱吃巧克力裹着的花生。这些人就像中级用户，他们的浏览器有比较好的CSS支持，但可能没有很好的JavaScript支持。或者，可能在他
们工作的公司里，IT安全人员对JavaScript极其病态性地恐惧。对他们来说，JavaScript就可能完全被禁用了。</p>
<p>无论是倾向于爱吃<a href="http://en.wikipedia.org/wiki/Chocolate-coated_peanut">巧克力花生</a>（译注：一种直接用巧克力覆盖的花生，没有外层硬壳，类似于有内容和CSS但没有JavaScript支持的网站）还是被限制只能吃<a href="http://en.wikipedia.org/wiki/Chocolate-coated_peanut">巧克力花生</a>，这些人都应该得到满足。这里有几种渐进增强的方式可以将样式应用于内容，这将是本系列第二篇文章的话题。</p>
<p>&nbsp;</p>
<h4>糖果硬壳</h4>
<p>最后，你可以将JavaScript添加到内容和样式的混合体中了。JavaScript提供了富交互的可能性，同时具有操作内容层和展现层并与其交互的能力，这实际上使得JavaScript成为了把网站带入&ldquo;体验&rdquo;高度的一味配料。</p>
<p>我不确定糖果硬壳到底是怎样添加到M&amp;M花生巧克力上的（我猜是另一种什么浸蘸过程吧），但是，你脑中想着渐进增强的话，在你的网站上加入
基于JavaScript的功能和交互就轻而易举了。另外，就如M&amp;M花生巧克力有各种各样颜色一样，依据所运行的浏览器和设备的能
力，JavaScript的体验也可以各不相同。</p>
<p>正如你可能知道的那样，这种类型的开发叫做无侵入式（Unobtrusive）JavaScript. 我将在本系列的第三篇和最后一篇文章中讲述这些技巧和实践。</p>
<p>&nbsp;</p>
<h3>都放在一起</h3>
<p>一旦理解了渐进增强的理念并开始在实践中使用，那么用渐进增强进行开发就非常简单了。也许比做糖果还简单。本系列接下来的两篇文章将帮助你使用CSS和JavaScript来磨练你的渐进增强技巧，并向你展示怎样把哲学转换成代码。</p>
<p>&nbsp;</p>
<p>~~~~~~</p>
<h3>译注：</h3>
<ol>
<li>Graceful Degradation有译为预留退路、平稳退化的，但我觉得这两个翻译没有表达原意，不如直接翻译成优雅降级的好。</li>
<li>Unobtrusive有译为不唐突的、分离的、低调的，在Web开发领域，我觉得翻译成&ldquo;无侵入的&rdquo;最能表达原意。</li>
</ol>
<p>2008年10月8日 射雕&amp;安吉 译于杭州<br />
2008年10月9日 审校</p>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250687" style="color:red;">已有 <strong>9</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Oct 2008 12:48:34 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250687</link>
        <guid>http://www.javaeye.com/topic/250687</guid>
      </item>
          <item>
        <title>一面试题，无语</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nrbk100-gmail-com.javaeye.com">稻香麦甜</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252339" style="color:red;">http://www.javaeye.com/topic/252339</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如何能让spring mvc 中的action 能够像<br />&nbsp;&nbsp; struts mvc 的DispatchAction一样?<br /><br />我直接崩溃，那么喜欢struts 的DispatchAction你就用struts啊，为难我么！<br />不知道哪位大牛知道呀？
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252339" style="color:red;">已有 <strong>4</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 17:47:01 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252339</link>
        <guid>http://www.javaeye.com/topic/252339</guid>
      </item>
          <item>
        <title>自己开发的Adobe Flex/Air网络应用 上线</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiorry.javaeye.com">jiorry</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250749" style="color:red;">http://www.javaeye.com/topic/250749</a>&nbsp;
          发表时间: 2008年10月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对Adobe Flex比较有兴趣， 闲暇时间打算写一个网络记事本。 但是功能单一，所以之后又加入了“闹钟”，“RSS新闻”和“相册”功能。&nbsp; 十一长假，进行了收尾，今天把它放到了网上。 <br /><br />网址是： <a href="http://www.box200.cn" target="_blank">http://www.box200.cn</a> <br /><br />我有一些琐碎的资料，现在可以放到box200里了。查阅的时候比较方便。 <br />闹钟功能也能每天提醒我定时吃苹果。 <br />再顺便看看最新的新闻。 <br />网盘，太耗服务器资源，所以只做了相册功能。 <br /><br />其他功能，想到了，再加。 <br /><br />我想把BOX200做好做强，但是个人能力有限，希望大家能对BOX200未来出路进行讨论。 <br /><br /><br /><img src="http://jiorry.javaeye.com/upload/picture/pic/23119/d233458f-6cb0-3f21-b211-1c18cffe6dd8.png" /><img src="http://jiorry.javaeye.com/upload/picture/pic/23121/b58b9050-e961-31ab-92d5-9c5bc2048865.png" /><br /><img src="http://jiorry.javaeye.com/upload/picture/pic/23285/f08fe2ba-6386-3cd8-887f-6b7438196d23.png" />
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250749" style="color:red;">已有 <strong>6</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Oct 2008 14:33:28 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250749</link>
        <guid>http://www.javaeye.com/topic/250749</guid>
      </item>
          <item>
        <title>MySQL数据库操作实战</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://touya.javaeye.com">touya</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251307" style="color:red;">http://www.javaeye.com/topic/251307</a>&nbsp;
          发表时间: 2008年10月10日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天项目发布，要做数据移行，要实现的功能很变态，时间很紧迫，基本上是使出了全身解数，才能有快又准地完成工作，期间发现很多小技巧串联起来使用，效果的确非常好。<br /><br />武器：<br />1 mysqldump+mysql命令=>数据的导入导出，备份恢复<br /><br />2 perl命令行=>很多时候，你有一个想法，它就能只用一句话，帮你实现它，省得编写很多代码的麻烦<br /><br />3 shell命令=>组合拳，单独的命令谁都会，组合起来使用，需要一些经验的积累<br /><br />4 强大的编辑器支持UltraEdit/EmEdit等=>UltraEdit最专业，但不支持字符集转换；EmEdit支持字符集转换，且最新版有很多插件可供选择，基本够常见的操作了，对于WEB开发人员来说，常需要在GB2312、utf8或者其他国家语言euc-jp、shift-jis等等编码中转来转去，EmEdit的确是首选，特别赞的还有EmEdit的录制键盘动作并播放的功能<br /><br />常见组合：<br />1 数据移行时：<br />mysqldump --opt -t -h locahost -P 23236 -p mydb table -w "id>27000" > table.sql<br />>输入密码<br />OK , mydb中的表table中id大于27000的所有数据列的INSERT语句就保存到table.sql中了。-h、-P、-p就不多说了，--opt 是mysqldump的最常用组合选项，可以认为是加速语句；-t 则很有用，表示--no-create-info，就是你不需要建表语句，只需要数据（INSERT语句）；-w就是where条件，也非常有用，让你有选择的导出数据。其他常见选项有：-d ： 只需要建表语句，不需要insert语句；-c ：给每个insert语句加上列名（field），默认时，insert语句是“insert into `table` values (1),(2),(3);”，而加上-c后，就变成了“insert into table(id) values (1),(2),(3);”。有什么用？一会儿自会明白。<br /><br />如果表中数据非常多，导出insert语句就非常长（默认情况下，一个表的所有数据都在一个insert语句中，不换行），要查看这个文件常常引起死机，无论是linux下用vi，less查看，还是windows用EmEdit等编辑器，因为他们都是以行为单位load数据的，一行的数据过大就会内存占用过大，怎么办？<br /><br />你发现，只需要在EmEdit里查找“),(”这个字符串，将它替换为"),\n("，也就是加个换行，就行了，于是就这么做，结果发现——当数据量达到上万时，EmEdit就像数羊一样一个一个替换，等它换完，你都睡了一觉了！！<br /><br />怎么办呢？你当然知道写个脚本就行了，很容易，但是花的时间多，还需要测试，有简单办法吗？恩，那就轮到perl单命令行上场了：<br />perl -i.bak -pe 's/\),\(/\),\n\(/g' table.sql<br />OK，替换结束，且生成了一个备份文件table.sql.bak，如果你发现写错了，效果不对，还有救：）<br /><br />当然了，如果你会用sed、awk等强大的编辑工具，这个也是小case，这里就不多说了。<br /><br />2 数据导入<br />导出的数据经过处理，就要导入目标数据库，现在有一个表，字段非常多，其中主键为id，导入另一个数据库的相同表里，但是id不想直接插入，而是只要数据，id最好是自动生成的，跟在目标数据表最末一条数据之后即可，以免主键冲突。怎么搞呢？<br />这时候就能用上刚才说到的-c选项了，加了-c，导出的数据有field列，只需要把其中的id列都替换为空即可：）<br />这个替换过程，用EmEdit或上面说到的perl命令行都可以，只是速度的区别了。<br /><br />3 接上面的问题，老数据导入了新的表，生成了一串新的连续id，但和老数据完全不一样了，现在有其他几张表中使用了老数据的id作为外键，要把它们统一改为新的id。例如：<br />老数据中table.id=10010，有一个表table2.table=10010,是外键关系，要把这个table2.table改为新数据表中自动产生的那个id，就比如说是6041.现在手头上的数据只有老id列表，且知道插入新表中的id是自增的，每次加1，从6041开始，怎么快速修改 table2，table3中的相应外键呢？<br />一个文件：<br />10010<br />10201<br />11301<br />11499<br />……<br /><br />要替换成：<br />update table2 set table=6041 where id=10010;<br />update table2 set table=6042 where id=10201;<br />update table2 set table=6043 where id=11301;<br />update table2 set table=6044 where id=11499;<br />……<br /><br />我们可以这么组合手头的工具：<br />perl -i.bak -pe 'BEGIN {$x=6041} s/^(\d+)/update table2 set table=$x where id=$1;/ ; $x++' file.txt<br />OK，搞定<br />这个例子的特色其实就是perl命令行中的BEGIN的用法，有begin，当然有end，具体就自己查查文档吧：）<br /><br />4 还有EmEdit中的录制键盘动作并播放也很常用，毕竟写正则比较费脑子，用工具虽然处理速度慢一些，但是思考速度要快很多。今天碰到一件事，需要把服务器上某个目录中的bmp图片都转为jpg格式，也是要使用组合拳的，其中就用到了EmEdit的录制播放功能。<br />已知某目录下有N多bmp图片，通过convert命令可以转格式（安装Image::Magick模块即可）<br />怎么搞？<br />find ./ -name "*.bmp" > bmp.txt<br />先拿到文件列表再说。<br /><br />在EmEdit中打开该列表，一行行文件名。<br />你发现你想做的就是：<br />./dir1/dir2/file1.bmp<br />./dir1/dir2/file2.bmp<br />./dir1/dir2/file3.bmp<br />转变为：<br />convert ./dir1/dir2/file1.bmp ./dir1/dir2/file1.jpg<br />convert ./dir1/dir2/file2.bmp ./dir1/dir2/file2.jpg<br />convert ./dir1/dir2/file3.bmp ./dir1/dir2/file3.jpg<br /><br />这是一个非常有规律的动作，在行首，按shift+End（选择），ctrl+c（复制），End（到行尾），空格，ctrl+v（粘贴），backspace三次，输入jpg，HOME到行首，输入convert空格，下一行，HOME到行首<br />只要把这个操作序列记录下来，对每行都是一样操作，这时就可以使用EmEdit的录制+播放功能了，录制完成后，按F4快捷键，一爽到底~~yeah~~<br /><br />运行之后要删除原图：<br />在shell下：<br />find ./ -name "*.bmp" | xargs -n1 rm -f<br />(找到本目录下的bmp图片文件名列表，一个一个传给rm -f，删之，慎用)<br /><br />5 数据库恢复（从bin-log中恢复数据库也是一个非常重要的技巧），出现误操作或DB服务器不幸意外丢失数据时，常常要查bin-log来试图恢复数据，下次接着聊吧，累了……<br /><br />呵呵，乱写写，好像不只是数据库操作了，不过挺实在，欢迎各位拍砖吧
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251307" style="color:red;">已有 <strong>5</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Oct 2008 15:03:42 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251307</link>
        <guid>http://www.javaeye.com/topic/251307</guid>
      </item>
          <item>
        <title>在web集群环境下如何实现网站全局变量</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shinewang.javaeye.com">shinewang</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251854" style="color:red;">http://www.javaeye.com/topic/251854</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近正在开发一个网站，碰到一个关于web集群环境下全局变量实现的问题，例如网站是否开放用户注册，禁用的IP列表这类不经常更改却频繁调用的系统设置，如何实现才能保证不影响系统性能，并且修改后能及时更新到每台服务器？<br /><br />考虑想了几种方法：<br />1.存在数据库中，每次调用时去查数据库 <br />每次都需要查数据库会不会影响性能？<br /><br />2.存在数据库中，本地有一个config类作缓存，每隔一段时间调用计划任务和数据库同步一下<br />更新后同步到其他服务器需要一段时间，不是很及时<br /><br />3.存在数据库中，本地有一个config类作缓存，用JMS发送/接收更新数据<br />需要引入JMS<br /><br />4.直接写在config类中，不提供在web界面的修改配置，修改配置需要改写config类，然后重新部署到各服务器<br />修改配置需要修改代码，管理起来不方便，另外java的热部署只更新这个修改了的config类吗，会不会影响jvm里面其他的类，也就是会不会影响用户？<br /><br />5.存在配置文件中每次读文件，更新时同上一方案<br />性能？热部署？<br /><br />这个问题应该很简单吧，由于不是做互联网的，没什么经验。各位有什么好的想法？
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251854" style="color:red;">已有 <strong>3</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Oct 2008 19:15:31 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251854</link>
        <guid>http://www.javaeye.com/topic/251854</guid>
      </item>
          <item>
        <title>项目管理之我见（一）——代码管理</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhuzhsh.javaeye.com">zhuzhsh</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252354" style="color:red;">http://www.javaeye.com/topic/252354</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 1）代码命名和书写规范，改掉一些坏习惯</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;大家都比较清楚现在的开发框架越来越多，需要自己写的代码越来越少，不规范的情况也越来越少。但是仍然会存在不规范的写法。比如说，有的开发人员已经习惯了原来的调试方式，喜欢用System.out来输出调试信息，而不喜欢用log4j之类的日志框架来输出调试信息，有人则更喜欢在jsp写代码，即使已经有了新的开发框架一再的要求还是喜欢在jsp里面直接写java代码。看来习惯是很可怕的。&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2）系统框架要足够清晰，容易进行维护</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 现在一般都会写一个增/删/改/查的功能，java文件的命名都是有一定的规范的，这样就会层次清晰，任何人维护都会很容易修改其中的代码。现在一般的项目中都用到了事务和缓存，如何更高效率的添加事务处理和缓存功能，这是一个很值得考虑的问题。第一，可以对每个方法里面添加事务或者缓存的处理代码，但是这样成本会大大提高。第二，使用AOP处理，只需要给需要处理的类添加Spring的配置就可以了。第三，使用AOP给所有符合条件的类的方法添加事务或缓存处理。所以一般会将架构分为三层Action,Service,Dao，Service主要是处理业务逻辑，也是主要的事务和缓存处理的地方，Dao主要是负责数据库的操作，Action主要是负责前端显示的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 3）配置管理规范</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置管理只是一种代码管理的工具，正确使用才是关键。要养成好的习惯，如，每次修改文件之前要先更新代码，提交代码时要对修改的内容做一个明确的说明，以方便其他开发人员查看。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252354" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 18:56:30 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252354</link>
        <guid>http://www.javaeye.com/topic/252354</guid>
      </item>
          <item>
        <title>折腾百度空间</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chbest.javaeye.com">chbest</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252287" style="color:red;">http://www.javaeye.com/topic/252287</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          公司要做个人空间sns类似的模块.<br />最先考虑的就是百度空间.<br />自己有个百度空间的账号.<br />hi.baidu.com/水痕2000<br />无论在ie还是火狐上面敲,都能成功访问.一想百度还真厉害.这样也成?<br />utf-8 和gbk都处理的这么好<br />在接着:<br />申请账号:水痕水痕<br />申请gbk下'水痕水痕'对应的账号:姘寸棔姘寸棔<br />然后在ie和火狐下进入:<br />hi.baidu.com/水痕水痕 || hi.baidu.com/姘寸棔姘寸棔<br />发现hi.baidu.com/姘寸棔姘寸棔 在火狐下 是进入 水痕水痕 的空间;在ie下进入的姘寸棔姘寸棔的空间.<br />然后在姘寸棔姘寸棔空间下 点blog或者相册模块,又跑到 水痕水痕 里面去了.<br />得出结论:用中文名做url的path是不可取的.<br />1 百度默认连接是用gbk编码的<br />2 百度处理请求的时候,默认以utf-8进行转译,查询不到数据库在用gbk;<br />基本来说姘寸棔姘寸棔的空间很难点进去<br />最后放上连接:<br />http://hi.baidu.com/%E6%B0%B4%E7%97%95%E6%B0%B4%E7%97%95 <br />http://hi.baidu.com/%CB%AE%BA%DB%CB%AE%BA%DB<br />都是进一个空间
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252287" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Oct 2008 15:59:23 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252287</link>
        <guid>http://www.javaeye.com/topic/252287</guid>
      </item>
          <item>
        <title>犹豫了两天，终于鼓起勇气把简历拿出来，想批人的尽管进来，挨着饿恭候呢</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yanshiyi.javaeye.com">yanshiyi</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249901" style="color:red;">http://www.javaeye.com/topic/249901</a>&nbsp;
          发表时间: 2008年10月07日
          <br/>
          