登录 |
  • 注册
  • 最近收到的网站推广邮件

    2008年04月30日11:40:07 星期三 | 作者:marcian

    最近收到的几封网站推广邮件,分别来自 新浪空间同楼网WAYNXING。大致都是某某给你发了一个消息或者某某邀请你加入,最厉害的是WAYN,差不多平均每天一封,而且信件内容不带重样的。这种推广方式很土,但是很有效,我到WAYN注册了。

    这些网站都是做什么的呢?SNS,不同侧重面的SNS。最近国内某个大佬说SNS战斗已经结束,太可笑了。在所有的关系中,人际关系是最复杂的,哪个网站可以涵盖所有的人际关系呢?这样的网站不存在,即使如QQ这样庞大用户群的网站也做不到。SNS的战斗已经开始,但远未结束,也不可能结束。

    在SNS领域,还有很多事情可以做。

    UML FOR JAVA PROGRAMMERS 读书笔记(二)— 类图

    2008年04月27日20:54:18 星期日 | 作者:marcian

    类图是UML中的一个基本构件,是其他图的基础。在IBM Developerworks上有一篇全面而通俗易懂的介绍类图的文章,这篇文章很好的阐述了类图的概念以及相互间的关系。
    UML 基础:类图

    MySQL性能优化:概述

    2008年04月25日18:04:36 星期五 | 作者:marcian

    对基于DB Drive的网站来说,DB存取往往是一个性能的瓶颈点,对DB进行优化是改善网站性能的一个重要手段。不同的DB有不同的优化方式,对于MySQL,个人以为可以从以下几个方面入手:

    SQL Query以及DB Design的优化 SQL Query和DB Design紧密相关,所以这两者的优化需要同步进行。

    DB Parameter的优化:MySQL有很多的参数来调节DB的性能,这种优化需要反复多次进行才能达到比较好的效果。

    硬件的优化:这包括通过提升硬件配置、cache、建立集群等方式来进一步提升数据库的性能。

    从顺序上来说,应该先Query、DB Design的优化,然后再DB Parameter的优化,最后是硬件的优化。 我觉得这是一个比较科学的优化顺序。

    DB的优化是一个需要多次进行,反复调整的过程,这个系列的blog将按照上面提及的顺序来探讨对MySQL进行优化进而提升其性能的各种方法。

    无刷新上传附件的DEMO

    2008年04月20日21:39:15 星期日 | 作者:marcian

    这是在 Sina 时做的一个邮件无刷新上传附件的DEMO,后来把这个DEMO贴在了 JaveEye ,我都把它忘得差不多了,今天无意中登录 JavaEye ,居然有人在用这个DEMO。决定整理一下,把它贴出来。

    方案选择:
    查阅了一些资料,目前实现实现无刷新上传主要有两种方案,即利用隐藏的iframe来模拟无刷新上传和利用xmlhttp分块上传文件。这两种方案中,利用隐藏的iframe来模拟无刷新上传用的最为普遍,实现起来也比较容易。而利用xmlhttp分块上传的方式,google的结果显示用的较少,特别是实用方面,而且代码实现复杂。考虑到要同时实现类似Gmail的附件添加方式,最终选择了利用隐藏的iframe来模拟无刷新上传的方案。

    利用隐藏的iframe来模拟无刷新上传的原理
    利用隐藏的iframe来模拟无刷新上传的原理比较简单,在页面中包含一个form和一个iframe,其中ifram设置为不可见,同时将form target属性设为iframe的名字,这样当上传的时候,刷新的就是iframe中的页面,而主页面则不会有任何变化。可以在iframe中的页面中编写上传后客户端要执行的javascript代码,这样可以轻松的实现对主页面的操作。

    类Gmail附件添加方式的实现
    Gmail的附件添加方式有着比较好的用户体验,原本希望可以通过阅读Gmail的代码来了解Gmail的解决方案,但是发现这个想法有些不靠谱。所以最终采用自己的方式来解决这个问题并实现了良好的浏览器兼容(IE和Firefox),对于Firefox,是通过利用javascript对DOM的操作,来动态的创建和删除文件选择框.对于IE,则是结合Javascript,DOM,CSS来实现所要求的效果。在两种浏览器下,均可以进一步扩展,来实现选择后即自动上传的效果。

    DEMO:无刷新上传附件的DEMO

    用WebWork的Interceptor实现权限管理

    2008年04月17日23:35:38 星期四 | 作者:marcian

    在WEB应用中,权限管理是一个非常普遍的功能,不同的用户具有不同的权限并且只能执行该权限对应的操作。实现权限管理的方式很多种,可以根据不同的应用场景来进行设计。在 AbcSale 的后台管理中,使用WebWork的Interceptor来实现权限管理,通过拦截对action的请求,判断当前用户是否有权执行该action,有则执行action,无则提示用户无权限。

    实现一个Interceptor需要两部分的工作,实现一个具体的Interceptor类以及将这个类配置到action。

    实现一个Interceptor类的代码片断:

    public class AdminPermissionInterceptor implements Interceptor{
    
    	private AdminActionService adminActionService;
    	private Global global;
    	private ShowException showException;
    
    	public void setGlobal(Global global)
    	{
    		this.global=global;
    	}
    
    	public void setAdminActionService(AdminActionService adminActionService)
    	{
    		this.adminActionService=adminActionService;
    	}
    
    	public void setShowException(ShowException showException)
    	{
    		this.showException=showException;
    	}
    
    	public void init()
    	{
    
    	}
    
    	public void destroy()
    	{
    
    	}
    
    	public String intercept(ActionInvocation actionInvocation)throws Exception
    	{
    		HttpServletRequest request = ServletActionContext.getRequest();
    		HttpSession session=request.getSession();
    		if(session.getAttribute("group")==null)
    		{
    			request.setAttribute("tip", global.getOperateErrorTip());
    			return  global.getResultTipType();
    		}
    		else
    		{
    			try
    			{
    				boolean permission=false;
    				String actionName=actionInvocation.getInvocationContext().getName();
    				Map map=adminActionService.retrieveAdminAction(actionName);
    				List gList=(List)map.get("adminActionGroupTbs");
    				int gid=((Integer)session.getAttribute("group")).intValue();
    				for(int i=0;i<gList.size();i++)
    				{
    					if(gid==((Integer)gList.get(i)).intValue())
    					{
    						permission=true;
    					}
    				}
    				if(permission==true)
    				{
    					return actionInvocation.invoke();
    				}
    				else
    				{
    					request.setAttribute("tip", global.getOperateErrorTip());
    					return  global.getResultTipType();
    				}
    			}
    			catch(Exception e)
    			{
    				showException.show(request, e);
    				return global.getResultExceptionType();
    			}
    		}
    	}
    
    }

    配置文件代码片断

    <interceptors>
      <interceptor name="params"  class="params"></interceptor>
      <interceptor name="servlet-config" class="servlet-config"></interceptor>
      <interceptor name="permission" class="adminPermissionInterceptor"></interceptor>
      <interceptor-stack name="permissionStack">
         <interceptor-ref name="params" />
         <interceptor-ref name="servlet-config"/>
         <interceptor-ref name="permission" />
      </interceptor-stack>
     </interceptors>
     <action name="addAdminUser" class="addAdminUserAction">
       <interceptor-ref name="permissionStack"></interceptor-ref>
       <result name="success">xxxx.jsp</result>
       <result name="tip">xxx.jsp</result>
     </action>

    代码展现的是一个基于spring IoC的Interceptor实现,也可以使用AroundInterceptor来实现,通过Interceptor将分散于各个action的验证逻辑进行了集中,使代码结构更加清晰,而通过Interceptor stack则可以很容易的扩展Inteceptor。实际上,webwork强大的Interceptor设计正是我最初选用它作为MVC框架的主要原因。

    UML FOR JAVA PROGRAMMERS 读书笔记(一)

    2008年04月16日10:13:46 星期三 | 作者:marcian

    《UML FOR JAVA PROGRAMMERS》是Bob大叔的作品,相对于很多注重理论的UML书籍来说,这本侧重于实践和应用的书很对我的胃口。

    UML(Unified Modeling Language)用图形化的方式来描述软件的概念。Martin Fowler 将其分为概念(conceptual),规格(specification),实现(implementation)三个层次。

    图类型 :

    静态图(static diagram),描述类、对象、数据结构以及他们之间的关系等软件要素中不变的逻辑结构。包括用例图、类图、对象图、组件图、展开图。

    动态图(dynamic diagram),描述实体变化、执行流程等软件执行过程中的变化过程。包括序列图、协作图、状态图和活动图。

    物理图(physical diagram),描述源文件、库、数据文件等软件的物理结构。