软件是对质量的不懈追求

#

struts2 亲密接触 json(json result type)

最近使用jquery,ajax调用后台服务非常需要一个json返回类型,网上只有一个可用的插件,叫jsonplugin 。但是测试了一下,两个版本居然都有错误,而且通过文档知道,它的使用还是相对复杂的,需要配置哪个对象需要转换,那些对象不需要。不难想象,通常我们只需要将一个对象转换成json格式,如果数据多,大不了都塞到一个对象里。
这样说起来,倒不如弃配置,转而采用规则,规定action中如果需要为ajax提供服务器端服务,必须定义一个名字叫json的成员类,类型当然是最通用的Object。然后实现一个Result,在value stack中,找到名字叫json的对象,把它序列化成json串写回客户端就ok了。

  注意:如果json的实际类型是String,这个String必须符合json语法规范。Map List之类的就无所谓,直接用就是了

  Result代码如下:

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.util.ValueStack;
import net.sf.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsStatics;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JSONResult implements Result {
   
    private static final Log log = LogFactory.getLog(JSONResult.class);

    
public void execute(ActionInvocation invocation) throws Exception {
        ActionContext actionContext 
= invocation.getInvocationContext();
       
        HttpServletResponse response 
= (HttpServletResponse) actionContext
                .get(StrutsStatics.HTTP_RESPONSE);

        
try {
            String json;
            Object jsonObject;

            
// generate JSON
           
            ValueStack stack 
= invocation.getStack();
            jsonObject 
= stack.findValue("json");
            json 
= JSONObject.fromObject(jsonObject).toString();
           
            log.debug(json);
           
            response.setContentType(
"text/xml;charset=utf-8");
            response.getWriter().write(json);

        } 
catch (IOException exception) {
            log.error(exception.getMessage(), exception);
            
throw exception;
        }
    }

}
struts配置如下:
  <result-types>
   
<result-type name="json" class="JSONResult"/>
  
</result-types>

<action  >
    
<result name="ajax" type="json" />
</action>

action部分代码:
   

    
private Object json;
    
public Object getJson() {
        
return json;
    }

    
public void setJson(Object json) {
        
this.json = json;
    }

posted @ 2009-05-14 15:20 BlakeSu 阅读(5092) | 评论 (2)编辑 收藏

中国软件产业问题何在(转)

中国的软件产业正陷入低迷,更可怕的是,认识到危机所在的却寥寥无几!

如果说数年前以求伯君先生为代表的金山公司能推出一些激动人心的软件产品的话,近年来我们则不得不正视中国软件产业每况愈下的现实。

表面看来是这样:软件从业人员越来越多,动则上万人的公司,数百亩的产业园,产值的增长却远远落在投入增长的后面,换言之,中国软件产业利润率正逐年 下降,外包公司越来越多。由此带来一系列问题——"软件开发"工作变得愈加简化,从业人员待遇每况愈下,整体素质无法得到提升,企业勉力维持,只好扩大规 模,降低成本,以吸引更多的外包服务,而把行业拖入恶性循环。

由此即便看到表面上的浮华——如东软集团的整体上市——但不得不为其发展方向而感到担忧。

香港人本管理机构软件事业部高级项目经理郑光辉先生(Raymond)与记者谈到中国的软件事业时,无不担忧的说,有如过去金山wps office出来对抗外资巨头(microsoft)的情况已经不复存在。所有的中国企业表现出垂死挣扎的状况,虽然不乏规模相对大一些如用友软件,东软 集团,等等。但也无一不是靠1. 模仿国外产品;2. 通过销售人员抓客户关系;来达成业绩,而如金山软件,盈利重点已转移至在线游戏产品上。

郑先生谈到,中国的行业性垄断造成进入壁垒,本土巨头公司集中在政策性行业,无法为更具有竞争力的民营软件企业提供生存土壤,反而造就了如南瑞、宝信等等衍生软件公司。(宝信隶属宝钢集团,南瑞隶属国家电网,等)。

而反观Larry Erison的Oracle 公司,Tom Siebel的Siebel公司,都在极短的时间内造就出伟大公司,并将之理念深深植根于客户,产品传播于全世界,所依赖于培育同时引导客户需求。

郑先生神色凝重的谈到,人本管理机构软件事业本部从香港转移到广州,并同时在北京和上海设立办事处,一方面看到的是中国软件产业的问题,另一方面更是 希望藉由长期以来对美欧软件企业研究的经验和知识积累,帮助内地软件企业从根本上解决发展问题。同时也希望内地企业不要单纯的追求短期利润,当务之急更要 协力将中国软件产业发展环境建设起来。

posted @ 2009-04-21 11:32 BlakeSu 阅读(161) | 评论 (0)编辑 收藏

莫要太信任数据库,你会失望的

    数据库啊,数据库!
    虽然现在应用架构强调业务逻辑不依赖数据库,仅把数据库作为信息存储的手段。但是国内的情况似乎还是挺以数据库为中心的。数据库虽然存在了多年,也算成熟了,但是很多书上其实对如何有效使用数据库的强调很不够。

    尤其是对java而言,JDBC是java访问数据库的标准,也就是独立于数据库的。虽然如此,数据库厂商大概不会为了jdbc去改自己的数据库,要知道,数据库肯定是要提供多种接口方式的,比如C。数据库一改,这些接口很可能都要改,这就不好了,还可能因为接口做不到向下兼容得罪现有用户。于是,成本比较低的做法,就变成了在jdbc层做手脚,也就是通常所说的“忽悠”。
    有些数据库其实不支持预编译sql的,但是仍然支持PrepareStatement,这里就会引起使用者的困惑,不清楚它内部到底是怎么实现的。 还有些数据库其实不支持jdbc所提供的那些事务隔离级别,或者跟jdbc规定的那些没有严格对应关系。这就更令人恼火了,经常有人抱怨设置隔离级别没有效果,大概就是这个原因所致。

    数据库还有一个很少被提及的问题,那就是并发问题中的第二类丢失更新。比如:两个客户端A、B对同一条订单数据进行操作。事件序列如下:
    A:打开订单
    B:打开订单
    A:保存修改
    B:保存修改

   aha!A的修改就很可能丢失了。不要抱怨数据库怎么连这个都解决不了,其实并不是解决不了,而是没有什么通用的方案,倒不如把它交给开发人员自行选择方案的好。开发人员可以选择乐观锁和悲观锁,一切都要根据业务情况来。
   问题是,资料上边很少提及会有这样的情况发生,开发人员也就不曾处理过这个问题。根据我的理解,我觉得存在update操作的表都要进行这个处理,否则数据的正确性就无从保证。

posted @ 2009-04-10 11:07 BlakeSu 阅读(126) | 评论 (0)编辑 收藏

富国强软(二):不可或缺的标准化

   我国从来都是一个缺乏标准化的国家,从古至今都是如此,我们似乎也不太喜欢被标准化束缚,反而更喜欢某种自在。如今更是愈演愈烈,每每有重大改革,中央都是鼓励地方积极探索,探索的不好下台,探索的好推开。可见,可国内当个官也不容易啊,要时时处处当领导的马前卒,呜呼。。。
    但是在软件行业,不尊重标准的结果却是可怕的,甚至谈不上自在,简直就是折磨,让人感觉弃之而后快,然而重新来过的好像也好不到哪里去。我曾经就因为实在无法忍受系统的混乱而愤然离去,不知道有多少人有像我一样的经历。
   标准的代码实在是功德无量,甚至对技术人员形成一种吸引力,更没有人忍心破坏这种和谐之美,哦。。代码之美。。
    以下是我在做国外项目时他们的环境配置,他的整个开发环境是打包成安装程序的,装上以后所有的东西都已经配置好了,你所要做的就是checkout代码,编译就好了。firefox也是这样做的,为什么呢,无他,就是编译程序太复杂了,复杂到需要专人维护的程度,于是大多数人实际是不需要懂的,用就是了。国内还没见过做到这种程度的。(以下是自己翻译的,有蹩脚之处,您就凑合看了)

应用服务器配置

某些配置(如:连接池配置)是依赖于应用服务器的。为了解决这种状况,build.xml文件使用属性来区分不同的服务器。
为了表明你在使用JBoss服务器,你必须定义deploy.config属性,值为jboss.
      在左侧面板,选择"Ant/Runtime"(eclipse的Preferences窗口)
选择"Properties"选项
      点击"Add Property..."按钮并定义"deploy.config"属性,值为"jboss"
      点击"Apply"按钮

为了部署一个ear文件到应用服务器目录,必须定义属性"dir.deploy"来制定正确的目录。
    
在左侧面板,学责"Ant/Runtime"(eclipse的Preferences窗口)
选择"Properties"选项
点击"Add Property..."按钮并定义"dir.config"属性,值是应用服务器的目录。
例如:“D:\apps\jboss-4.0.0\server\default\deploy”.
点击"Apply"按钮

代码风格
本司代码规则要求所有参数都以"p"为前缀。如下设置可在代码生成时使用此规则:
左侧面板,选择 "Java/Code Style"(eclipse的Preferences窗口)
在"variable list"列选择 "Parameters".
在"Prefix list"列输入"p".
点击"Apply"按钮
 
代码格式化
本司有标准的代码格式化规则。这些规则保存在"…\apps\config\codeformatter-rules.xml"文件中。遵循以下
步骤可导入规则:
     左侧面板,选择 "Java/Code Style/Code formatter",
这里有两个"Import …"按钮,点击页面右上的一个,选择"codeformatter-rules.xml"
点击"Apply"按钮

代码模板
本司有标准的代码模板。这些模板存放在文件 "\apps\config\codetemplates.xml",。遵循以下
步骤可导入模板:
左侧面板,选择 "Java/Code Style/Code Template",
这里有两个"Import …"按钮,点击页面右上的一个,选择"codetemplates.xml"
点击"Apply"按钮 

组织imports
本司在文件“…\apps\config\importorder中有标准的import顺序,导入步骤如下:

       左侧面板,选择 “Java/Code Style/Organize Imports”,
       这里有两个"Import …"按钮,点击页面中间右侧一个,选择"importorder"文件,
      点击"Apply"按钮    

编辑模板
本司有标准的模板,位于文件"…\apps\config\editor-templates.xml",导入步骤如下:

       左侧面板,选择 "Java/Editor/Templates",
这里有两个"Import …"按钮,点击页面中间右侧一个,选择"editor-templates.xml"文件,
       点击"Apply"按钮
      
Checkstyle
本司标准化了Checkstyle的使用。配置保存在文件 "…\apps\config\checkstyle-rules.xml" . 导入步骤如下:

       左侧面板,选择 "Checkstyle",
       点击 "New …" 按钮.
       类型下拉列表中,选择"External Configuration".
       在name文本框输入"My Checks",
       选择文件"checkstyle-rules.xml".
   
拼写检查配置
    在Eclipse中使用拼写检查是可能的。步骤如下:
      
       左侧面板,选择 "general/Editors/Text Editors/Spelling",
       选中 "enable spell checking" 复选框
       "User defined dictionary:"中输入D:\apps\config\my.dic
        选中 "Make dictionary available to content assist"
       点击"Apply"按钮  
      
      
      





posted @ 2008-11-10 22:05 BlakeSu 阅读(245) | 评论 (0)编辑 收藏

中国架构师,名符其实有多少?(转)

原文看这里:http://blog.chinaitlab.com/html/65/1041665-149664.html

架构师,听起来一个响当当的头衔,但是你能分得清它跟项目经理,产品经理,项目负责人,CTO等头衔的细微区别吗

参加什么技术活动,一看人家名片亮出来,卡!系统架构师!自己都不好意思回赠名片了,因为自己才印着一软件工程师!以后一定换成个“高级软件工程师”再说。要说架构师这词也是翻译过来的,英文是Architect,那么中国的架构师和国外的架构师相比到底怎么样呢?不妨听听我朋友的说法吧:

“系统架构师不是科学家。科学家的工作可以说是非常难得的工作(技术含量高),而架构师的工作主要是非常庞杂,在庞杂的技术要求中寻求最优雅,简洁的解决方案。”

“架构师的面临的问题通常有下面几个特征:1)要解决的问题非常庞杂2)技术实践的途径非常庞杂3)系统环境与约束比较复杂。在这一系列凌乱又庞大的要求中,有能力分辨问题的本质,并能给出大家认可的——简洁且具有伸缩性的解决方案的人通常被称为架构师。”

“现在Web应用服务器这一块比较火,涉及的技术内容非常多,所以这个领域顶着系统架构师头衔的人特别多。”

“不能说国内的架构师的总体素质不如国外。关键是国内公司所面临的问题与国外公司面临的问题差距太大。你不能指望在小河里面游泳的人去穿越英吉利海峡。”

“不能说国内架构师的能力与‘架构师’这个头衔名不符实。其实是名符其实的,只不过符合的是国内现状的‘实’。”

“架构师的职责是提出最佳实践的解决方案。所以有时候需要验证方案的可实践性。只不过大多时候,在熟悉的领域,‘验证方案的可实践性’通过对方案的论述足以证明。”

“架构师的另外一个职责是保证‘解决方案’的实践过程不走样。这个需要架构师在团队工作中提供协作。至于协作方式,未必需要编程。但是不排除出现较困难的问题时,动手编程解决的情况。”

“从某种意义上说,最下层的架构师和以前的技术负责人差不太多。或者另一种情况,或者架构师的地位相当高,下面的是技术负责人。技术负责人需要负责技术工作的质量因素,需要参与细节;架构师更多负责方案质量,很多时候不需要过多的参与细节。”

“架构师也要从技术负责人过渡而来,不可能不参与细节直接成为架构师。没有足够的细节工作积累,不能保证方案的可实践度。提解决方案时就容易出现空中楼阁,看着好看,实施起来特别困难。”

“说白了,架构师和技术负责人到底有多大。更多取决于公司的安排,不取决于这个架构师和技术负责人的Title。”

“CTO是和技术有关系的最高负责人,要承担与公司技术相关问题的行政责任。”

总而言之,朋友把这个“架构师”的定义是剖析得淋漓尽致了,就看大家如何对号入座了。


posted @ 2008-10-21 12:19 BlakeSu 阅读(218) | 评论 (0)编辑 收藏

富国强软(一):开篇

 对于国内的软件水平,不知各位看官如何看待。这样吧,大家不妨看一下自己电脑上用了什么国产软件。
 我电脑上只有QQ、迅雷、360安全卫士、招商证券全能版而已。
 
 操作系统是微软的,oracle,mysql,eclipse,office等等全都是进口的。
 
 整体感觉是北美、欧洲最强,这两个地区差别不大,甚至中东地区也偶有佳作,但诺大一个中国为什么就
 没有一款拿得出手的软件呢?国内的软件到底怎么了?
 
 究其原因,我想每个人都能说出一堆,但可能并不清楚哪个是决定性的,哪个是次要的。
 
 本博客试图寻找到病根,并希望能开出一剂良药。

posted @ 2008-10-09 15:50 BlakeSu 阅读(138) | 评论 (0)编辑 收藏

仅列出标题
共12页: First 上一页 4 5 6 7 8 9 10 11 12