#
?
??? Eclipse插件JSEclipse 1.5 近日宣布發布新版本。
??? JSEclipse 是個Eclipse 下的免費Javascript 腳本編輯器,最大的特點就是支持js的自動完成功能,支持普通DOM對象的點取,如文檔對象,screen對象。除過基本的DOM對象支持外, JSEclipse對js文件內的Class和Function也能完美地支持自動完成。除過自動完成功能外,該插件還支持JS的語法高亮,錯誤和警告提示等等。該插件支持Eclipse 3.X。此次發布的新版本中進行了非常重要的提升。其中包括對代碼完成引擎的大幅度的改進,增加了代碼模板支持以及大量的幫助信息來簡化工作。
JSEclipse 1.5 支持JRE 1.4。
下載地址:
http://www.interaktonline.com/Products/Eclipse/JSEclipse/Try- Download/
我在教授
軟體設計課程,尤其是以使用案例圖在說明架構設計時,每一個用套件(Package)所界定範圍的系統,係指軟體應用系統,但卻幾乎不會談及到資料庫。因
為,軟體應用系統與資料庫是兩個不同的層次,甚至,把資料庫視為是應用系統的 "私有倉儲(private storage)",會比較恰當。
不過,這衍生出一個問題,學員不容易分清楚如何 "mapping" 抽象面的架構設計至實體的 IT 系統,尤其是資料庫的問題。所以,我會先帶一個問題問學員:在設計層次的考量中,進銷存系統有幾個資料庫?
這一個問題要能回答得出來,其假設前提的考量必須要瞭解,在整體的架構設計中,設計團隊到底將 "進銷存" 視為是一個,還是三個,甚至多個的子系統?
參考下圖1,這是把 "進銷存" 視為是單一的系統,所以,資料庫只有一個。
好處是什麼? 就是簡單,開發也容易。進銷存相關的資訊處理,都是在同一個資料庫內,並沒有分散的問題,所以當處理銷貨需要查詢庫存資訊時,只要下 SQL 敘述直接連結庫存的 TABLE 即可。
圖1、將進銷存視為一個整體系統
參考下圖2,架構設計之初時,就已把 "進銷存"
分為三個子系統(Sub-system),或者也可以稱之為元件(Component),以凸顯子系統之間的溝通,是透過介面(Interface)的呼
叫。其實,論子系統的範圍與規模,稱為 "模組(Module)" 更為適合,不過,我個人並不喜歡以 "模組"
二字來稱之,因為,這個術語被業界給濫用了,已淪落為在業務面的術語,卻並沒有在實體的系統間,嚴格遵循透過介面的呼叫。
所以圖2,有三個資料庫。
當銷貨人員處理銷貨需要查詢庫存資訊時,需要透過庫存系統所提供的介面來呼叫,介面的實做可能是 "Web Service"、"Java
Bean"、"Session Bean"、"COM+" 等,但絕對不能直接下 SQL
來呼叫位於庫存系統內的資料庫,否則,就違背了圖2的整體架構設計。不遵循整體架構設計的規範,私自偷偷連接,稱之為 "跳線"。
圖2、將進銷存分成三個獨立的子系統
上圖2的抽象設計與IT面的實做技術,比較困難,也需要花較多成本,以專案為主(Project-based)的開發,時程短、預算
低廉,不容易達成圖2的設計目標。但若重覆性的專案,專注在進銷存這個領域上,有豐富足夠的領域知識(Domain
Knowledge),且打算產品化(Product),那麼,圖2的系統架構來得有彈性很多,"進"、"銷"、"存"
三個子系統(元件),均可以隨意抽換,各自更新或改版,而不會影響到另一個子系統,如同 PC 主機板內的硬體元件,可以造成 "PnP(Plug
and Play)" 的效果。
請注意,上述問題的提問,會有幾個資料庫,是指抽象的邏輯設計層面,可千萬不要與實體的資料庫混為一
談。例如,圖2雖然需要三個資料庫,但若以 Oracle 資料庫系統,DBA 可以將邏輯層面的三個資料庫,切分為三個 "TABLE
SPACE",然後放在同一個實體的 Oracle 資料庫系統內;而若是 MS SQL 或是 MySQL,則是切割為三個
"database",放入同一個實體資料庫系統內。
當然,若有地理位置或資料庫系統負載的問題,要分散至多個實體的資料庫系統,那也沒問題。例如,進銷存位於三個地點不同的廠,各自配置了三個實體資料庫,各自存放自己的資訊。這也是圖2架構設計的優點,一切分合自如!
e
化的系統設計,即使是 ERP
如此重視資料存取與處理的系統,應該要能摒除傳統以資料庫為中心的設計觀點,因為,系統整體的彈性度會不佳,很難應變需求面的頻繁變更,或是 IT
實體平臺,包括資料庫系統的變更等。設計重心應該要轉移至 "Middleware",這個術語可能太貼近 IT
平臺面了,倒不如乾脆這麼說,設計的重心就是回歸至以 "應用系統"
為主,是觀察應用系統可以提供那些服務(services)或功能(functions),這些服務與功能其實就是系統一個個可以量化的子目標(Sub-
goal),次一步驟才是考量如何取得要能達成這些子目標的資訊(資料),要取得資訊,就是到實體的倉儲,也就是私有的資料庫系統去找,或是,透過標準的
程序,也就是透過標準的介面,至外部系統取得相關的資訓來處理。
在server.xml配置文件中,增加
URIEncoding=GBK":
<Connector?port="8080"
???????????????maxThreads="150"?minSpareThreads="25"?maxSpareThreads="75"
???????????????enableLookups="false"?redirectPort="8443"?acceptCount="100"
???????????????connectionTimeout="20000"?disableUploadTimeout="true"?URIEncoding="GBK"/>
????<!--?Note?:?To?disable?connection?timeouts,?set?connectionTimeout?value
?????to?0?-->
第一部分:選擇題
QUESTION NO: 1
1、
public
?
class
?Test?{
????
public
?
static
?
void
?changeStr(String?str){
????????str
=
"
welcome
"
;
????}
????
public
?
static
?
void
?main(String[]?args)?{
????????String?str
=
"
1234
"
;
????????changeStr(str);
????????System.out.println(str);
????}
}
Please write the output result :
QUESTION NO:2
1.?public?class?Test?{
2.?static?boolean?foo(char?c)?{
3.?System.out.print(c);
4.?return?true;
5.?}
6.?public?static?void?main(?String[]?argv?)?{
7.?int?i?=0;
8.?for?(?foo('A');?foo('B')&&(i<2);?foo('C')){
9.?i++?;
10.?foo('D');
12.?}
13.?}
14.?}
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime.
QUESTION NO: 3
1.?class?A?{
2.?protected?int?method1(int?a,?int?b)?{?return?0;?}
3.?}
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }
QUESTION NO: 4
1.?public?class?Outer{
2.?public?void?someOuterMethod()?{
3.?//?Line?3
4.?}
5.?public?class?Inner{}
6.?public?static?void?main(?String[]argv?)?{
7.?Outer?o?=?new?Outer();
8.?//?Line?8
9.?}
10.?}
Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8//new Outer().new Inner()
QUESTION NO: 5
Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?
A. The encodeURL method of the HttpServletRequest interface.
B. The encodeURL method of the HttpServletResponse interface.
C. The rewriteURL method of the HttpServletRequest interface.
D. The rewriteURL method of the HttpServletResponse interface.
QUESTION NO: 6
Which two are equivalent? (Choose two)
A. <%= YoshiBean.size%>
B. <%= YoshiBean.getSize()%>
C. <%= YoshiBean.getProperty("size")%>
D. <jsp:getProperty id="YoshiBean" param="size"/>
E. <jsp:getProperty name="YoshiBean" param="size"/>
F. <jsp:getProperty id="YoshiBean" property="size"/>
G. <jsp:getProperty name="YoshiBean" property="size"/>
QUESTION NO: 7
Which of the following statements regarding the lifecycle of a session bean are correct?
1.?
java.lang.IllegalStateException is thrown if
SessionContext.getEJBObject() is invoked when a stateful session bean
instance is passivated.
2.? SessionContext.getRollbackOnly() does
not throw an exception when a session bean with bean-managed
transaction demarcation is activated.
3.? An exception is not
thrown when SessionContext.getUserTransaction() is called in the
afterBegin method of a bean with container-managed transactions.
4.?
JNDI access to java:comp/env is permitted in all the
SessionSynchronization methods of a stateful session bean with
container-managed transaction demarcation.
5.? Accessing resource
managers in the SessionSynchronization.afterBegin method of a stateful
session bean with bean-managed transaction does not throw an exception.
第二部分:概念題
1.??? 描述Struts體系結構?對應各個部分的開發工作主要包括哪些?
?
2.??? XML包括哪些解釋技術,區別是什么?
?
3.??? JSP有哪些內置對象和動作?它們的作用分別是什么?
?
4、SQL問答題
SELECT * FROM TABLE
和
SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的檢索結果為何不同?
?
5、SQL問答題
表結構:
1、??? 表名:g_cardapply
字段(字段名/類型/長度):
g_applyno??????? varchar?? 8;//申請單號(關鍵字)
g_applydate???? bigint???? 8;//申請日期
g_state??????? varchar???? 2;//申請狀態
2、??? 表名:g_cardapplydetail
字段(字段名/類型/長度):
g_applyno??????? varchar???? 8;//申請單號(關鍵字)
g_name??????? varchar???? 30;//申請人姓名
g_idcard??????? varchar???? 18;//申請人身份證號
g_state??????? varchar???? 2;//申請狀態
其中,兩個表的關聯字段為申請單號。
題目:
1、??? 查詢身份證號碼為440401430103082的申請日期
2、??? 查詢同一個身份證號碼有兩條以上記錄的身份證號碼及記錄個數
3、??? 將身份證號碼為440401430103082的記錄在兩個表中的申請狀態均改為07
4、??? 刪除g_cardapplydetail表中所有姓李的記錄
世界杯賽事時間表:
1、先自定義Comparator
//????對象的比較器,如1.1.1<1.2.1<1.11.1<1.1.1.1
????public?final?class?LcsjMapComparator?implements?Comparator
????{
????????
????????public?int?compare(Object?arg0,?Object?arg1)?{
????????????GdnkVO_Lcsj_Map?vo1=(GdnkVO_Lcsj_Map)arg0;
????????????GdnkVO_Lcsj_Map?vo2=(GdnkVO_Lcsj_Map)arg1;
????????????String[]?flowCode1=vo1.getFlowCode().trim().split("\\.");
????????????String[]?flowCode2=vo2.getFlowCode().trim().split("\\.");
????????????for(int?i=0;i<2;i++)
????????????{
????????????????if(Integer.parseInt(flowCode1[i])<Integer.parseInt(flowCode2[i]))
????????????????????return?-1;
????????????????else?if(Integer.parseInt(flowCode1[i])>Integer.parseInt(flowCode2[i]))
????????????????????return?1;
????????????}
????????????return?0;
????????}
????????
????}????
compare方法中的對象類型必須是集合中的元素的數據類型。
排在后面的返回1,排在前面的返回-1,相同順序的返回0。
2、使用
Comparator?lcsjComparator=new?LcsjMapComparator();
Collections.sort(lcsjList,lcsjComparator);
即可得到排好序的集合。
有一些網友問我字符串轉日期或日期轉字符串要如何做,本來已經在留言板回答了,但覺得似乎有滿多的網友有這種困擾,因此我把它整理整理貼出來。
在這篇文章中,我用的API是SimpleDateFormat,它是屬于java.text.SimpleDateFormat,所以請記得import進來!
用法:
SimpleDateFormat?sdf?
=
?
new
?SimpleDateFormat(
"
yyyy-MM-dd?HH:mm:ss
"
);?
這一行最重要,它確立了轉換的格式,yyyy是完整的公元年,MM是月份,dd是日期,至于HH:mm:ss就不需要我再解釋了吧!
ps:為什么有的格式大寫,有的格式小寫,那是怕避免混淆,例如MM是月份,mm是分;HH是24小時制,而hh是12小時制
1.字符串轉日期:
2002-10-8 15:30:22要把它轉成日期,可以用
Date?date
=
sdf.parse(
"
2002-10-8?15:30:22
"
);
2.日期轉字符串
假如把今天的日期轉成字符串可用
String?datestr
=
sdf.format(
new
?Date());?
這個字符串的內容便類似2002-10-08 14:55:38
透過這個API我們便可以隨心所欲的將日期轉成我們想要的字符串格式,例如希望將日期輸出成2002年10月08日,
我們可以這么寫:
SimpleDateFormat?sdf?
=
?
new
?SimpleDateFormat(
"
yyyy年MM月dd日
"
);
??? String?datestr
=
sdf.format(
new
?Date());?
datestr便會依照我們設定的格式輸出
以Oracle + Tomcat 5.0為例:
1.配置server.xml
<Resource?name="jdbc/myoracle"?auth="Container"
??????????????type="javax.sql.DataSource"/>?
<ResourceParams?name="jdbc/myoracle">
??<parameter>
????<name>factory</name>
????<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
??</parameter>
??<parameter>
????<name>driverClassName</name>
????<value>oracle.jdbc.driver.OracleDriver</value>
??</parameter>
??<parameter>
????<name>url</name>
????<value>jdbc:oracle:thin:myschema@127.0.0.1:1521:mysid</value>
??</parameter>
??<parameter>
????<name>username</name>
????<value>scott</value>
??</parameter>
??<parameter>
????<name>password</name>
????<value>tiger</value>
??</parameter>
??<parameter>
????<name>maxActive</name>
????<value>20</value>
??</parameter>
??<parameter>
????<name>maxIdle</name>
????<value>10</value>
??</parameter>
??<parameter>
????<name>maxWait</name>
????<value>-1</value>
??</parameter>
</ResourceParams>
2.配置web.xml
在</web-app>節點下加下面信息:
<resource-ref>
?<description>Oracle?Datasource?example</description>
?<res-ref-name>jdbc/myoracle</res-ref-name>
?<res-type>javax.sql.DataSource</res-type>
?<res-auth>Container</res-auth>
</resource-ref>
3.測試的代碼
Context?initContext?=?new?InitialContext();
Context?envContext??=?(Context)initContext.lookup("java:/comp/env");
DataSource?ds?=?(DataSource)envContext.lookup("jdbc/myoracle");
Connection?conn?=?ds.getConnection();
//etc.
如果想要取得系統的時間,可以使用System.currentTimeMillis()方法,例如:
DateDemo.java
1?public?class?DateDemo?{
2?????public?static?void?main(String[]args)?{
3???????? System.out.println(System.currentTimeMillis());
4???? }
5}
執行結果會顯示從
1970年1月1日開始到取得系統時間為止所經過的毫秒數,例如1115346430703這個數字,但這樣的數字沒有人確切了解它的意 義是什么,您可以使用Date類別來讓這個數字變的更有意義一些,例如:
DateDemo.java
import?java.util.Date;
public?class?DateDemo?{
????public?static?void?main(String[]args)?{
????????Date?date?=?new?Date();????????????????????
??????? System.out.println(date.toString());
????????System.out.println(date.getTime());
????}
}
執行的結果如下:
? Fri May 06 10:31:13 GMT+08:00 2005
??1115346673531
當您生成Date對象時,實際上它會使用System.currentTimeMillis()來取得系統時間,而您使用
toString()方法時,會將取得的
1970年1月1日至今的毫秒數轉為
dow mon dd hh:mm:ss zzz yyyy的格式,分別是:「星期 月 日 時:分:秒 公元」;使用Date的
getTime()方法則可以取得毫秒數。
如果您想要對日期時間作格式設定,則可以使用DateFormat來作格式化,先來看看它的子類SimpleDateFormat如何使用:
DateDemo.java
???
import?java.text.DateFormat;
import?java.text.SimpleDateFormat;
import?java.util.Date;
public?class?DateDemo?{
????public?static?void?main(String[]args)?{
????????Date?date?=?new?Date();
????????DateFormat?dateFormat?=?new??SimpleDateFormat("EE-MM-dd-yyyy");
??????? System.out.println(dateFormat.format(date));
????}
}
執行結果:
??
??星期
五-05-06-2005
DateFormat會依計算機上的區域設定顯示時間格式,EE表示星期,MM表示月份、dd表示日期,而yyyy是公元,每個字符的設定都各有其意義,您
可以參考
SimpleDateFormat
的API說明了解每個字符設定的意義。
您也可以直接從DateFormat指定格式生成DateFormat的實例,例如:
DateDemo.java
???
import?java.text.DateFormat;
import?java.util.Date;
public?class?DateDemo?{
????public?static?void?main(String[]?args)?{
????????Date?date?=?new?Date();
??? ??? DateFormat?shortFormat?=??DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.SHORT);
??????? DateFormat?mediumFormat?= DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);
??? ??? DateFormat?longFormat?= DateFormat.getDateTimeInstance(DateFormat.LONG,?DateFormat.LONG);
??????? DateFormat?fullFormat?= DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);
??????? System.out.println(shortFormat.format(date));
????????System.out.println(mediumFormat.format(date));
????????System.out.println(longFormat.format(date));
????????System.out.println(fullFormat.format(date));
????}
}
在使用
getDateTimeInstance()取得DateFormat實例時,可以指定的參數是日期格式與時間格式,以上所指定的格式依訊息詳細度 區分,執行結果如下:
?? 2005/5/6 上午 10:45 2005/5/6 上午 10:45:25 2005年5月6日 上午10時45分25秒 2005年5月6日 星期五 上午10時45分25秒 GMT+08:00
?? |
您也可以使用getDateInstance()取得DateFormat實 例,并同時指定日期的區域顯示方式,例如:
DateDemo.java
import?java.text.DateFormat;
import?java.util.Date;
import?java.util.Locale;
public?class?DateDemo?{
????public?static?void?main(String[]?args)?{
????????Date?date?=?new?Date();
????????Locale?locale?=?new?Locale("en",?"US");
????????DateFormat?shortFormat?=? DateFormat.getDateInstance(DateFormat.SHORT,locale);
????????DateFormat?mediumFormat?=?DateFormat.getDateInstance(????????????????DateFormat.MEDIUM,locale);
????????DateFormat?longFormat?= DateFormat.getDateInstance(DateFormat.LONG,?locale);
????????DateFormat?fullFormat?= DateFormat.getDateInstance(DateFormat.FULL,?locale);
??? ??? System.out.println(shortFormat.format(date));
??? ??? System.out.println(mediumFormat.format(date));
??? ??? System.out.println(longFormat.format(date));
??? ??? System.out.println(fullFormat.format(date));
????}
}
這邊指定了美國的時間顯示方式,執行結果如下:
?
5/6/05
??May 6, 2005
??May 6, 2005
??Friday, May 6, 2005
瀏
覽器為了加速使用者的瀏覽速度,常會將瀏覽過的網頁快取到硬盤,下次瀏覽同一頁時,便去硬盤里面去找,但現在的網頁常是動態的,為了避免使用者抓到硬盤內
過期的數據,JSP可用下面的方式來防止瀏覽器快取住網頁,此方法便可保證使用者到這個網頁時始終都可看到最新的資料。
1.JSP語法
<%
??? ??? response.setHeader(
"
Pragma
"
,
"
no-cache
"
);
??? ??? response.setHeader(
"
Cache-Control
"
,
"
no-cache
"
);
??? ??? response.setDateHeader(
"
Expires
"
,
0
);
??? %>
2.也可以用以下的HTML語法,可用在靜態網頁上
<
meta?http
-
equiv?
=
?
"
Pragma
"
?content
=
"
no-cache
"
>
??? <
meta?http
-
equiv
=
"
Cache-Control
"
?content
=
"
no-cache
"
>
??? <
meta?http
-
equiv?
=
?
"
Expires
"
?content
=
"
0
"
>
注意,這些HTML語法要下在<head></head>的標簽內。