#
最近使用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;
}
中國的軟件產業正陷入低迷,更可怕的是,認識到危機所在的卻寥寥無幾!
如果說數年前以求伯君先生為代表的金山公司能推出一些激動人心的軟件產品的話,近年來我們則不得不正視中國軟件產業每況愈下的現實。
表面看來是這樣:軟件從業人員越來越多,動則上萬人的公司,數百畝的產業園,產值的增長卻遠遠落在投入增長的后面,換言之,中國軟件產業利潤率正逐年
下降,外包公司越來越多。由此帶來一系列問題——"軟件開發"工作變得愈加簡化,從業人員待遇每況愈下,整體素質無法得到提升,企業勉力維持,只好擴大規
模,降低成本,以吸引更多的外包服務,而把行業拖入惡性循環。
由此即便看到表面上的浮華——如東軟集團的整體上市——但不得不為其發展方向而感到擔憂。
香港人本管理機構軟件事業部高級項目經理鄭光輝先生(Raymond)與記者談到中國的軟件事業時,無不擔憂的說,有如過去金山wps
office出來對抗外資巨頭(microsoft)的情況已經不復存在。所有的中國企業表現出垂死掙扎的狀況,雖然不乏規模相對大一些如用友軟件,東軟
集團,等等。但也無一不是靠1. 模仿國外產品;2. 通過銷售人員抓客戶關系;來達成業績,而如金山軟件,盈利重點已轉移至在線游戲產品上。
鄭先生談到,中國的行業性壟斷造成進入壁壘,本土巨頭公司集中在政策性行業,無法為更具有競爭力的民營軟件企業提供生存土壤,反而造就了如南瑞、寶信等等衍生軟件公司。(寶信隸屬寶鋼集團,南瑞隸屬國家電網,等)。
而反觀Larry Erison的Oracle 公司,Tom Siebel的Siebel公司,都在極短的時間內造就出偉大公司,并將之理念深深植根于客戶,產品傳播于全世界,所依賴于培育同時引導客戶需求。
鄭先生神色凝重的談到,人本管理機構軟件事業本部從香港轉移到廣州,并同時在北京和上海設立辦事處,一方面看到的是中國軟件產業的問題,另一方面更是
希望藉由長期以來對美歐軟件企業研究的經驗和知識積累,幫助內地軟件企業從根本上解決發展問題。同時也希望內地企業不要單純的追求短期利潤,當務之急更要
協力將中國軟件產業發展環境建設起來。
數據庫啊,數據庫!
雖然現在應用架構強調業務邏輯不依賴數據庫,僅把數據庫作為信息存儲的手段。但是國內的情況似乎還是挺以數據庫為中心的。數據庫雖然存在了多年,也算成熟了,但是很多書上其實對如何有效使用數據庫的強調很不夠。
尤其是對java而言,JDBC是java訪問數據庫的標準,也就是獨立于數據庫的。雖然如此,數據庫廠商大概不會為了jdbc去改自己的數據庫,要知道,數據庫肯定是要提供多種接口方式的,比如C。數據庫一改,這些接口很可能都要改,這就不好了,還可能因為接口做不到向下兼容得罪現有用戶。于是,成本比較低的做法,就變成了在jdbc層做手腳,也就是通常所說的“忽悠”。
有些數據庫其實不支持預編譯sql的,但是仍然支持PrepareStatement,這里就會引起使用者的困惑,不清楚它內部到底是怎么實現的。 還有些數據庫其實不支持jdbc所提供的那些事務隔離級別,或者跟jdbc規定的那些沒有嚴格對應關系。這就更令人惱火了,經常有人抱怨設置隔離級別沒有效果,大概就是這個原因所致。
數據庫還有一個很少被提及的問題,那就是并發問題中的第二類丟失更新。比如:兩個客戶端A、B對同一條訂單數據進行操作。事件序列如下:
A:打開訂單
B:打開訂單
A:保存修改
B:保存修改
aha!A的修改就很可能丟失了。不要抱怨數據庫怎么連這個都解決不了,其實并不是解決不了,而是沒有什么通用的方案,倒不如把它交給開發人員自行選擇方案的好。開發人員可以選擇樂觀鎖和悲觀鎖,一切都要根據業務情況來。
問題是,資料上邊很少提及會有這樣的情況發生,開發人員也就不曾處理過這個問題。根據我的理解,我覺得存在update操作的表都要進行這個處理,否則數據的正確性就無從保證。
我國從來都是一個缺乏標準化的國家,從古至今都是如此,我們似乎也不太喜歡被標準化束縛,反而更喜歡某種自在。如今更是愈演愈烈,每每有重大改革,中央都是鼓勵地方積極探索,探索的不好下臺,探索的好推開。可見,可國內當個官也不容易啊,要時時處處當領導的馬前卒,嗚呼。。。
但是在軟件行業,不尊重標準的結果卻是可怕的,甚至談不上自在,簡直就是折磨,讓人感覺棄之而后快,然而重新來過的好像也好不到哪里去。我曾經就因為實在無法忍受系統的混亂而憤然離去,不知道有多少人有像我一樣的經歷。
標準的代碼實在是功德無量,甚至對技術人員形成一種吸引力,更沒有人忍心破壞這種和諧之美,哦。。代碼之美。。
以下是我在做國外項目時他們的環境配置,他的整個開發環境是打包成安裝程序的,裝上以后所有的東西都已經配置好了,你所要做的就是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"按鈕
原文看這里:http://blog.chinaitlab.com/html/65/1041665-149664.html
架構師,聽起來一個響當當的頭銜,但是你能分得清它跟項目經理,產品經理,項目負責人,CTO等頭銜的細微區別嗎
參加什么技術活動,一看人家名片亮出來,卡!系統架構師!自己都不好意思回贈名片了,因為自己才印著一軟件工程師!以后一定換成個“高級軟件工程師”再說。要說架構師這詞也是翻譯過來的,英文是Architect,那么中國的架構師和國外的架構師相比到底怎么樣呢?不妨聽聽我朋友的說法吧:
“系統架構師不是科學家。科學家的工作可以說是非常難得的工作(技術含量高),而架構師的工作主要是非常龐雜,在龐雜的技術要求中尋求最優雅,簡潔的解決方案。”
“架構師的面臨的問題通常有下面幾個特征:1)要解決的問題非常龐雜2)技術實踐的途徑非常龐雜3)系統環境與約束比較復雜。在這一系列凌亂又龐大的要求中,有能力分辨問題的本質,并能給出大家認可的——簡潔且具有伸縮性的解決方案的人通常被稱為架構師。”
“現在Web應用服務器這一塊比較火,涉及的技術內容非常多,所以這個領域頂著系統架構師頭銜的人特別多。”
“不能說國內的架構師的總體素質不如國外。關鍵是國內公司所面臨的問題與國外公司面臨的問題差距太大。你不能指望在小河里面游泳的人去穿越英吉利海峽。”
“不能說國內架構師的能力與‘架構師’這個頭銜名不符實。其實是名符其實的,只不過符合的是國內現狀的‘實’。”
“架構師的職責是提出最佳實踐的解決方案。所以有時候需要驗證方案的可實踐性。只不過大多時候,在熟悉的領域,‘驗證方案的可實踐性’通過對方案的論述足以證明。”
“架構師的另外一個職責是保證‘解決方案’的實踐過程不走樣。這個需要架構師在團隊工作中提供協作。至于協作方式,未必需要編程。但是不排除出現較困難的問題時,動手編程解決的情況。”
“從某種意義上說,最下層的架構師和以前的技術負責人差不太多。或者另一種情況,或者架構師的地位相當高,下面的是技術負責人。技術負責人需要負責技術工作的質量因素,需要參與細節;架構師更多負責方案質量,很多時候不需要過多的參與細節。”
“架構師也要從技術負責人過渡而來,不可能不參與細節直接成為架構師。沒有足夠的細節工作積累,不能保證方案的可實踐度。提解決方案時就容易出現空中樓閣,看著好看,實施起來特別困難。”
“說白了,架構師和技術負責人到底有多大。更多取決于公司的安排,不取決于這個架構師和技術負責人的Title。”
“CTO是和技術有關系的最高負責人,要承擔與公司技術相關問題的行政責任。”
總而言之,朋友把這個“架構師”的定義是剖析得淋漓盡致了,就看大家如何對號入座了。
對于國內的軟件水平,不知各位看官如何看待。這樣吧,大家不妨看一下自己電腦上用了什么國產軟件。
我電腦上只有QQ、迅雷、360安全衛士、招商證券全能版而已。
操作系統是微軟的,oracle,mysql,eclipse,office等等全都是進口的。
整體感覺是北美、歐洲最強,這兩個地區差別不大,甚至中東地區也偶有佳作,但諾大一個中國為什么就
沒有一款拿得出手的軟件呢?國內的軟件到底怎么了?
究其原因,我想每個人都能說出一堆,但可能并不清楚哪個是決定性的,哪個是次要的。
本博客試圖尋找到病根,并希望能開出一劑良藥。