防止重復(fù)又保持有序,可以用TreeSet。
例3-關(guān)于TreeSet 的例子,通過(guò)實(shí)現(xiàn)Comparator來(lái)達(dá)到排序。
例4-關(guān)于TreeSet的第2個(gè)例子,通過(guò)實(shí)現(xiàn)Comparable來(lái)達(dá)到排序
TreeSet的排序功能也是通過(guò)實(shí)現(xiàn)Comparator或Comparable來(lái)完成的。要么是TreeSet集合中的元素實(shí)現(xiàn)了Comparable,要么是用重載的Comparator作為參數(shù)來(lái)創(chuàng)建TreeSet。
① out - javax.servlet.jsp.jspWriter 方法: 2. void clearBuffer() ; 3. void close() ; 4. void flush() ; 5. int getBufferSize() ; 6. int getRemaining() ; 7. boolean isAutoFlush() ; 8. void newLine() ; 9. void print( boolean b ) ; 10. void println( boolean b ) ; 成員:
方法: 2. Enumeration getAttributeNames() ; 3. String getAuthType() ; 4. String getCharacterEncoding() ; 5. int getContentLength() ; 6. String getContentType() ; 7. String getContentPath() ; 8. Cookie[] getCookies() ; 9. Enumeration getHeaderNames() ; 10. Enumeration getHeaders( String name ) ; 11. String getHeader( String name ) ; 12. long getDateHeader( String name ) ; 13. int getIntHeader( String name ) ; 14. ServletInputStream getInputStream() ; 15. Locale getLocale() ; 16. Enumeration getLocales() ; 17. String getLocalName() ; 18. String getLocalAddr() ; 19. int getLocalPort() ; 20. String getMethod() ; 21. String getParameter( String name ) ; 22. Map getParameterMap() ; 23. Enumeration getParameterNames() ; 24. String[] getParameterValues( String name ) ; 25. String getQueryString() ; 26. String getPathInfo() ; 27. String getPathTranslated() ; 28. String getProtocol() ; 29. BufferedReader getReader() ; 30. String getRemoteAddr() ; 31. String getRemoteHost() ; 32. String getRemoteUser() ; 33. int getRemotePort() ; 34. String getRealPath( String path ) ; 35. RequestDispatcher getRequestDispatcher( String path ) ; 36. String getRequestedSessionId() ; 37. String RequestURI() ; 38. StringBuffer getRequestURI() ; 39. String getScheme() ; 40. String getServerName() ; 41. String getServletPath() ; 42. int getServerPort() ; 43. void removeAttribute( String name ) ; 44. void setAttribute( String name, Object value ) ; 45. void setCharacterEncoding( String name ) ; 46. HttpSession getSession() ; 48. boolean isRequestedSessionIdFromURL() ; 49. boolean isRequestedSessionIdValid() ; 50. boolean isSecure() ; 51. boolean isUserInRole( String role ) ; 52. Principal getUserPrincipal() ; 成員:
方法: 2. void addDateHeader( String name, long value ) ; 3. void addHeader( String name, String value ) ; 4. void addIntHeader( String name, int value ) ; 5. boolean containsHeader( String name ) ; 6. String encodeRedirectURL( String url ) ; 7. String encodeURL( String url ) ; 9. int getBufferSize() ; 10. String getCharacterEncoding() ; 11. String getContentType() ; 12. Locale getLocale() ; 13. ServletOutputStream getOutputStream() ; 14. PrintWriter getWriter() ; 15. boolean isCommitted() ; 16. void reset() ; 17. void resetBuffer() ; 18. void sendError( int xc, String msg ) ; 19. void sendRedirect( String locationg ) ; 20. void setBufferSize( int size ) ; 21. void setCharacterEncoding( String charset ) ; 22. void setContentLength( int length ) ; 23. void setContentType( String type ) ; 24. void setDateHeader( String name, long value ) ; 25. void setHeader( String name, String value ) ; 26. void setIntHeader( String name, int value ) ; 27. void setStatus( int xc ) ; 成員(HTTP狀態(tài)碼):
方法: 2. Enumeration getAttributeNames() ; 3. long getCreationTime() ; 4. String getId() ; 5. long getLastAccessedTime() ; 6. int getMaxInactiveInterval( int interval ) ; 7. ServletContext getServletContext() ; 8. HttpSessionContext getSessionContext() ; 9. Object getValue( String name ) ; 10. String[] getValueNames() ; 11. void invalidate() ; 12. boolean isNew() ; 13. void pubValue( String name, Object value ) ; 14. void removeValue( String name ) ; 15. void setAttribute( String name, String value ) ; 16. void setMaxInactiveInterval( int interval ) ; 17. void removeAttribute( String name ) ;
方法: 2. Object getAttribute( String name, int scope ) ; 3. Object findAttribute( String name ) ; 4. void removeAttribute( String name, int scope ) ; 5. void forward( String url ) ; 6. Enumeration getAttributeNamesScope( int scope ) ; 7. int getAttributeScope( String name ) ; 8. ErrorData getErrorDate() ; 9. Exception getException() ; 10. ExpressionEvaluator getExpressionEvaluator() ; 11. JspWriter getOut() ; 12. Object getPage() ; 13. ServletRequest getRequest() ; 14. ServletResponse getResponse() ; 15. ServletConfig getConfig() ; 16. ServletContext getServletContext() ; 17. HttpSession getSession() ; 18. VariableResolver getVariableResolver() ; 19. void include( String url, boolean flush ) ; 20. void release() ; 21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response, 22. BodyContext pushBody() ; 23. JspWrite popBody() ; 24. void handlePageException( Exception e ) ; 成員:
方法: 2. Enumeration getAttributes() ; 3. ServletContext getContext( String uripath ) ; 4. String getInitParameter( String name ) ; 5. Enumeration getInitParameters() ; 6. int getMajorVersion() ; 7. String getMimeType( String file ) ; 8. int getMinorVersion() ; 9. String getRealPath( String path ) ; 10. RequestDispatcher getNamedDispatcher( String name ) ; 11. RequestDispatcher getRequestDispatcher( String path ) ; 12. URL getResource( String path ) ; 13. InputStream getResourceAsStream( String path ) ; 14. Set getResourcePaths( String path ) ; 15. String getServerInfo() ; 16. Servlet getServlet( String name ) ; 17. Enumeration getServlets() ; 18. String getServletContextName() ; 19. Enumeration getServletContextNames() ; 20. void log( Exception ex, String msg ) ; 21. void removeAttribute( String name ) ; 22. void setAttribute( String name, Object value ) ;
方法: 2. Enumeration getInitParameters() ; 3. ServletContext getContext() ; 4. String getServletName() ;
方法: 2. String getLocalizedMessage() ; 3. String getMessage() 4. StackTrackElement[] getStackTrace() ; 5. Throwable initCause( Throwable cause ) ; 7. void printStackTrace() ; 8. void setStackTrace( StackTraceElement[] stackTrace )
|
六 Http的一個(gè)會(huì)話對(duì)象Session
四 處理表單數(shù)據(jù)
Java Servlet的好處之一,只需要簡(jiǎn)單地調(diào)用一下HttpServletRequest的getParameter方法、在調(diào)用參數(shù)中提供表單變量的名字(大小寫敏感)即可,而且GET請(qǐng)求和POST請(qǐng)求的處理方法完全相同。
getParameter方法的返回值是一個(gè)字符串,它是參數(shù)中指定的變量名字第一次出現(xiàn)所對(duì)應(yīng)的值經(jīng)反編碼得到得字符串(可以直接使用)。如果指定的表單變量存在,但沒(méi)有值,getParameter返回空字符串;如果指定的表單變量不存在,則返回null。如果表單變量可能對(duì)應(yīng)多個(gè)值,可以用getParameterValues來(lái)取代getParameter。getParameterValues能夠返回一個(gè)字符串?dāng)?shù)組。
最后,雖然在實(shí)際應(yīng)用中Servlet很可能只會(huì)用到那些已知名字的表單變量,但在調(diào)試環(huán)境中,獲得完整的表單變量名字列表往往是很有用的,利用getParamerterNames方法可以方便地實(shí)現(xiàn)這一點(diǎn)。getParamerterNames返回的是一個(gè)Enumeration,其中的每一項(xiàng)都可以轉(zhuǎn)換為調(diào)用getParameter的字符串。
@BeforeClass/@AfterClass 與 @Before/@After 的區(qū)別
@BeforeClass/@AfterClass
只運(yùn)行一次;
方法名不限制;
public static;
@Before/@After
在每個(gè)測(cè)試方法前(后)都會(huì)運(yùn)行一次;
方法名不限制;
public 非static。
CGI
CGI 意思為 Common Gateway Interface(公共網(wǎng)關(guān)接口), 一種基于瀏覽器的輸入、在Web服務(wù)器上運(yùn)行的程序方法. CGI腳本 使你的瀏覽器與用戶能交互,為了在數(shù)據(jù)庫(kù)中尋找一個(gè)名詞, 提供你寫入的評(píng)論,或者從一個(gè)表單中選擇幾個(gè)條目并且能得到一個(gè)明確的回答. 如果你曾經(jīng)遇到過(guò)在web上填表或進(jìn)行搜索, 你就是用的CGI腳本. 你那時(shí)也許沒(méi)有意識(shí)到,因?yàn)榇蟛糠止ぷ魇窃诜?wù)器上運(yùn)行的,你看到的只是結(jié)果.
CGI腳本簡(jiǎn)單地講是個(gè)運(yùn)行在Web服務(wù)器上的程序, 有瀏覽器的輸入觸發(fā). 這個(gè)腳本通常象服務(wù)器和系統(tǒng)中其他程序如數(shù)據(jù)庫(kù)的橋梁。
(1) 創(chuàng)建并返回一個(gè)包含基于客戶請(qǐng)求性質(zhì)的動(dòng)態(tài)內(nèi)容的完整的 HTML頁(yè)面。
(2) 創(chuàng)建可嵌入到現(xiàn)有 HTML 頁(yè)面中的一部分 HTML 頁(yè)面(HTML 片段)。
(3) 與其它服務(wù)器資源(包括數(shù)據(jù)庫(kù)和基于 Java 的應(yīng)用程序)進(jìn)行通信。
(4) 用多個(gè)客戶機(jī)處理連接,接收多個(gè)客戶機(jī)的輸入,并將結(jié)果廣播到多個(gè)客戶機(jī)上。例如,Servlet 可
以是多參與者的游戲服務(wù)器。
(5) 當(dāng)允許在單連接方式下傳送數(shù)據(jù)的情況下,在瀏覽器上打開(kāi)服務(wù)器至applet的新連接,并將該連
接保持在打開(kāi)狀態(tài)。當(dāng)允許客戶機(jī)和服務(wù)器簡(jiǎn)單、高效地執(zhí)行會(huì)話的情況下,applet也可以啟動(dòng)客戶瀏覽器和服務(wù)器之間的連接。可以通過(guò)定制協(xié)議或標(biāo)準(zhǔn)(如 IIOP)進(jìn)行通信。
(6) 對(duì)特殊的處理采用 MIME 類型過(guò)濾數(shù)據(jù),例如圖像轉(zhuǎn)換和服務(wù)器端包括(SSI)。
(7) 將定制的處理提供給所有服務(wù)器的標(biāo)準(zhǔn)例行程序。例如,Servlet 可以修改如何認(rèn)證用戶。
Servlet 的生命周期
Servlet 的生命周期始于將它裝入 Web 服務(wù)器的內(nèi)存時(shí),并在終止或重新裝入 Servlet 時(shí)結(jié)束。
(1) 初始化
在下列時(shí)刻裝入 Servlet:
=如果已配置自動(dòng)裝入選項(xiàng),則在啟動(dòng)服務(wù)器時(shí)自動(dòng)裝入
=在服務(wù)器啟動(dòng)后,客戶機(jī)首次向 Servlet 發(fā)出請(qǐng)求時(shí)
=重新裝入 Servlet 時(shí)
裝入 Servlet 后,服務(wù)器創(chuàng)建一個(gè) Servlet 實(shí)例并且調(diào)用 Servlet 的 init() 方法。在初始化階段,Servlet 初始化參數(shù)被傳遞給 Servlet 配置對(duì)象。
(2) 請(qǐng)求處理
對(duì)于到達(dá)服務(wù)器的客戶機(jī)請(qǐng)求,服務(wù)器創(chuàng)建特定于請(qǐng)求的一個(gè)"請(qǐng)求"對(duì)象和一個(gè)"響應(yīng)"對(duì)象。服務(wù)器調(diào)用 Servlet 的 service() 方法,該方法用于傳遞"請(qǐng)求"和"響應(yīng)"對(duì)象。service() 方法從"請(qǐng)求"對(duì)象獲得請(qǐng)求信息、處理該請(qǐng)求并用"響應(yīng)"對(duì)象的方法以將響應(yīng)傳回客戶機(jī)。service() 方法可以調(diào)用其它方法來(lái)處理請(qǐng)求,例如 doGet()、doPost() 或其它的方法。
(3) 終止
當(dāng)服務(wù)器不再需要 Servlet, 或重新裝入 Servlet 的新實(shí)例時(shí),服務(wù)器會(huì)調(diào)用 Servlet 的 destroy() 方法。
ORM
對(duì)象關(guān)系映射(Object Relational Mapping,簡(jiǎn)稱ORM)是一種為了解決面向?qū)ο?/a>與關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的技術(shù)。 簡(jiǎn)單的說(shuō),ORM是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。 這也同時(shí)暗示者額外的執(zhí)行開(kāi)銷;然而,如果ORM作為一種中間件實(shí)現(xiàn),則會(huì)有很多機(jī)會(huì)做優(yōu)化,而這些在手寫的持久層并不存在。 更重要的是用于控制轉(zhuǎn)換的元數(shù)據(jù)需要提供和管理;但是同樣,這些花費(fèi)要比維護(hù)手寫的方案要少;而且就算是遵守ODMG規(guī)范的對(duì)象數(shù)據(jù)庫(kù)依然需要類級(jí)別的元數(shù)據(jù)。
對(duì)象-關(guān)系映射(Object/Relation Mapping,簡(jiǎn)稱ORM),是隨著面向?qū)ο蟮?/span>軟件開(kāi)發(fā)方法發(fā)展而產(chǎn)生的。面向?qū)ο蟮拈_(kāi)發(fā)方法是當(dāng)今企業(yè)級(jí)應(yīng)用開(kāi)發(fā)環(huán)境中的主流開(kāi)發(fā)方法,關(guān)系數(shù)據(jù)庫(kù)是企業(yè)級(jí)應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲(chǔ)系統(tǒng)。對(duì)象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實(shí)體的兩種表現(xiàn)形式,業(yè)務(wù)實(shí)體在內(nèi)存中表現(xiàn)為對(duì)象,在數(shù)據(jù)庫(kù)中表現(xiàn)為關(guān)系數(shù)據(jù)。內(nèi)存中的對(duì)象之間存在關(guān)聯(lián)和繼承關(guān)系,而在數(shù)據(jù)庫(kù)中,關(guān)系數(shù)據(jù)無(wú)法直接表達(dá)多對(duì)多關(guān)聯(lián)和繼承關(guān)系。因此,對(duì)象-關(guān)系映射(ORM)系統(tǒng)一般以中間件的形式存在,主要實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)的映射。
面向?qū)ο笫菑?/span>軟件工程基本原則(如耦合、聚合、封裝)的基礎(chǔ)上發(fā)展起來(lái)的,而關(guān)系數(shù)據(jù)庫(kù)則是從數(shù)學(xué)理論發(fā)展而來(lái)的,兩套理論存在顯著的區(qū)別。為了解決這個(gè)不匹配的現(xiàn)象,對(duì)象關(guān)系映射技術(shù)應(yīng)運(yùn)而生。
讓我們從O/R開(kāi)始。字母O起源于"對(duì)象"(Object),而R則來(lái)自于"關(guān)系"(Relational)。幾乎所有的程序里面,都存在對(duì)象和關(guān)系數(shù)據(jù)庫(kù)。在業(yè)務(wù)邏輯層和用戶界面層中,我們是面向?qū)ο蟮摹.?dāng)對(duì)象信息發(fā)生變化的時(shí)候,我們需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫(kù)中。
目前流行的 ORM 產(chǎn)品
目前眾多廠商和開(kāi)源社區(qū)都提供了持久層框架的實(shí)現(xiàn),常見(jiàn)的有:
Apache OJB (http://db.apache.org/ojb/)
Cayenne (http://objectstyle.org/cayenne/)
Jaxor (http://jaxor.sourceforge.net)
Hibernate (http://www.hibernate.org) 被JBoss收購(gòu)
iBatis (http://www.ibatis.com) Apache的
jRelationalFramework (http://ijf.sourceforge.net)
mirage (http://itor.cq2.org/en/oss/mirage/toon)
SMYLE (http://www.drjava.de/smyle)
TopLink (http://otn.oracle.com/products/ias/toplink/index.html)
其中 TopLink 是 Oracle 的商業(yè)產(chǎn)品,其他均為開(kāi)源項(xiàng)目。
exception 就是:“在程序執(zhí)行中所發(fā)生的中斷了正常指令流的事件(An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions.)”
error就是:“效果或情況背離了可接受的一般法則(The act or an instance of deviating from an accepted code of behavior.)”
Error表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,
Exception表示需要捕捉或者需要程序進(jìn)行處理的異常。
簡(jiǎn)要的敘述error和exception
Error和Exception都繼承自Throwable,他們下列不同處:
Exceptions
1.可以是 可被控制(checked) 或 不可控制的(unchecked)
2.表示一個(gè)由程序員導(dǎo)致的錯(cuò)誤
3.應(yīng)該在應(yīng)用程序級(jí)被處理
Errors
1.總是 不可控制的(unchecked)
2.經(jīng)常用來(lái)用于表示系統(tǒng)錯(cuò)誤或低層資源的錯(cuò)誤
3.如何可能的話,應(yīng)該在系統(tǒng)級(jí)被捕捉