一区二区中文字,99国产精品国产精品久久,国产亚洲精品久久久优势http://www.aygfsteel.com/xue/category/54374.htmlzh-cnFri, 16 Dec 2016 09:58:57 GMTFri, 16 Dec 2016 09:58:57 GMT60JS-SDK的使用(微信多次分享)http://www.aygfsteel.com/xue/archive/2016/12/16/432130.html小人物_Amor小人物_AmorFri, 16 Dec 2016 09:05:00 GMThttp://www.aygfsteel.com/xue/archive/2016/12/16/432130.htmlhttp://www.aygfsteel.com/xue/comments/432130.htmlhttp://www.aygfsteel.com/xue/archive/2016/12/16/432130.html#Feedback0http://www.aygfsteel.com/xue/comments/commentRss/432130.htmlhttp://www.aygfsteel.com/xue/services/trackbacks/432130.html閱讀全文

]]>
java web面試題集錦http://www.aygfsteel.com/xue/archive/2014/10/08/418517.html小人物_Amor小人物_AmorWed, 08 Oct 2014 08:50:00 GMThttp://www.aygfsteel.com/xue/archive/2014/10/08/418517.htmlhttp://www.aygfsteel.com/xue/comments/418517.htmlhttp://www.aygfsteel.com/xue/archive/2014/10/08/418517.html#Feedback0http://www.aygfsteel.com/xue/comments/commentRss/418517.htmlhttp://www.aygfsteel.com/xue/services/trackbacks/418517.html
1.JDK和JRE的區(qū)別:
    JDK是Java Development Kit。是面向開(kāi)發(fā)人員使用的SDK,提供了java的開(kāi)發(fā)環(huán)境以及運(yùn)行環(huán)境。
     JRE是Java Runtime Enviroment。是指java的運(yùn)行環(huán)境,是面向java程序得使用者,而不是開(kāi)發(fā)者。

2.序列化的目的:
    Java中,一切都是對(duì)象,在分布式環(huán)境中經(jīng)常需要將Object從這一端網(wǎng)絡(luò)或設(shè)備傳遞到另一端。這就需要有一種可以在兩端傳輸數(shù)據(jù)的協(xié)議。Java序列化機(jī)制就是為了解決這個(gè)問(wèn)題而產(chǎn)生。
    以某種存儲(chǔ)形式使自定義對(duì)象持久化。
    將對(duì)象從一個(gè)地方傳到另一個(gè)地方。

3.equals和==的區(qū)別:
    基本數(shù)據(jù)類型應(yīng)該用“==”來(lái)比較他們的值。
    當(dāng)比較對(duì)象時(shí)候,如果對(duì)象里重寫了equals方法,比如String,Integer,Date這些類,比較對(duì)象的內(nèi)存地址應(yīng)該用“==”,比較對(duì)象的值用“equals”,如果沒(méi)有重寫equals方法,兩者本質(zhì)上是相同的,都是比較值。

4.什么時(shí)候使用Comparator and Comparable 接口
    當(dāng)需要排序的集合或數(shù)組不是單純的數(shù)字類型的時(shí)候,通常可以使用Comparator或Comparable,以簡(jiǎn)單的方式實(shí)現(xiàn)對(duì)象排序和自定義排序。
    Comparable用在對(duì)象本身,說(shuō)明這個(gè)對(duì)象是可以被比較的,也就是說(shuō)可以被排序的。(String和Integer之所以可以比較大小,是因?yàn)樗鼈兌紝?shí)現(xiàn)了Comparable接口,并實(shí)現(xiàn)了compareTo()方法)。
    Compator用在對(duì)象外,相當(dāng)于定義了一個(gè)排序算法。

5.轉(zhuǎn)發(fā)和重定向的區(qū)別:
    轉(zhuǎn)發(fā)時(shí)URL不會(huì)改變,request請(qǐng)求內(nèi)的對(duì)象將可以繼續(xù)使用,重定向時(shí)瀏覽器URL會(huì)改變,之前的request會(huì)丟失,因此request里的數(shù)據(jù)也不會(huì)得到。
    通常情況下轉(zhuǎn)發(fā)速度更快,而且能保持request內(nèi)的對(duì)象,但是轉(zhuǎn)發(fā)之后,瀏覽器的連接還在先前頁(yè)面所以可以重載先前頁(yè)面。
    轉(zhuǎn)發(fā):request.getRequestDispatcher("apage.jsp").forward(request, response);
   重定向:response.sendRedirect("apage.jsp");
   
6.編譯期異常和運(yùn)行時(shí)異常
    編譯時(shí)異常可以捕捉,比如我們讀寫文件時(shí)候會(huì)拋出IOException,操作數(shù)據(jù)庫(kù)時(shí)會(huì)有SQLException,運(yùn)行時(shí)異常不可以捕捉,比如數(shù)組下標(biāo)溢出,空指針異常等

7.Struts1原理和Struts2原理以及區(qū)別和聯(lián)系,在什么項(xiàng)目中用過(guò),有什么體會(huì)?
    struts1原理:客戶端發(fā)送HttpServletRequest請(qǐng)求給ActionServlet,ActionServlet會(huì)檢索和用戶請(qǐng)求匹配的ActionMapping實(shí)例,如果不存在就返回請(qǐng)求路徑無(wú)效的信息,如果存在就會(huì)把請(qǐng)求的表單數(shù)據(jù)保存到ActionForm中去,如果ActionForm不存在就會(huì)創(chuàng)建一個(gè)ActionForm對(duì)象,然后再根據(jù)配置信息決定是否需要表單驗(yàn)證,如果需要驗(yàn)證就調(diào)用ActionForm的validate()方法,驗(yàn)證通過(guò)后ActionServlet根據(jù)ActionMapping實(shí)例包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在就先創(chuàng)建這個(gè)Action然后調(diào)用Action的execute()方法。Action的execute()方法返回一個(gè)ActionForward對(duì)象,ActionServlet再把客戶請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指向的jsp組件。
   struts2原理:客戶端發(fā)送HttpServletRequest請(qǐng)求,請(qǐng)求被提交到一系列的Filter,首先是ActionContextCleanUp,然后是其他Filter,最后是FilterDispatcher。FilterDispatcher是Struts2的核心,就是MVC的Struts2實(shí)現(xiàn)中控制層的核心。FilterDispatcher詢問(wèn)ActionMapper決定需要調(diào)用哪個(gè)Action,F(xiàn)ilterDispatcher會(huì)把請(qǐng)求交給ActionProxy,ActionProxy會(huì)根據(jù)Struts.xml配置文件找到需要調(diào)用的Action類。ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例,同時(shí)ActionInvocation通過(guò)代理模式調(diào)用Action類,調(diào)用之前會(huì)加載Action相關(guān)的所有攔截器,一旦Action執(zhí)行完畢,ActionInvocation根據(jù)Struts.xml配置文件返回對(duì)應(yīng)的result。
    區(qū)別:1.Struts1是通過(guò)Servlet啟動(dòng)的,struts1要求Action繼承一個(gè)抽象類,而不是接口,Struts2的Action類可以實(shí)現(xiàn)一個(gè)Action接口也可以實(shí)現(xiàn)其他接口。
               2.struts1的Action是單例模式線程是不安全的,struts2是線程安全的,Action為每一個(gè)請(qǐng)求都生成了一個(gè)實(shí)例。
               3.struts1是以ActionServlet為核心控制器,struts2是以FilterDispatcher為核心控制器。
    執(zhí)行流程:

a)struts1 
jsp發(fā)起httprequest請(qǐng)求->servlet捕獲->struts.xml->namespace+ActionName-> Action->填充表單setXxx()->action.execute()->”success”->Result->設(shè)置request屬性->跳轉(zhuǎn)目標(biāo)頁(yè)
b) Action(jsp發(fā)起httprequest請(qǐng)求,被過(guò)濾器捕獲)->FilterDispatcher->struts.xml->namespace+ActionName->new Action->填充表單setXxx()->action.execute()->”success”->Result->設(shè)置request屬性->跳轉(zhuǎn)目標(biāo)頁(yè)



8.spring原理
    spring的最大作用ioc/di,將類與類的依賴關(guān)系寫在配置文件中,程序在運(yùn)行時(shí)根據(jù)配置文件動(dòng)態(tài)加載依賴的類,降低的類與類之間的藕合度。它的原理是在applicationContext.xml加入bean標(biāo)記,在bean標(biāo)記中通過(guò)class屬性說(shuō)明具體類名、通過(guò)property標(biāo)簽說(shuō)明該類的屬性名、通過(guò)constructor-args說(shuō)明構(gòu)造子的參數(shù)。其一切都是反射,當(dāng)通過(guò)applicationContext.getBean(“id名稱”)得到一個(gè)類實(shí)例時(shí),就是以bean標(biāo)簽的類名、屬性名、構(gòu)造子的參數(shù)為準(zhǔn),通過(guò)反射實(shí)例對(duì)象,喚起對(duì)象的set方法設(shè)置屬性值、通過(guò)構(gòu)造子的newInstance實(shí)例化得到對(duì)象。正因?yàn)閟pring一切都是反射,反射比直接調(diào)用的處理速度慢,所以這也是spring的一個(gè)問(wèn)題。
    spring第二大作用就是aop,其機(jī)理來(lái)自于代理模式,代理模式有三個(gè)角色分別是通用接口、代理、真實(shí)對(duì)象。代理、真實(shí)對(duì)象實(shí)現(xiàn)的是同一接口,將真實(shí)對(duì)象作為代理的一個(gè)屬性,向客戶端公開(kāi)的是代理,當(dāng)客戶端調(diào)用代理的方法時(shí),代理找到真實(shí)對(duì)象,調(diào)用真實(shí)對(duì)象方法,在調(diào)用之前之后提供相關(guān)的服務(wù),如事務(wù)、安全、日志。其名詞分別是代理、真實(shí)對(duì)象、裝備、關(guān)切點(diǎn)、連接點(diǎn)。

9.簡(jiǎn)要概述一下SpringMVC和StrutsMVC
    Spring的MVC框架主要由DispatcherServlet、處理器映射、處理器、視圖解析器、視圖組成。
        1)DispatcherServlet接收到請(qǐng)求后,根據(jù)對(duì)應(yīng)配置文件中配置的處理器映射,找到對(duì)應(yīng)的處理器映射項(xiàng)(HandlerMapping),根據(jù)配置的映射規(guī)則,找到對(duì)應(yīng)的處理器(Handler)。
        2)調(diào)用相應(yīng)處理器中的處理方法,處理該請(qǐng)求,處理器處理結(jié)束后會(huì)將一個(gè)ModelAndView類型的數(shù)據(jù)傳給DispatcherServlet,這其中包含了處理結(jié)果的視圖和視圖中要使用的數(shù)據(jù)。
        3)DispatcherServlet 根據(jù)得到的ModelAndView中的視圖對(duì)象,找到一個(gè)合適的ViewResolver(視圖解析器),根據(jù)視圖解析器的配 置,DispatcherServlet將視圖要顯示的數(shù)據(jù)傳給對(duì)應(yīng)的視圖,最后給瀏覽器構(gòu)造一個(gè)HTTP響應(yīng)。

        DispatcherServlet是整個(gè)Spring MVC的核心。它負(fù)責(zé)接收HTTP請(qǐng)求組織協(xié)調(diào)Spring MVC的各個(gè)組成部分。其主要工作有以下三項(xiàng):
            1)截獲符合特定格式的URL請(qǐng)求。
            2)初始化DispatcherServlet上下文對(duì)應(yīng)的WebApplicationContext,并將其與業(yè)務(wù)層、持久化層的WebApplicationContext建立關(guān)聯(lián)。
            3)初始化Spring MVC的各個(gè)組成組件,并裝配到DispatcherServlet中。

    StrutsMVC
          1.當(dāng)啟動(dòng)容器時(shí),容器(tomcat、weblogic)實(shí)例化ActionServlet,初始化ActionServlet,在初始化
ActionServlet時(shí)加載struts-config.xml文件。
         2.當(dāng)客戶通過(guò)url.do將請(qǐng)求發(fā)給ActionServlet,ActionServlet將處理轉(zhuǎn)發(fā)給助手RequestProcessor,RequestProcess通過(guò)struts-config.xml找到對(duì)應(yīng)的actionForm及 action,如果有ActionForm用已有的,沒(méi)有通過(guò)類的反射實(shí)例化一個(gè)新的ActionForm,放置到作用域?qū)ο?,通過(guò)反射
  1. 將表單域的值填充到actionForm中。如果有Action用已有的,沒(méi)有產(chǎn)生一個(gè)新的,通過(guò)反射調(diào)用action實(shí)例的execute方法,在執(zhí)行前將actionForm通過(guò)參數(shù)注入到execute方法中。
  2.          3.execute方法執(zhí)行結(jié)束前通過(guò)actionMapping找到actionForward轉(zhuǎn)發(fā)到另一個(gè)頁(yè)面。

10.Servlet的工作原理、生命周期
    Servlet的工作原理:
        Servlet 生命周期:Servlet 加載--->實(shí)例化--->服務(wù)--->銷毀。
        init():在Servlet的生命周期中,僅執(zhí)行一次init()方法。它是在服務(wù)器裝入Servlet時(shí)執(zhí)行的,負(fù)責(zé)初始化Servlet 對(duì)象??梢耘渲梅?wù)器,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問(wèn)Servlet時(shí)裝入Servlet。無(wú)論有多少客戶機(jī)訪問(wèn)Servlet,都不會(huì)重復(fù)執(zhí)行 init()。
        service():它是Servlet的核心,負(fù)責(zé)響應(yīng)客戶的請(qǐng)求。每當(dāng)一個(gè)客戶請(qǐng)求一個(gè)HttpServlet對(duì)象,該對(duì)象的 Service()方法就要調(diào)用,而且傳遞給這個(gè)方法一個(gè)“請(qǐng)求”(ServletRequest)對(duì)象和一個(gè)“響應(yīng)” (ServletResponse)對(duì)象作為參數(shù)。在HttpServlet中已存在Service()方法。默認(rèn)的服務(wù)功能是調(diào)用與HTTP請(qǐng)求的方法 相應(yīng)的do功能。
        destroy(): 僅執(zhí)行一次,在服務(wù)器端停止且卸載Servlet時(shí)執(zhí)行該方法。當(dāng)Servlet對(duì)象退出生命周期時(shí),負(fù)責(zé)釋放占用的資 源。一個(gè)Servlet在運(yùn)行service()方法時(shí)可能會(huì)產(chǎn)生其他的線程,因此需要確認(rèn)在調(diào)用destroy()方法時(shí),這些線程已經(jīng)終止或完成。

    Servlet工作原理:
        1、首先簡(jiǎn)單解釋一下Servlet接收和響應(yīng)客戶請(qǐng)求的過(guò)程,首先客戶發(fā)送一個(gè)請(qǐng)求,Servlet是調(diào)用service()方法對(duì)請(qǐng)求進(jìn)行響應(yīng) 的,通過(guò)源代碼可見(jiàn),service()方法中對(duì)請(qǐng)求的方式進(jìn)行了匹配,選擇調(diào)用doGet,doPost等這些方法,然后再進(jìn)入對(duì)應(yīng)的方法中調(diào)用邏輯層 的方法,實(shí)現(xiàn)對(duì)客戶的響應(yīng)。在Servlet接口和GenericServlet中是沒(méi)有doGet()、doPost()等等這些方法 的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個(gè)Servlet的時(shí)候,都必須實(shí)現(xiàn)doGet或 doPost等這些方法。
        2、每一個(gè)自定義的Servlet都必須實(shí)現(xiàn)Servlet的接口,Servlet接口中定義了五個(gè)方法,其中比較重要的三個(gè)方法涉及到 Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個(gè)通用的,不 特定于任何協(xié)議的Servlet,它實(shí)現(xiàn)了Servlet接口。而HttpServlet繼承于GenericServlet,因此 HttpServlet也實(shí)現(xiàn)了Servlet接口。所以我們定義Servlet的時(shí)候只需要繼承HttpServlet即可。
        3、Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以 HttpServlet中實(shí)現(xiàn)了service()方法,并將請(qǐng)求ServletRequest、ServletResponse 強(qiáng)轉(zhuǎn)為HttpRequest 和 HttpResponse。

11.OOA、OOD、OOP含義
    Object-Oriented Analysis:面向?qū)ο蠓治龇椒?/span>
    Object-Oriented Design:面向?qū)ο笤O(shè)計(jì)
    Object Oriented Programming:面向?qū)ο缶幊?/span>
    OOA是對(duì)系統(tǒng)業(yè)務(wù)調(diào)查了解之后根據(jù)面向?qū)ο蟮乃枷脒M(jìn)行系統(tǒng)分析,在OOA分析的基礎(chǔ)上對(duì)系統(tǒng)根據(jù)面向?qū)ο蟮乃枷脒M(jìn)行系統(tǒng)設(shè)計(jì),從而能夠直接進(jìn)行OOP面向?qū)ο缶幊獭?/span>
12.mysql分頁(yè)查詢
   對(duì)于有大數(shù)據(jù)量的mysql表來(lái)說(shuō),使用LIMIT分頁(yè)存在很嚴(yán)重的性能問(wèn)題。
   查詢從第1000000之后的30條記錄:

        SQL代碼1:平均用時(shí)6.6秒 SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30

        SQL代碼2:平均用時(shí)0.6秒 SELECT * FROM `cdb_posts` WHERE pid >= (SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1) LIMIT 30

    因?yàn)橐〕鏊凶侄蝺?nèi)容,第一種需要跨越大量數(shù)據(jù)塊并取出,而第二種基本通過(guò)直接根據(jù)索引字段定位后,才取出相應(yīng)內(nèi)容,效率自然大大提升。

    可以看出,越往后分頁(yè),LIMIT語(yǔ)句的偏移量就會(huì)越大,兩者速度差距也會(huì)越明顯。

    實(shí)際應(yīng)用中,可以利用類似策略模式的方式去處理分頁(yè),比如判斷如果是一百頁(yè)以內(nèi),就使用最基本的分頁(yè)方式,大于一百頁(yè),則使用子查詢的分頁(yè)方式。

    Oracle查詢:SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40WHERE RN >= 21


13.單例模式、工廠模式、代理模式

    枚舉實(shí)現(xiàn)單例模式:

    public enum Singleton {

    /**
* 定義一個(gè)枚舉的元素,它就代表了Singleton的一個(gè)實(shí)例。
*/

uniqueInstance;

/**
* 單例可以有自己的操作
*/
public void singletonOperation(){
//功能處理
}
}
  懶漢同步單例模式:
  public class LazySingleton { 
    private static LazySingleton instance = null; 
    /** 
     * 私有默認(rèn)構(gòu)造子 
     */ 
    private LazySingleton(){} 
    /** 
     * 靜態(tài)工廠方法 
     */ 
    public static synchronized LazySingleton getInstance(){ 
        if(instance == null){ 
            instance = new LazySingleton(); 
        } 
        return instance; 
    } 
}
工廠模式:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
代理模式:http://yangguangfu.iteye.com/blog/815787

未完待續(xù)...













]]>
【轉(zhuǎn)】Servlet 生命周期、工作原理http://www.aygfsteel.com/xue/archive/2014/10/08/418513.html小人物_Amor小人物_AmorWed, 08 Oct 2014 07:16:00 GMThttp://www.aygfsteel.com/xue/archive/2014/10/08/418513.htmlhttp://www.aygfsteel.com/xue/comments/418513.htmlhttp://www.aygfsteel.com/xue/archive/2014/10/08/418513.html#Feedback0http://www.aygfsteel.com/xue/comments/commentRss/418513.htmlhttp://www.aygfsteel.com/xue/services/trackbacks/418513.html
  1. Servlet 生命周期:Servlet 加載--->實(shí)例化--->服務(wù)--->銷毀。
  2. init():在Servlet的生命周期中,僅執(zhí)行一次init()方法。它是在服務(wù)器裝入Servlet時(shí)執(zhí)行的,負(fù)責(zé)初始化Servlet 對(duì)象。可以配置服務(wù)器,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問(wèn)Servlet時(shí)裝入Servlet。無(wú)論有多少客戶機(jī)訪問(wèn)Servlet,都不會(huì)重復(fù)執(zhí)行 init()。
  3. service():它是Servlet的核心,負(fù)責(zé)響應(yīng)客戶的請(qǐng)求。每當(dāng)一個(gè)客戶請(qǐng)求一個(gè)HttpServlet對(duì)象,該對(duì)象的 Service()方法就要調(diào)用,而且傳遞給這個(gè)方法一個(gè)“請(qǐng)求”(ServletRequest)對(duì)象和一個(gè)“響應(yīng)” (ServletResponse)對(duì)象作為參數(shù)。在HttpServlet中已存在Service()方法。默認(rèn)的服務(wù)功能是調(diào)用與HTTP請(qǐng)求的方法 相應(yīng)的do功能。
  4. destroy(): 僅執(zhí)行一次,在服務(wù)器端停止且卸載Servlet時(shí)執(zhí)行該方法。當(dāng)Servlet對(duì)象退出生命周期時(shí),負(fù)責(zé)釋放占用的資 源。一個(gè)Servlet在運(yùn)行service()方法時(shí)可能會(huì)產(chǎn)生其他的線程,因此需要確認(rèn)在調(diào)用destroy()方法時(shí),這些線程已經(jīng)終止或完成。

Tomcat 與 Servlet 是如何工作的:

步驟:

  1. Web Client 向Servlet容器(Tomcat)發(fā)出Http請(qǐng)求
  2. Servlet容器接收Web Client的請(qǐng)求
  3. Servlet容器創(chuàng)建一個(gè)HttpRequest對(duì)象,將Web Client請(qǐng)求的信息封裝到這個(gè)對(duì)象中。
  4. Servlet容器創(chuàng)建一個(gè)HttpResponse對(duì)象
  5. Servlet容器調(diào)用HttpServlet對(duì)象的service方法,把HttpRequest對(duì)象與HttpResponse對(duì)象作為參數(shù)傳給 HttpServlet 對(duì)象。
  6. HttpServlet調(diào)用HttpRequest對(duì)象的有關(guān)方法,獲取Http請(qǐng)求信息。
  7. HttpServlet調(diào)用HttpResponse對(duì)象的有關(guān)方法,生成響應(yīng)數(shù)據(jù)。
  8. Servlet容器把HttpServlet的響應(yīng)結(jié)果傳給Web Client。

 

Servlet工作原理:

1、首先簡(jiǎn)單解釋一下Servlet接收和響應(yīng)客戶請(qǐng)求的過(guò)程,首先客戶發(fā)送一個(gè)請(qǐng)求,Servlet是調(diào)用service()方法對(duì)請(qǐng)求進(jìn)行響應(yīng) 的,通過(guò)源代碼可見(jiàn),service()方法中對(duì)請(qǐng)求的方式進(jìn)行了匹配,選擇調(diào)用doGet,doPost等這些方法,然后再進(jìn)入對(duì)應(yīng)的方法中調(diào)用邏輯層 的方法,實(shí)現(xiàn)對(duì)客戶的響應(yīng)。在Servlet接口和GenericServlet中是沒(méi)有doGet()、doPost()等等這些方法 的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個(gè)Servlet的時(shí)候,都必須實(shí)現(xiàn)doGet或 doPost等這些方法。

2、每一個(gè)自定義的Servlet都必須實(shí)現(xiàn)Servlet的接口,Servlet接口中定義了五個(gè)方法,其中比較重要的三個(gè)方法涉及到 Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個(gè)通用的,不 特定于任何協(xié)議的Servlet,它實(shí)現(xiàn)了Servlet接口。而HttpServlet繼承于GenericServlet,因此 HttpServlet也實(shí)現(xiàn)了Servlet接口。所以我們定義Servlet的時(shí)候只需要繼承HttpServlet即可。

3、Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以 HttpServlet中實(shí)現(xiàn)了service()方法,并將請(qǐng)求ServletRequest、ServletResponse 強(qiáng)轉(zhuǎn)為HttpRequest 和 HttpResponse。

 

 

創(chuàng)建Servlet對(duì)象的時(shí)機(jī):

  1. Servlet容器啟動(dòng)時(shí):讀取web.xml配置文件中的信息,構(gòu)造指定的Servlet對(duì)象,創(chuàng)建ServletConfig對(duì)象,同時(shí)將ServletConfig對(duì)象作為參數(shù)來(lái)調(diào)用Servlet對(duì)象的init方法。
  2. 在Servlet容器啟動(dòng)后:客戶首次向Servlet發(fā)出請(qǐng)求,Servlet容器會(huì)判斷內(nèi)存中是否存在指定的Servlet對(duì)象,如果沒(méi)有則 創(chuàng)建它,然后根據(jù)客戶的請(qǐng)求創(chuàng)建HttpRequest、HttpResponse對(duì)象,從而調(diào)用Servlet 對(duì)象的service方法。
  3. Servlet Servlet容器在啟動(dòng)時(shí)自動(dòng)創(chuàng)建Servlet,這是由在web.xml文件中為Servlet設(shè)置的<load- on-startup>屬性決定的。從中我們也能看到同一個(gè)類型的Servlet對(duì)象在Servlet容器中以單例的形式存在。
    <servlet>
            
    <servlet-name>Init</servlet-name>
            
    <servlet-class>org.xl.servlet.InitServlet</servlet-class>
            
    <load-on-startup>1</load-on-startup>
    </servlet>

 



]]>
基于dtree的樹(shù)形菜單實(shí)現(xiàn)http://www.aygfsteel.com/xue/archive/2014/05/30/414277.html小人物_Amor小人物_AmorFri, 30 May 2014 09:46:00 GMThttp://www.aygfsteel.com/xue/archive/2014/05/30/414277.htmlhttp://www.aygfsteel.com/xue/comments/414277.htmlhttp://www.aygfsteel.com/xue/archive/2014/05/30/414277.html#Feedback0http://www.aygfsteel.com/xue/comments/commentRss/414277.htmlhttp://www.aygfsteel.com/xue/services/trackbacks/414277.html
CREATE TABLE `s_menu` (
  `id` 
int(11NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `pid` 
int(11DEFAULT NULL COMMENT '父級(jí)id',
  `name` 
varchar(45DEFAULT NULL COMMENT '菜單名稱',
  `url` 
varchar(255DEFAULT NULL COMMENT '菜單url',
  `title` 
varchar(45DEFAULT NULL COMMENT '鼠標(biāo)放上去顯示的title',
  `target` 
varchar(45DEFAULT NULL COMMENT '目標(biāo)iframe',
  `icon` 
varchar(255DEFAULT NULL COMMENT '菜單折疊時(shí)候顯示的圖片',
  `iconOpen` 
varchar(255DEFAULT NULL COMMENT '菜單打開(kāi)時(shí)候顯示的圖片',
  `
openint(1DEFAULT '0' COMMENT '是否打開(kāi)',
  
PRIMARY KEY (`id`)
) ENGINE
=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

并且插入一些測(cè)試數(shù)據(jù)來(lái)使用:
INSERT INTO `s_menu` VALUES ('1''-1''瀏覽器''#''瀏覽器'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('2''1''IE''#''IE瀏覽器'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('3''2''IE6''#''IE6'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('4''2''IE7''#''IE7'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('5''2''IE8''#''IE8'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('6''2''IE10''#''IE10'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('7''1''Firefox''#''Firefox'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('8''7''Firefox15.0''#''Firefox15.0'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('9''7''Firefox15.1''#''Firefox15.1'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('10''1''360瀏覽器''#''360瀏覽器'nullnullnull'0');
INSERT INTO `s_menu` VALUES ('11''1''搜狗瀏覽器''#''搜狗瀏覽器'nullnullnull'0');

接下來(lái)把解壓好的dtree.js以及dtree.css放到項(xiàng)目的對(duì)應(yīng)目錄下,并在頁(yè)面引入,后臺(tái)執(zhí)行方法我就不說(shuō)了,就是查詢出s_menu里所有的數(shù)據(jù)就可以了,在jsp里面實(shí)現(xiàn):
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/common/taglibs.jsp" %>
<%@ page import="org.springframework.context.ApplicationContext,org.springframework.context.support.ClassPathXmlApplicationContext,com.zx.ww.entity.base.Menu,com.zx.ww.service.base.MenuManager,java.util.List"  %>
<%
    ApplicationContext context 
= new ClassPathXmlApplicationContext("applicationContext.xml");
    MenuManager menuManager 
= (MenuManager)context.getBean("menuManager");
    List
<Menu> menus = menuManager.findAllMenu();
    request.setAttribute(
"menus", menus);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    
<head>
        
<title>SSH2</title>
    
</head>
    
<body>
        
<table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
            
<tr>
                
<td valign="top">
                    
<div id="treearea" style="overflow: scroll;height:100%;width:100%"></div>
                
</td>
            
</tr>
        
</table>
    
</body>
</html>
<script type="text/javascript">
    
var dtree = new dTree('dtree', '${ctx}/images/dtree/');
    dtree.config.folderLinks 
= true;
    dtree.config.useCookies 
= true;
    
<c:forEach items="${menus}" var="menu">
        dtree.add(${menu.id},${menu.pid},
"${menu.name}","${menu.url}","${menu.title}");
    
</c:forEach>
    document.getElementById('treearea').innerHTML 
= dtree;
    
</script>

看效果:

這是從數(shù)據(jù)庫(kù)里讀出數(shù)據(jù)的方式,本地的話構(gòu)建這樣的數(shù)據(jù)就行了:
<script type="text/javascript">
        
<!--

        d 
= new dTree('d');

        d.add(
0,-1,'My example tree');
        d.add(
1,0,'Node 1','example01.html');
        d.add(
2,0,'Node 2','example01.html');
        d.add(
3,1,'Node 1.1','example01.html');
        d.add(
4,0,'Node 3','example01.html');
        d.add(
5,3,'Node 1.1.1','example01.html');
        d.add(
6,5,'Node 1.1.1.1','example01.html');
        d.add(
7,0,'Node 4','example01.html');
        d.add(
8,1,'Node 1.2','example01.html');
        d.add(
9,0,'My Pictures','example01.html','Pictures I\'ve taken over the years','','','img/imgfolder.gif');
        d.add(
10,9,'The trip to Iceland','example01.html','Pictures of Gullfoss and Geysir');
        d.add(
11,9,'Mom\'s birthday','example01.html');
        d.add(
12,0,'Recycle Bin','example01.html','','','img/trash.gif');

        document.write(d);

        
//-->
    </script>
網(wǎng)上有很多關(guān)于dtree的說(shuō)明,在此看不明白的再去網(wǎng)上找找別的,有說(shuō)的比較詳細(xì)的PPT,關(guān)于各個(gè)參數(shù)以及方法說(shuō)明都有~
ok,留著以后會(huì)有用的!

]]>
輸入框自動(dòng)提示開(kāi)發(fā)使用http://www.aygfsteel.com/xue/archive/2014/05/22/413990.html小人物_Amor小人物_AmorThu, 22 May 2014 10:11:00 GMThttp://www.aygfsteel.com/xue/archive/2014/05/22/413990.htmlhttp://www.aygfsteel.com/xue/comments/413990.htmlhttp://www.aygfsteel.com/xue/archive/2014/05/22/413990.html#Feedback0http://www.aygfsteel.com/xue/comments/commentRss/413990.htmlhttp://www.aygfsteel.com/xue/services/trackbacks/413990.html因?yàn)轫?xiàng)目需要,需要做輸入框自動(dòng)提示功能,之前我只是使用過(guò)這種功能,相信大家也都使用過(guò),百度~現(xiàn)在要讓我自己做,好吧,還是百度一下,百度搜索“輸入框自動(dòng)提示”,彈出一對(duì)頁(yè)面,也看了一堆文章,有自己開(kāi)發(fā)的,也有插件的。 最后經(jīng)過(guò)幾次試驗(yàn),我選擇了JQuery.Autocomplete這款插件,還行吧用著,支持本地也支持ajax訪問(wèn)服務(wù)器,這款插件是基于jquery的,各位若有項(xiàng)目需要使用的,可以嘗試一把。

源碼下載:JQuery.AutoComplete

本地自動(dòng)提示的方式我就不說(shuō)了,各位下載源碼之后看一下也就明白了,當(dāng)然不明白的也可以問(wèn)我,說(shuō)一下ajax訪問(wèn)服務(wù)器的方式吧,直接上代碼最為直接:


$(
function(){
    
    
      var onAutocompleteSelect =function(customer) {  
      $('#customerIdString').val(customer.data);
          }; 
          
var options = {
              serviceUrl: '${pageContext.request.contextPath}
/TCustomer/getAllCustomer.koala',//獲取數(shù)據(jù)的后臺(tái)頁(yè)面
              onSelect: onAutocompleteSelect,//選中之后的回調(diào)函數(shù)
              extraParams: {selectedCustomerName:$.trim($("#selectedCustomerName").val())},//動(dòng)態(tài)參數(shù)值
              paramName: "selectedCustomerName",
              noCache: 
false//是否啟用緩存 默認(rèn)是開(kāi)啟緩存的
              max:10,
              autoFill:
false
          };         
          $('#selectedCustomerName').autocomplete(options);
});

這樣我們就可以把填入輸入框的值作為extraParams動(dòng)態(tài)參數(shù)傳遞到后臺(tái)去,后臺(tái)直接request.getParameter("selectedCustomerName");就可以了。

值得注意的是,后臺(tái)應(yīng)該返回什么樣的數(shù)據(jù)格式,這個(gè)插件需要注意的地方就是這塊了,如果不是他要求的格式的話,頁(yè)面會(huì)報(bào)js錯(cuò)誤的,要求的數(shù)據(jù)格式必須是這樣的json串:

{"query":"A","suggestions":[{"data":"114e69b4-87a9-4c2b-aed4-1727568a92a7","value":"AAA111"},{"data":"531b59ca-8618-48f4-a6e8-963320e10159","value":"小人物_Amor"}]}

query后面的A是我輸入框傳入的參數(shù),根據(jù)A模糊查詢出兩組數(shù)據(jù),并以json的格式放在key為suggestions里。

后臺(tái)代碼:

    
    @ResponseBody
    @RequestMapping(
"/getAllCustomer")
    
public Object getAllCustomer(HttpServletRequest request,HttpServletResponse response)throws IOException{
        List
<Object> queryCustomerList = new ArrayList<Object>();
        List
<TCustomerDTO> allCustomer = new ArrayList<TCustomerDTO>();
        //獲取前臺(tái)帶過(guò)來(lái)的動(dòng)態(tài)參數(shù)
        String selectedCustomerName 
= request.getParameter("selectedCustomerName");
       
        //得到包含
selectedCustomerName參數(shù)的對(duì)象
        allCustomer = tCustomerApplication.findAllTCustomer();
        
for (Iterator iterator = allCustomer.iterator(); iterator.hasNext();) {
            TCustomerDTO tCustomerDTO 
= (TCustomerDTO) iterator.next();
            
if(tCustomerDTO.getName().contains(selectedCustomerName)){
                Map
<String, Object> result = new HashMap<String, Object>();
                result.put(
"value", tCustomerDTO.getName());
                result.put(
"data", tCustomerDTO.getId());
                queryCustomerList.add(result);
            }
        }
       
        //構(gòu)造規(guī)定的json數(shù)據(jù)格式
        Map
<String, Object> query_result = new HashMap<String, Object>();
        Object json 
= JSONArray.toJSON(queryCustomerList);
        query_result.put(
"query", selectedCustomerName);
        query_result.put(
"suggestions", json);
        Object json_map 
= JSONArray.toJSON(query_result);
        System.out.println(json_map);
        
return json_map;
    }

OK了,其實(shí)很簡(jiǎn)單,當(dāng)然你需要引入jquery,以及他所要求的其他兩個(gè)js文件,各位下載源碼后看示例就知道啦~


]]>
jsp頁(yè)面引入jstl標(biāo)簽以及如何開(kāi)發(fā)自定義標(biāo)簽http://www.aygfsteel.com/xue/archive/2014/05/21/413934.html小人物_Amor小人物_AmorWed, 21 May 2014 09:17:00 GMThttp://www.aygfsteel.com/xue/archive/2014/05/21/413934.htmlhttp://www.aygfsteel.com/xue/comments/413934.htmlhttp://www.aygfsteel.com/xue/archive/2014/05/21/413934.html#Feedback6http://www.aygfsteel.com/xue/comments/commentRss/413934.htmlhttp://www.aygfsteel.com/xue/services/trackbacks/413934.htmljsp頁(yè)面引入jstl標(biāo)簽:

1.網(wǎng)上下載jstl.jar包和standard.jar包放到項(xiàng)目的lib文件夾下,jar包下載:jar包下載;

2.然后在你的jsp頁(yè)面里引入如下代碼:

1 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

ok了,在你的頁(yè)面使用c標(biāo)簽吧~



下面來(lái)說(shuō)說(shuō)自定義標(biāo)簽的開(kāi)發(fā):
jsp自定義標(biāo)簽,用于項(xiàng)目便捷開(kāi)發(fā)。在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們大多數(shù)時(shí)候會(huì)采用數(shù)據(jù)字典來(lái)儲(chǔ)存項(xiàng)目中一些數(shù)據(jù),比如性別、國(guó)際、類型等,用數(shù)據(jù)字典存儲(chǔ)很 方便,因此在數(shù)據(jù)庫(kù)中添加一張數(shù)據(jù)字典表t_dict_value,有做過(guò)的項(xiàng)目中采用兩張表進(jìn)行數(shù)據(jù)字典的管理,個(gè)人在設(shè)計(jì)數(shù)據(jù)字典的時(shí)候感覺(jué)一張表也 夠用了,不多說(shuō)看建表語(yǔ)句:
                
我的自定義標(biāo)簽是基于數(shù)據(jù)字典表使用的,當(dāng)然后續(xù)業(yè)務(wù)中有需要也可以制作特定的自定義標(biāo)簽,接下來(lái)開(kāi)始自定義標(biāo)簽,首先寫一個(gè)DictSelectTag類,代碼如下:
package com.infopatent.juangetljc.web.controller.core;
import java.io.IOException;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.commons.lang3.StringUtils;

import com.infopatent.juangetljc.core.DictValue;

public class DictSelectTag extends TagSupport  {

    private String dictName = "";
    private boolean defaultValue;
    private String value;
    private String name;
    private String id;
    private String cssClass;
    private String styleClass;
    private String multiple;
    private String onChange;
    private String dataType;

    public String getDataType() {
        return dataType;
    }

    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    public String getCssClass() {
        return cssClass;
    }

    public void setCssClass(String cssClass) {
        this.cssClass = cssClass;
    }

    public String getStyleClass() {
        return styleClass;
    }

    public void setStyleClass(String styleClass) {
        this.styleClass = styleClass;
    }

    public String getMultiple() {
        return multiple;
    }

    public void setMultiple(String multiple) {
        this.multiple = multiple;
    }

    public String getOnChange() {
        return onChange;
    }

    public void setOnChange(String onChange) {
        this.onChange = onChange;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getDictName() {
        return dictName;
    }

    public void setDictName(String dictName) {
        this.dictName = dictName;
    }
    
    public boolean isDefaultValue() {
        return defaultValue;
    }

    public void setDefaultValue(boolean defaultValue) {
        this.defaultValue = defaultValue;
    }
    
    
    @Override
    public int doEndTag() throws JspException{
        DictValue dict = new DictValue();
        List<DictValue> dict_list = dict.getRepository().findByProperty(DictValue.class,"dictName",dictName);
        JspWriter out = pageContext.getOut();
        StringBuffer sb = new StringBuffer();
        sb.append("<select name='"+this.getName()+"' id='"+this.getId()+"' dataType='"+this.getDataType()+"'");
        if(!StringUtils.isEmpty(this.getCssClass())){
            sb.append("class=\"" + this.getCssClass() + "\" ");
        }
        if(!StringUtils.isEmpty(this.getStyleClass())){
            sb.append("style=\"" + this.getStyleClass() + "\" ");
        }
        if(!StringUtils.isEmpty(this.getMultiple())){
            sb.append("multiple=\"" + this.getMultiple() + "\" ");
        }
        if(!StringUtils.isEmpty(this.getOnChange())){
            sb.append("onchange=\"" + this.getOnChange() + "\" ");
        }
        sb.append(">");
        if(this.isDefaultValue()){  
            sb.append("<option value=''>--請(qǐng)選擇--</option>");  
        }
        for(DictValue dc:dict_list){
            if(dc.getItemDesc().equals(this.getValue())){
                sb.append("<option value='"+dc.getItemCode()+"' selected='selected'>");
            }else{
                sb.append("<option value='"+dc.getItemCode()+"'>");
            }
            sb.append(dc.getItemDesc()+"</option>");
        }
        sb.append("</select>");
        try {
            out.write(sb.toString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new JspException(e);
        }
        return TagSupport.EVAL_PAGE;
    }
    
}
 再寫一個(gè)DictLabelTag類用于顯示字典中的值,代碼如下:
  package com.infopatent.juangetljc.web.controller.core;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.springframework.web.servlet.tags.form.OptionsTag;

import com.infopatent.juangetljc.core.DictValue;

public class DictLabelTag extends TagSupport {

    private String dictName = "";
    private String itemCode;

    public String getDictName() {
        return dictName;
    }

    public void setDictName(String dictName) {
        this.dictName = dictName;
    }

    public String getItemCode() {
        return itemCode;
    }

    public void setItemCode(String itemCode) {
        this.itemCode = itemCode;
    }

    @Override
    public int doEndTag() throws JspException {
        DictValue dict = new DictValue();
        JspWriter out = pageContext.getOut();
        try {
            out.write(dict.codeToName(getDictName(),getItemCode()));
        } catch (IOException e) {
            throw new JspException(e);
        }
        return TagSupport.EVAL_PAGE;
    }
}

接下來(lái)配置tld文件,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version
="2.0">

    <description>SPay JSP Form Tag Library</description>
    <tlib-version>1.0</tlib-version>
    <short-name>dict</short-name>
    <uri>http://www.tljc.com/dict_tag</uri>

    <tag>
        <description>Renders an HTML 'select' element. Supports databinding to the selected option.</description>
        <name>select</name>
        <tag-class>com.infopatent.juangetljc.web.controller.core.DictSelectTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>  
               <name>defaultValue</name>  
            <required>true</required>  
            <rtexprvalue>true</rtexprvalue>  
        </attribute>  
        <attribute>  
               <name>dataType</name>  
            <required>true</required>  
            <rtexprvalue>true</rtexprvalue>  
        </attribute> 
    <attribute>  
            <name>value</name>  
            <required>false</required>  
            <rtexprvalue>true</rtexprvalue>  
    </attribute>
    <attribute>
        <name>dictName</name>
        <required>true</required>  
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>name</name>
        <required>true</required>  
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>id</name>
        <required>true</required>  
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>cssClass</name>
        <required>false</required>  
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>styleClass</name>
        <required>false</required>  
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>multiple</name>
        <required>false</required>  
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>onChange</name>
        <required>false</required>  
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    </tag>
    
    

    <tag>
        <name>itemdesc</name>
        <tag-class>com.infopatent.juangetljc.web.controller.core.DictLabelTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <description>The Dict Name config in dict_value</description>
            <name>dictName</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <description>The Dict Code config in dict_value</description>
            <name>itemCode</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>
接下來(lái)在jsp頁(yè)面里引入標(biāo)簽:

<%@taglib prefix="dict" uri="http://www.tljc.com/dict_tag" %>

這樣便可以在jsp頁(yè)面里使用定義的標(biāo)簽了:

<dict:select defaultValue="true" name="GJ" id="GJ" dictName="GJ" cssClass="form-control"/>

前提是要在字典表里加上“GJ”這條數(shù)據(jù)。

OK了!



]]>
主站蜘蛛池模板: 宁武县| 城口县| 泰来县| 分宜县| 肇东市| 迁安市| 普定县| 禹州市| 收藏| 芦溪县| 普宁市| 灯塔市| 横峰县| 阜阳市| 建阳市| 盐津县| 乌恰县| 克什克腾旗| 黑河市| 宣武区| 龙海市| 丹江口市| 东明县| 富平县| 余庆县| 东乌珠穆沁旗| 巴南区| 新宁县| 沙坪坝区| 定安县| 固安县| 日照市| 灵璧县| 祁阳县| 耒阳市| 益阳市| 永平县| 宣武区| 绥中县| 西平县| 阳东县|