推薦淘寶秋冬男裝熱賣網(wǎng)店

          追求無(wú)止境

          我的程序人生
          隨筆 - 31, 文章 - 2, 評(píng)論 - 20, 引用 - 0
          數(shù)據(jù)加載中……

          2009年11月16日

          有一天你會(huì)長(zhǎng)大

          什么話該說(shuō),什么話不該說(shuō),該說(shuō)的話該怎么說(shuō)。誰(shuí)能告訴我。

          posted @ 2010-01-19 13:21 追求無(wú)止境 閱讀(204) | 評(píng)論 (0)編輯 收藏

          2009年度盛事 - 總結(jié)2009

                 2009年12月31日,站在2009年的尾巴上,不禁感到時(shí)間飛逝。2009年,匆匆而過(guò)。在過(guò)去的2009年,收獲何多,失去何多。2009年,對(duì)我來(lái)說(shuō),是一個(gè)重要的轉(zhuǎn)折點(diǎn)。漸漸的發(fā)現(xiàn)自己應(yīng)該長(zhǎng)大了,也發(fā)現(xiàn)自己確實(shí)長(zhǎng)大了,更發(fā)現(xiàn)自己實(shí)際上還是需要繼續(xù)長(zhǎng)大。

                每年的這個(gè)時(shí)候,各個(gè)新聞媒體都會(huì)評(píng)出什么十大之類的,我也落一會(huì)俗(當(dāng)然自己本身就很俗),來(lái)看看今年發(fā)生在我身上的幾大事件:

          先大體羅列一下吧:

          1. 訂婚
          2. 進(jìn)京
          3. 工作
          4. 畢業(yè)
          5. 讀研
          6. 買筆記本

               從時(shí)間跨度上來(lái)說(shuō), 1月到2月在家過(guò)年,2月和3月在青島某公司實(shí)習(xí),4月和5月在北京某公司實(shí)習(xí),6月在中國(guó)石油大學(xué)享受畢業(yè)之前的時(shí)光,7月到8月繼續(xù)在北京某公司實(shí)習(xí),9月到12月在上學(xué)+實(shí)習(xí)。2009年最幸福的事情發(fā)生在1到2月,盡快也有不快;最平常的日子在2月和3月,到了4月和5月或許是我最糾結(jié)的日子吧;6月或許是最快樂(lè)的日子的吧;7月和8月讓我體會(huì)到了工作的滋味;而9月到12月,整天在公司與學(xué)校之間奔跑,知道了工作+上課兩者要做到兼顧的滋味,雖然并沒(méi)有做到兼顧。

               2009年大體經(jīng)歷如此。2009年對(duì)我最大的關(guān)鍵字或許就是“改變”,這一年我訂婚了,在這一點(diǎn)上,改變了我的準(zhǔn)非單身狀態(tài);在這一年,我實(shí)習(xí)了,而且大量的時(shí)間都在于此,改變了我僅僅是學(xué)生的狀態(tài);在這一年,我畢業(yè)了,我離開了生活學(xué)習(xí)四年的中國(guó)石油大學(xué),離開了讓我畢生難忘的日子;在這一年,我來(lái)北京了,從對(duì)北京的一無(wú)所知,到開始的彷徨,然后漸漸熟悉和適應(yīng);在這一年,我的經(jīng)濟(jì)漸漸獨(dú)立,盡管每個(gè)月只有不到1000的收入,但能滿足的我的基本需求;在這一年,我買了筆記本,雖然對(duì)其他人來(lái)說(shuō),這不是一件特別的事,對(duì)我來(lái)說(shuō),因采用了分期付款,而用接下來(lái)一年中近半個(gè)月的工資來(lái)還,但我不覺(jué)得后悔,在這個(gè)過(guò)程中,我的經(jīng)濟(jì)觀念和理財(cái)觀念開始漸漸改變;在這一年,工作成了我的核心,工作教會(huì)我很多東西,在與人交流、在工作態(tài)度、在技術(shù)上,都有一定的提高。

               回憶2009年,收獲頗多,也失去不少。但日子總是向前的,有得必有失。希望在以后的2009年,自己能夠漸漸提高自己的能力。無(wú)論是在生活上,在工作上,還是在心理上。

           

              2009年10大大事:

                 與老婆訂婚:

                 2009年,

          posted @ 2009-12-31 12:55 追求無(wú)止境 閱讀(209) | 評(píng)論 (0)編輯 收藏

          Spring web MVC 框架學(xué)習(xí)筆記 之 ViewResolver技術(shù)

          上次的文章中介紹了ModelAndView對(duì)象中的view對(duì)象,可以使用字符串來(lái)讓Spring框架進(jìn)行解析獲得適合的視圖。而解析View的就是ViewResolver技術(shù)。

          ViewResolver的定義如下:

          public interface ViewResolver {
          View resolveViewName(String viewName, Locale locale) throws Exception;
          }
           
          在[spring-dispatcher-name]-servlet.xml中,可以定義viewResolver:

          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                  <property name="prefix" value="/jsp/"/>
                  <property name="suffix" value=".jsp"/>
              </bean>

          來(lái)讓DispacherServlet進(jìn)行加載默認(rèn)的viewResolver,如果沒(méi)有設(shè)置viewResolver,spring使用InternalResourceViewResolver進(jìn)行解析。

          Spring實(shí)現(xiàn)ViewResolver的非抽象類且我們經(jīng)常使用的viewResolver有以下四種:

          InternalResourceViewResolver 將邏輯視圖名字解析為一個(gè)路徑
          BeanNameViewResolver 將邏輯視圖名字解析為bean的Name屬性,從而根據(jù)name屬性,找定義View的bean
          ResourceBundleResolver 和BeanNameViewResolver一樣,只不過(guò)定義的view-bean都在一個(gè)properties文件中,用這個(gè)類進(jìn)行加載這個(gè)properties文件
          XmlViewResolver 和ResourceBundleResolver一樣,只不過(guò)定義的view-bean在一個(gè)xml文件中,用這個(gè)類來(lái)加載xml文件

           

          使用多視圖解析器:

          我們不想只使用一種視圖解析器的話,可以在[spring-dispatcher-name]-servlet.xml定義多個(gè)viewResolver:

          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="prefix" value="/jsp/"/>
          <property name="suffix" value=".jsp"/>
          </bean>

          <bean id=”beanNameViewResolver” class=”...BeanNameViewResolver”>
          <property name="order" value="1"></property>
          </bean>

          <bean id=”beanNameViewResolver” class=”...XmlViewResolver”>
          <property name="order" value="0"></property>
          </bean>

          DispatcherServlet會(huì)加載所有的viewResolver到一個(gè)list中,并按照優(yōu)先級(jí)進(jìn)行解析。注意order中的值越小,優(yōu)先級(jí)越高。而id為viewResolver

          的viewResolver的優(yōu)先級(jí)是最低的。

          posted @ 2009-11-27 12:11 追求無(wú)止境 閱讀(6881) | 評(píng)論 (1)編輯 收藏

          Spring MVC框架學(xué)習(xí)筆記 之 View技術(shù)

          以前,我們?cè)敿?xì)介紹了Spring的Controller技術(shù)。Spring的面向接口編程,使Controller的實(shí)現(xiàn)多種多樣。View技術(shù)也一樣。今天的分析先從在Controller中的ModelAndView開始。

          public class ModelAndView {     
            private Object view; //View實(shí)例或者view的字符串    
          /** Model Map */  
            private ModelMap model; //model
           /* * Convenient constructor when there is no model data to expose.     * Can also be used in conjunction with <code>addObject</code>.    
           * @param view View object to render   
            * @see #addObject     */  
           public ModelAndView(View view) {        
              this.view = view;    
          }
          public ModelAndView(String viewName){ 
             this.view = viewName;
          }

           
          可以看到view實(shí)例可以指向一個(gè)View對(duì)象或者字符串。現(xiàn)在先看看View接口:
          public interface View { 
          
              /**
               * Return the content type of the view, if predetermined.
               * <p>Can be used to check the content type upfront,
               * before the actual rendering process.
               * @return the content type String (optionally including a character set),
               * or <code>null</code> if not predetermined.
               */
              String getContentType(); 
          
              /**
               * 繪制視圖
               * 繪制視圖的第一步是準(zhǔn)備請(qǐng)求: 如果是JSP的視圖技術(shù)
               * 首先會(huì)把model設(shè)為request的屬性。
               * 第二步則是真正的繪制視圖
               * @param model Map with name Strings as keys and corresponding model
               * objects as values (Map can also be <code>null</code> in case of empty model)
               * @param request current HTTP request
               * @param response HTTP response we are building
               * @throws Exception if rendering failed
               */
              void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; 
          
          }
          在這之后,我們?cè)賮?lái)看看View的實(shí)現(xiàn)繼承類圖,可以看到Spring支持多種類型視圖:

          org.springframework.web.servlet.view.AbstractView (implements org.springframework.beans.factory.BeanNameAware, org.springframework.web.servlet.View)

          • org.springframework.web.servlet.view.document.AbstractExcelView
          • org.springframework.web.servlet.view.document.AbstractJExcelView
          • org.springframework.web.servlet.view.document.AbstractPdfView
          • org.springframework.web.servlet.view.AbstractUrlBasedView (implements org.springframework.beans.factory.InitializingBean)
            • org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsView
              • org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsSingleFormatView
                • org.springframework.web.servlet.view.jasperreports.ConfigurableJasperReportsView
                • org.springframework.web.servlet.view.jasperreports.JasperReportsCsvView
                • org.springframework.web.servlet.view.jasperreports.JasperReportsHtmlView
                • org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView
                • org.springframework.web.servlet.view.jasperreports.JasperReportsXlsView
              • org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView
            • org.springframework.web.servlet.view.document.AbstractPdfStamperView
            • org.springframework.web.servlet.view.AbstractTemplateView
              • org.springframework.web.servlet.view.freemarker.FreeMarkerView
              • org.springframework.web.servlet.view.velocity.VelocityView
                • org.springframework.web.servlet.view.velocity.VelocityToolboxView
                  • org.springframework.web.servlet.view.velocity.VelocityLayoutView
            • org.springframework.web.servlet.view.InternalResourceView
              • org.springframework.web.servlet.view.JstlView
              • org.springframework.web.servlet.view.tiles.TilesView
                • org.springframework.web.servlet.view.tiles.TilesJstlView
            • org.springframework.web.servlet.view.RedirectView
            • org.springframework.web.servlet.view.tiles2.TilesView
            • org.springframework.web.servlet.view.xslt.XsltView
          • org.springframework.web.servlet.view.xslt.AbstractXsltView
           
          和Controller一樣,View的第一個(gè)實(shí)現(xiàn)也是AbstractView。所以先讓我們看看AbstractView對(duì)render函數(shù)的實(shí)現(xiàn):

           

          public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
          if (logger.isTraceEnabled()) {
          logger.trace("Rendering view with name '" + this.beanName + "' with model " + model +
          " and static attributes " + this.staticAttributes);
          }

          // Consolidate static and dynamic model attributes.
          Map mergedModel = new HashMap(this.staticAttributes.size() + (model != null ? model.size() : 0));
          mergedModel.putAll(this.staticAttributes);
          if (model != null) {
          mergedModel.putAll(model);
          }

          // Expose RequestContext?
          if (this.requestContextAttribute != null) {
          mergedModel.put(this.requestContextAttribute, createRequestContext(request, mergedModel));
          }

          prepareResponse(request, response);
          renderMergedOutputModel(mergedModel, request, response);
          }

          第一步,將靜態(tài)屬性和model的屬性都添加到mergedModel里面。如果需要請(qǐng)求上下文,則將請(qǐng)求上下文添加到model中。

          靜態(tài)屬性是繼承AbstractView進(jìn)行設(shè)置的屬性。而請(qǐng)求上下文如果設(shè)置的名字就會(huì)創(chuàng)建一個(gè)request上下文。在requestContext中定義了一些包括本地化和主題的處理工具。

          第二步,對(duì)響應(yīng)進(jìn)行預(yù)處理。最后調(diào)用子類需要實(shí)現(xiàn)的函數(shù)renderMergedOutputModel。

          對(duì)PDF和EXCEL格式我們暫且不管,且Spring支持多種視圖技術(shù),這里我們主要關(guān)注JSTL技術(shù),

          接著我們來(lái)看AbstractUrlBasedView 類。在AbstractUrlBasedView 只定義了一個(gè)url屬性。別的沒(méi)有什么特殊處理。

          接著繼承AbstractUrlBasedView 的是InternalResourceView。他對(duì)renderMergedOutputModel進(jìn)行實(shí)現(xiàn),實(shí)現(xiàn)如下:

          /**
          * Render the internal resource given the specified model.
          * This includes setting the model as request attributes.
          */
          protected void renderMergedOutputModel(
          Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {

          // 獲取要暴露的request,一般都是傳入的參數(shù)request
          HttpServletRequest requestToExpose = getRequestToExpose(request);

          // 將model的數(shù)據(jù)添加到request屬性中
                  exposeModelAsRequestAttributes(model, requestToExpose);

          // 設(shè)置helper,如果存在的話
          exposeHelpers(requestToExpose);

          // 對(duì)繪制進(jìn)行預(yù)處理,從而獲得到要分發(fā)的url
          String dispatcherPath = prepareForRendering(requestToExpose, response);

          // 獲取請(qǐng)求分發(fā)對(duì)象
          RequestDispatcher rd = requestToExpose.getRequestDispatcher(dispatcherPath);
          if (rd == null) {
          throw new ServletException(
          "Could not get RequestDispatcher for [" + getUrl() + "]: check that this file exists within your WAR");
          }

          // 決定使用RequestDispatcher的include方法還是forward方法
          if (useInclude(requestToExpose, response)) {
          response.setContentType(getContentType());
          if (logger.isDebugEnabled()) {
          logger.debug("Including resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'");
          }
          rd.include(requestToExpose, response);
          }

          else {
          // Note: The forwarded resource is supposed to determine the content type itself.
          exposeForwardRequestAttributes(requestToExpose);
          if (logger.isDebugEnabled()) {
          logger.debug("Forwarding to resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'");
          }
          rd.forward(requestToExpose, response);
          }
          }
          可以看到InternalResourceView對(duì)請(qǐng)求進(jìn)行了轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)到url上。最后我們看看JSTLView的實(shí)現(xiàn):

           
          public class JstlView extends InternalResourceView {
          
              private MessageSource messageSource;
          
              public JstlView() {
              }
          
              
              public JstlView(String url) {
                  super(url);
              }
          
              public JstlView(String url, MessageSource messageSource) {
                  this(url);
                  this.messageSource = messageSource;
              }
          
              protected void initServletContext(ServletContext servletContext) {
                  if (this.messageSource != null) {
                      this.messageSource = JstlUtils.getJstlAwareMessageSource(servletContext, this.messageSource);
                  }
                  super.initServletContext(servletContext);
              }
          
              protected void exposeHelpers(HttpServletRequest request) throws Exception {
                  if (this.messageSource != null) {
                      JstlUtils.exposeLocalizationContext(request, this.messageSource);
                  }
                  else {
                      JstlUtils.exposeLocalizationContext(new RequestContext(request, getServletContext()));
                  }
              }
          
          }

           

          在InternalResourceView  中,基本上所有的處理都差不多了。在JSTLView對(duì)兩個(gè)方法進(jìn)行了覆蓋。第一個(gè)initServletContext,主要初始化了MessageResource

          第二個(gè)exposeHelpers將messageSource放在了request里面。

          這樣view的解析就結(jié)束了。接下來(lái)容器對(duì)jsp進(jìn)行解析,并進(jìn)行tag等的處理。然后將生成的頁(yè)面返回給客戶端。

          posted @ 2009-11-26 13:25 追求無(wú)止境 閱讀(8209) | 評(píng)論 (2)編輯 收藏

          SpringMVC web框架學(xué)習(xí) Controller 分析

          org.springframework.web.servlet.mvc.AbstractController (implements org.springframework.web.servlet.mvc.Controller)

          Spring MVC框架中的Controller對(duì)請(qǐng)求進(jìn)行處理:所有的Controller都實(shí)現(xiàn)接口Controller:

          public interface Controller { 
          
              /**
               * Process the request and return a ModelAndView object which the DispatcherServlet
               * will render. A <code>null</code> return value is not an error: It indicates that
               * this object completed request processing itself, thus there is no ModelAndView
               * to render.
               * @param request current HTTP request
               * @param response current HTTP response
               * @return a ModelAndView to render, or <code>null</code> if handled directly
               * @throws Exception in case of errors
               */
              ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; 
          
          }
          上面的doc表明Controller返回的modelandview可以使空,表明請(qǐng)求都是該函數(shù)中處理完成了,不需要modeland來(lái)進(jìn)行渲染。
           
          在繼續(xù)之前先介紹一個(gè)有用的工具類:WebUtils。用這個(gè)可以簡(jiǎn)化session,request的處理。具體的內(nèi)容可以參考文檔。
           
          Controller的第一個(gè)實(shí)現(xiàn)是:AbstractController。他是一個(gè)Abstract類,除了實(shí)現(xiàn)了Controller接口,它還繼承了WebContentGenerator。
           
          WebContentGenerator的作用是什么?參考文檔可以發(fā)現(xiàn),該類主要對(duì)Cache和Session進(jìn)行管理。
           
          cacheSeconds 指定內(nèi)容緩存的時(shí)間,默認(rèn)為1
          requireSession 是否需要會(huì)話,默認(rèn)支持
          supportedMethods 支持的方法,默認(rèn)是GET\post\Head
          useCacheControlHeader 指定是否使用http1.1的cache控制頭信息,默認(rèn)使用
          useCacheControlNoStore 指定是否設(shè)置http1.1的cache控制頭信息為no-store。默認(rèn)使用
          useExpiresHeader 指定是否使用http1.0的expire頭信息。默認(rèn)使用
          用戶可以對(duì)這些參數(shù)進(jìn)行測(cè)試,cache和expire信息涉及到了http協(xié)議信息,更多信息可以參考http協(xié)議文檔。這里不再說(shuō)明。
           
          再看AbstractController的代碼:
          public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
          throws Exception {

          // Delegate to WebContentGenerator for checking and preparing.
          checkAndPrepare(request, response, this instanceof LastModified);

          // Execute handleRequestInternal in synchronized block if required.
          if (this.synchronizeOnSession) {
          HttpSession session = request.getSession(false);
          if (session != null) {
          Object mutex = WebUtils.getSessionMutex(session);
          synchronized (mutex) {
          return handleRequestInternal(request, response);
          }
          }
          }
          return handleRequestInternal(request, response);
          }
          checkandPrepare的目的就是使用用于進(jìn)行的配置來(lái)對(duì)request進(jìn)行預(yù)處理和準(zhǔn)備。
          他會(huì)檢查支持的方法,和會(huì)話,然后應(yīng)用cache設(shè)置。
          如果需要session同步,就進(jìn)行同步處理。session同步應(yīng)用于有session的情況下。如果沒(méi)有session,session同步是沒(méi)有用的。
          AbstractController會(huì)調(diào)用handleRequestInternal方法進(jìn)行處理,繼承AbstractController的類需要實(shí)現(xiàn)該方法。
          下面我們?cè)倏纯?b>AbstractUrlViewController 的代碼實(shí)現(xiàn)和文檔,先看handleRequestInternal的實(shí)現(xiàn):

           
          /**
          * Retrieves the URL path to use for lookup and delegates to
          * {@link #getViewNameForRequest}.
          */
          protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
          String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
          String viewName = getViewNameForRequest(request);
          if (logger.isDebugEnabled()) {
          logger.debug("Returning view name '" + viewName + "' for lookup path [" + lookupPath + "]");
          }
          return new ModelAndView(viewName);
          }

          可以看到,它使用了getViewNameForRequest獲取需要的viewName。而getViewNameForRequest是一個(gè)抽象函數(shù),需要子類實(shí)現(xiàn)。lookupPath就是我們請(qǐng)求的URL中的一部分。如我們使用UrlFilenameViewController來(lái)進(jìn)行如下的配置:
          <bean name="/index.do" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"></bean>、
          09-11-25 11:56:06 - DEBUG [http-8200-1] - Returning view name 'index' for lookup path [/index.do]
          該Controller對(duì)/index.do解析成index,然后再通過(guò)viewResolver對(duì)index進(jìn)行擴(kuò)展為/jsp/index.jsp。從而找到該頁(yè)面。
          可以看到這個(gè)類的主要是用于對(duì)url進(jìn)行解析,然后轉(zhuǎn)到合適的頁(yè)面上,而在轉(zhuǎn)到這個(gè)頁(yè)面之前不需要進(jìn)行特別的處理。
          明白了該類的作用自然也就知道了UrlFilenameViewController的作用。這里不再進(jìn)行詳細(xì)分析。
           
           

          posted @ 2009-11-26 09:35 追求無(wú)止境 閱讀(4166) | 評(píng)論 (0)編輯 收藏

          Spring MVC 框架學(xué)習(xí)之AbstractFormController以及AbstractFormControll

          在看完BaseCommandController和AbstractCommandController之后,我們?cè)倏碆aseCommandController的另一個(gè)實(shí)現(xiàn)AbstractFormController,以及AbstractFormController的具體實(shí)現(xiàn)SimpleFormController。

          先看看AbstractFormController對(duì)handleRequestInternal的實(shí)現(xiàn):

          protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
          throws Exception {
          // Form submission or new form to show?
          if (isFormSubmission(request)) {
          // Fetch form object from HTTP session, bind, validate, process submission.
          try {
          Object command = getCommand(request);
          ServletRequestDataBinder binder = bindAndValidate(request, command);
          BindException errors = new BindException(binder.getBindingResult());
          return processFormSubmission(request, response, command, errors);
          }
          catch (HttpSessionRequiredException ex) {
          // Cannot submit a session form if no form object is in the session.
          if (logger.isDebugEnabled()) {
          logger.debug("Invalid submit detected: " + ex.getMessage());
          }
          return handleInvalidSubmit(request, response);
          }
          }
          else {
          // New form to show: render form view.
          return showNewForm(request, response);
          }
          }
          這個(gè)方法,首先判斷是不是Form提交,判斷方法是:
          protected boolean isFormSubmission(HttpServletRequest request) {
          return "POST".equals(request.getMethod());
          }
          如果是form提交的話,系統(tǒng)首先創(chuàng)建一個(gè)Command,然后對(duì)數(shù)據(jù)進(jìn)行綁定和驗(yàn)證,之后調(diào)用processFormSubmission方法。showNewForm則調(diào)用showForm。
          在AbstractFormController中里面有兩個(gè)抽象方法:

          protected abstract ModelAndView processFormSubmission(
          HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
          throws Exception;
          protected abstract ModelAndView showForm(
          HttpServletRequest request, HttpServletResponse response, BindException errors)
          throws Exception;



           

           

          好了,看完AbstractFormController之后,再看看SimpleFormController是如何實(shí)現(xiàn):

          protected ModelAndView processFormSubmission(
          HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
          throws Exception {

          if (errors.hasErrors()) {
          if (logger.isDebugEnabled()) {
          logger.debug("Data binding errors: " + errors.getErrorCount());
          }
          return showForm(request, response, errors);
          }
          else if (isFormChangeRequest(request, command)) {
          logger.debug("Detected form change request -> routing request to onFormChange");
          onFormChange(request, response, command, errors);
          return showForm(request, response, errors);
          }
          else {
          logger.debug("No errors -> processing submit");
          return onSubmit(request, response, command, errors);
          }
          }
          在上面的方法中,如果有錯(cuò)誤,調(diào)用showForm,來(lái)顯示form。沒(méi)有錯(cuò)誤的話,則調(diào)用onSubmit方法。
          protected final ModelAndView showForm(
          HttpServletRequest request, BindException errors, String viewName, Map controlModel)
          throws Exception {

          // In session form mode, re-expose form object as HTTP session attribute.
          // Re-binding is necessary for proper state handling in a cluster,
          // to notify other nodes of changes in the form object.
          if (isSessionForm()) {
          String formAttrName = getFormSessionAttributeName(request);
          if (logger.isDebugEnabled()) {
          logger.debug("Setting form session attribute [" + formAttrName + "] to: " + errors.getTarget());
          }
          request.getSession().setAttribute(formAttrName, errors.getTarget());
          }

          // Fetch errors model as starting point, containing form object under
          // "commandName", and corresponding Errors instance under internal key.
          Map model = errors.getModel();

          // Merge reference data into model, if any.
          Map referenceData = referenceData(request, errors.getTarget(), errors);
          if (referenceData != null) {
          model.putAll(referenceData);
          }

          // Merge control attributes into model, if any.
          if (controlModel != null) {
          model.putAll(controlModel);
          }

          // Trigger rendering of the specified view, using the final model.
          return new ModelAndView(viewName, model);
          }
          在showForm中,設(shè)置屬性,放在model中,然后在viewName進(jìn)行設(shè)置。
          FormController就是上面的過(guò)程。具體的執(zhí)行過(guò)程和詳細(xì)信息會(huì)在以后的博客中具體介紹。

          posted @ 2009-11-25 17:31 追求無(wú)止境 閱讀(2450) | 評(píng)論 (0)編輯 收藏

          Spring MVC 框架學(xué)習(xí)筆記之BaseCommandController和AbstractCommandController

           

          Spring的BaseCommandController繼承自AbstractController。在看BaseCommandController之前先看他的繼承類AbstractCommandController是如何實(shí)現(xiàn)

          AbstractController的handleInternalRequest方法的:

          protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
          throws Exception {
          Object command = getCommand(request);
          ServletRequestDataBinder binder = bindAndValidate(request, command);
          BindException errors = new BindException(binder.getBindingResult());
          return handle(request, response, command, errors);
          }
          

          getCommand就是BaseCommandController中的方法。

          protected Object getCommand(HttpServletRequest request) throws Exception {
          return createCommand();
          }
          protected final Object createCommand() throws Exception {
          if (this.commandClass == null) {
          throw new IllegalStateException("Cannot create command without commandClass being set - " +
          "either set commandClass or (in a form controller) override formBackingObject");
          }
          if (logger.isDebugEnabled()) {
          logger.debug("Creating new command of class [" + this.commandClass.getName() + "]");
          }
          return BeanUtils.instantiateClass(this.commandClass);
          }
          

          createCommand創(chuàng)建了一個(gè)CommandClass的對(duì)象。

          然后再看bindAndValidate方法:

          protected final ServletRequestDataBinder bindAndValidate(HttpServletRequest request, Object command)
          throws Exception {
          ServletRequestDataBinder binder = createBinder(request, command);
          BindException errors = new BindException(binder.getBindingResult());
          if (!suppressBinding(request)) {
          binder.bind(request);
          onBind(request, command, errors);
          if (this.validators != null && isValidateOnBinding() && !suppressValidation(request, command, errors)) {
          for (int i = 0; i < this.validators.length; i++) {
          ValidationUtils.invokeValidator(this.validators[i], command, errors);
          }
          }
          onBindAndValidate(request, command, errors);
          }
          return binder;
          }
          

          這個(gè)方法首先創(chuàng)建了 DataBinder對(duì)象,然后,獲取創(chuàng)建綁定對(duì)象時(shí)發(fā)生的錯(cuò)誤。報(bào)錯(cuò)在errors。接下來(lái)綁定對(duì)象,調(diào)用onBind處理綁定事件;接下來(lái)應(yīng)用Validator。然后調(diào)用onBindAndValidate來(lái)處理綁定和驗(yàn)證事件。最后返回binder。

          處理完之后調(diào)用handle方法進(jìn)行處理。

          綜上所述,AbstractCommandController具有兩個(gè)功能:

          1、將請(qǐng)求參數(shù)轉(zhuǎn)換為Command對(duì)象。在該Controller中,我們?cè)O(shè)置一個(gè)object對(duì)象。然后BaseCommandController將請(qǐng)求的參數(shù)進(jìn)行轉(zhuǎn)換。如果請(qǐng)求參數(shù)有value值,就會(huì)調(diào)用object的的setValue對(duì)象來(lái)設(shè)置對(duì)象里的值。如果請(qǐng)求參數(shù)中有address.city.就會(huì)調(diào)用object中g(shù)etAddress().setCity()方法來(lái)賦值。這個(gè)object可以是任意的object,唯一的要求就是這個(gè)object類沒(méi)有參數(shù)。

          2、對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證。在轉(zhuǎn)換和驗(yàn)證時(shí)發(fā)生錯(cuò)誤時(shí),需要在handle(request, response, command, errors)中進(jìn)行處理。

          posted @ 2009-11-25 16:25 追求無(wú)止境 閱讀(5384) | 評(píng)論 (0)編輯 收藏

          Spring的MVC web框架學(xué)習(xí)筆記

          1、Spring web 框架的核心:DispatcherServlet

          DispatcherServlet 用于接收請(qǐng)求。是使用Spring框架的入口。在web.xml中,需要配置該servlet。在配置該Servlet的時(shí)候url-pattern你可以使用你自己想使用的形式,如*.aspx,*.do,*.htm,*.action,用以混淆客戶端對(duì)服務(wù)器架構(gòu)的認(rèn)識(shí)。

          另外,該Servlet在容器中還會(huì)加載一個(gè)APPlicationContext的xml文件。默認(rèn)加載的是[servlet-name]-servlet.xml。例如,你在web.xml中配置的servlet如下:

          <web-app>
          <servlet>
          <servlet-name>example</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>
          <servlet-name>example</servlet-name>
          <url-pattern>*.form</url-pattern>
          </servlet-mapping>
          </web-app>
          
          該Servlet就會(huì)在服務(wù)器啟動(dòng)時(shí),加載example-servlet.xml。當(dāng)然,你也可以自己來(lái)指定加載文件。
          要看看DispatcherServlet真面目,打開源文件,發(fā)現(xiàn)定義了很多BeanName的常量,如本地化解析器beanname,主題解析器beanname,視圖解析器beanname,上傳文件解析的multipart解析器beanname。
          等:
          public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
          public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
          public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
          public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
          public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
          public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
          public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";
          public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
          
          這個(gè)類怎么使用這些bean呢?以上面的exexample-servlet.xml為例,我們定義的名字為example的DispatcherServlet使用example-servlet.xml的配置。在example-servlet.xml里,我們可以配置名字上面的beanName的bean,來(lái)讓servlet加載這些bean。
          這下明白了,servlet.xml該怎么配置,該配置什么了。
          好了,看完了最重要的servlet的配置問(wèn)題,我們?cè)倏聪乱粋€(gè)重要的接口:Controller。至于上面servlet要使用的什么什么解析器啦,我們稍后在分析。
           
          2、Controller
          我們的請(qǐng)求提交到DispacherServlet后,會(huì)轉(zhuǎn)給Controller。怎么找Controller?通過(guò)使用handlerMapping。如果沒(méi)有設(shè)置handlerMapping,spring使用默認(rèn)的BeanNameUrlHandlerMapping來(lái)找Controller。
          BeanNameUrlHandlerMapping?顧名思義,就是通過(guò)bean的name屬性來(lái)映射controller。bean的name請(qǐng)求是一個(gè)url,如果請(qǐng)求的是logout.do,在example-servlet.xml中定義一個(gè)名字(name)為login.do的Controller.

          <bean name="/logout.do" class="com.jy.bookshop.web.spring.LogoutController">
              </bean>

          再插一句話,在handlerMapping中,我們可以使用請(qǐng)求攔截器來(lái)對(duì)請(qǐng)求進(jìn)行攔截處理。該攔截器怎么使用這里暫且不表,有機(jī)會(huì)再討論。

          ok,現(xiàn)在我們創(chuàng)建一個(gè)LogoutController來(lái)讓他處理請(qǐng)求,讓他實(shí)現(xiàn)Controller吧:

          public class LogOutController implements Controller {
              public ModelAndView handleRequest(HttpServletRequest req,
                      HttpServletResponse res) throws Exception {
                    …
                  return new ModelAndView(new RedirectView("login.do"));
              }
          }
          看看這個(gè)Controller接口的定義,發(fā)現(xiàn)這個(gè)接口只定義了一個(gè)handleRequest方法。在這個(gè)方法中,返回一個(gè)ModelAndView。
          先說(shuō)ModelAndView。我們知道MVC,那么ModelAndView就是 MV了。Controller就是C。這樣MVC全了。呵呵。
          繼續(xù)說(shuō)ModelAndView,要了解他的結(jié)構(gòu),那自然要看看他的源代碼了:
          /** View instance or view name String */
          private Object view; 
          
          /** Model Map */
          private ModelMap model;
          

             

              只關(guān)注我們關(guān)注的,里面包含了一個(gè)View對(duì)象和model對(duì)象。model對(duì)象是一個(gè)Map,這里不再說(shuō)了。關(guān)鍵看看view,奇怪,怎么是一個(gè)Object,太抽象了。再繼續(xù)看源代碼的話,會(huì)更加明白:

           

          public ModelAndView(String viewName, String modelName, Object modelObject) {
                  this.view = viewName;
                  addObject(modelName, modelObject);
              }
          public void setViewName(String viewName) {
                  this.view = viewName;
              }

          原來(lái)這個(gè)view可以指向一個(gè)View對(duì)象,也可以指向String對(duì)象啊。View一個(gè)接口,如果看doc的話,他的實(shí)現(xiàn)類有AbstractExcelView, AbstractJasperReportsSingleFormatView, AbstractJasperReportsView, AbstractJExcelView, AbstractPdfStamperView, AbstractPdfView,AbstractTemplateView, AbstractUrlBasedView, AbstractView, AbstractXsltView, ConfigurableJasperReportsView, FreeMarkerView, InternalResourceView,JasperReportsCsvView, JasperReportsHtmlView, JasperReportsMultiFormatView, JasperReportsPdfView, JasperReportsXlsView, JstlView, RedirectView,TilesJstlView, TilesView, TilesView, VelocityLayoutView, VelocityToolboxView, VelocityView, XsltView(誠(chéng)實(shí)的說(shuō),這些View是拷doc的)。

          現(xiàn)在可以知道,我們的Controller返回一個(gè)View和Model,來(lái)讓Spring框架來(lái)創(chuàng)建一個(gè)回應(yīng)。

          現(xiàn)在奇怪的還有一點(diǎn),我吧view設(shè)置為字符串,Spring框架怎么處理?在ModelAndView中,如果view是一個(gè)字符串,則會(huì)將這個(gè)值交給DispatcherServlet的viewResovler來(lái)處理。記得上面提到的viewResovler了嗎?呵呵,派上用場(chǎng)了。

          view的問(wèn)題解決了,然后再說(shuō)model吧。在ModelAndView添加了一些對(duì)象,Spring是怎么處理的呢?總應(yīng)該把這些對(duì)象給弄到request對(duì)象里,讓jsp頁(yè)面來(lái)使用吧。讓View使用?那么看看View接口吧:

          public interface View {
          
              String getContentType();
          
              void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception;
          
          }
          render函數(shù)需要帶一個(gè)model變量。再找找view的實(shí)現(xiàn)類,看看是怎么工作的。不過(guò)view有那么多,對(duì)于一些像什么pdf啦,excel了他們都不需要在request中添加這個(gè)model。
          最終呢,我們?cè)趈stlView的父類InternalResourceView中的renderMergedOutputModel函數(shù)發(fā)現(xiàn)他把model放在了request里面了。
           
          OK,現(xiàn)在我們明白了,controller返回的modelandview交給Servlet進(jìn)行處理,來(lái)生成一個(gè)頁(yè)面。
          最簡(jiǎn)單的Controller介紹完畢。現(xiàn)在看看Spring提供的一些controller的實(shí)現(xiàn),Spring提供了很多controller的實(shí)現(xiàn),繼承的結(jié)構(gòu)如下:

           

          org.springframework.web.servlet.mvc.AbstractController (implements org.springframework.web.servlet.mvc.Controller)

          • org.springframework.web.servlet.mvc.AbstractUrlViewController
            • org.springframework.web.servlet.mvc.UrlFilenameViewController
          • org.springframework.web.servlet.mvc.BaseCommandController
            • org.springframework.web.servlet.mvc.AbstractCommandController
            • org.springframework.web.servlet.mvc.AbstractFormController
              • org.springframework.web.servlet.mvc.AbstractWizardFormController
              • org.springframework.web.servlet.mvc.SimpleFormController
                • org.springframework.web.servlet.mvc.CancellableFormController
          • org.springframework.web.servlet.mvc.ParameterizableViewController
          • org.springframework.web.servlet.mvc.ServletForwardingController (implements org.springframework.beans.factory.BeanNameAware)
          • org.springframework.web.servlet.mvc.ServletWrappingController (implements org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.DisposableBean, org.springframework.beans.factory.InitializingBean)
            AbstractController是Controller的第一個(gè)實(shí)現(xiàn)。其他的Controller都是繼承這個(gè)Controller的。我們先看比較重要的Controller。
            先說(shuō)UrlFilenameViewController。不如我們自己來(lái)部署一個(gè)吧。
            在example-servlet.xml中增加如下的配置:

            <bean name="/error.do"  class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
                </bean>

            OK,當(dāng)/error.do的請(qǐng)求上來(lái)后,urlFileNameViewController將他變成/error。然后返回個(gè)View,這個(gè)view的name就是/error,然后使用viewresolver來(lái)進(jìn)行解析,可以解析成/jsp/error.jsp。
            另外還有比較重要的controller是baseCommandController,將請(qǐng)求參數(shù)轉(zhuǎn)換為一個(gè)對(duì)象,并對(duì)對(duì)象參數(shù)合法性進(jìn)行驗(yàn)證。另外,SimpleFormController可以對(duì)表單進(jìn)行處理。
            關(guān)于各個(gè)controller的分析。未完待續(xù)。。

             

             

             

            posted @ 2009-11-25 11:09 追求無(wú)止境 閱讀(3716) | 評(píng)論 (2)編輯 收藏

            [轉(zhuǎn)] java.beans.PropertyEditor(屬性編輯器)簡(jiǎn)單應(yīng)用

            原文:http://www.aygfsteel.com/orangewhy/archive/2007/06/26/126371.html

            java.beans.PropertyEditor的從字義來(lái)看是一個(gè)屬性編輯器,但總覺(jué)得它的作用更像一個(gè)轉(zhuǎn)換器--從字符串轉(zhuǎn)換為類對(duì)象的屬性。

            java.beans.PropertyEditor接口定義的方法有好幾個(gè),但是最重要為下面兩個(gè):

             void setValue(Object value)

             void setAsText(String text) throws java.lang.IllegalArgumentException;

            一般地,我們要使用PropertyEditor時(shí),并不直接實(shí)現(xiàn)此接口,而是通過(guò)繼承實(shí)現(xiàn)此接口的java.beans.PropertyEditorSupport來(lái)簡(jiǎn)化我們的工作,在子類覆蓋setAsText方法就可以了,setValue方法一般不直接使用,在setAsText方法中將字符串進(jìn)行轉(zhuǎn)換并產(chǎn)生目標(biāo)對(duì)象以后,由調(diào)setAsText調(diào)用setValue來(lái)把目標(biāo)對(duì)象注入到編輯器中。當(dāng)然,你可用覆蓋更多的方法來(lái)滿足你的特殊要求。JavaBean的類和接口,被大部分spring包使用,可以從spring中學(xué)習(xí)更成熟的JavaBean使用方法。

            簡(jiǎn)單的例子:

            實(shí)體類Person:

            public class Person
            {
                
            private String name;
                
            private String sex;
                
            private int age;
                
                
            public Person(String name, String sex, int age)
                
            {
                    
            this.name = name;
                    
            this.sex = sex;
                    
            this.age = age;
                }

                
                
            public int getAge()
                
            {
                    
            return age;
                }

                
            public void setAge(int age)
                
            {
                    
            this.age = age;
                }

                
            public String getName()
                
            {
                    
            return name;
                }

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

                
            public String getSex()
                
            {
                    
            return sex;
                }

                
            public void setSex(String sex)
                
            {
                    
            this.sex = sex;
                }

                
                @Override
                
            public String toString()
                
            {
                    
            return "Person["+name+""+sex+""+age+"]";
                }

            }

             

            Person的屬性編輯器:

            public class PersonPropertyEditor extends PropertyEditorSupport
            {
                
            public void setAsText(String text)
                
            {
                    setValue(parseString(text));
                }


                
            private Object parseString(String text)
                
            {
                    String[] parts 
            = tokenizeToStringArray(text, ""falsefalse);
                    String name 
            = (parts.length > 0 ? parts[0] : "undefine");
                    String sex 
            = (parts.length > 1 ? parts[1] : "undefine");
                    
            int age = (parts.length > 2 ? Integer.valueOf(parts[2]) : 0);
                    
            return (text.length() > 0 ? new Person(name, sex, age) : null);
                }


                
            private  String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens,
                                                                
            boolean ignoreEmptyTokens)
                
            {
                    StringTokenizer st 
            = new StringTokenizer(str, delimiters);
                    List tokens 
            = new ArrayList();
                    
            while(st.hasMoreTokens())
                    
            {
                        String token 
            = st.nextToken();
                        
            if(trimTokens)
                        
            {
                            token 
            = token.trim();
                        }

                        
            if(!ignoreEmptyTokens || token.length() > 0)
                        
            {
                            tokens.add(token);
                        }

                    }

                    
            return toStringArray(tokens);
                }


                
            private  String[] toStringArray(Collection collection)
                
            {
                    
            if(collection == null)
                    
            {
                        
            return null;
                    }

                    
            return (String[])collection.toArray(new String[collection.size()]);
                }

            }

             

            測(cè)試代碼:

                public static void main(String[] args)
                
            {
                    PersonPropertyEditor editor 
            = new PersonPropertyEditor();
                    editor.setAsText(
            "aSam,man,22");
                    System.out.println(editor.getValue());
                }

             

            結(jié)果輸出:

            Person[aSam, man, 22]

            posted @ 2009-11-20 22:07 追求無(wú)止境 閱讀(296) | 評(píng)論 (0)編輯 收藏

            提高開發(fā)技術(shù)的Tip

             

              以下Tip和學(xué)習(xí)路線從自己身上出發(fā)進(jìn)行總結(jié),僅代表個(gè)人觀點(diǎn)。你可以留言進(jìn)行討論。

            1.有計(jì)劃的學(xué)習(xí)

                   學(xué)習(xí)是一個(gè)循序漸進(jìn)的過(guò)程。如果沒(méi)有一個(gè)計(jì)劃,學(xué)習(xí)將變得沒(méi)有規(guī)律,我們也無(wú)法提高自己的能力。想起上學(xué)的時(shí)候,學(xué)校每個(gè)學(xué)期都會(huì)制定一個(gè)教學(xué)大綱來(lái)指導(dǎo)老師的教學(xué)和我們的學(xué)習(xí)。是的,如果沒(méi)有計(jì)劃,今天突然想學(xué)這個(gè),明天突然想學(xué)那個(gè),朝三暮四,我們永遠(yuǎn)也無(wú)法學(xué)到自己想學(xué)的東西。所以我們需要制定一個(gè)學(xué)習(xí)計(jì)劃。有計(jì)劃的學(xué)習(xí)才能提高自己的能力。Java web項(xiàng)目的開發(fā)是需要很多知識(shí)的積累的,包括Java SE,數(shù)據(jù)庫(kù),JDBC,Linux,Log4j,Html/CSS/Javascript,持久層框架,JUNIT及其他測(cè)試框架,IOC框架,web MVC框架等等,如果我們沒(méi)有一個(gè)良好的計(jì)劃,今天學(xué)習(xí)Log4j,明天學(xué)習(xí)Junit,這些東西都不會(huì)掌握好并學(xué)習(xí)好。

                  如果給自己做計(jì)劃。計(jì)劃可以按照時(shí)間段來(lái)進(jìn)行。例如本年度的工作,本季度要達(dá)到的水平,本月要學(xué)習(xí)的東西,本周學(xué)習(xí)的計(jì)劃安排,以及每一天的安排。每天晚上睡覺(jué)前,想想今天的計(jì)劃安排是否完成,明天該學(xué)習(xí)什么;每周到結(jié)束的時(shí)候,總結(jié)一下本周完成了什么,下周要學(xué)習(xí)什么。根據(jù)自己對(duì)計(jì)劃的實(shí)行情況可以改變自己的計(jì)劃。總之要有計(jì)劃的學(xué)習(xí)。可以使用google 日歷和 qq mail 郵箱等來(lái)管理自己的計(jì)劃。

            2. 同一段時(shí)間只學(xué)習(xí)一種技術(shù)  

                   我是一個(gè)什么都想學(xué)的人。我不想把自己的時(shí)間都用在學(xué)習(xí)Java上,我還想學(xué)習(xí)C++,還想學(xué)習(xí) web 設(shè)計(jì),還想學(xué)好windows編程,想學(xué)Linux編程,想學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)編程,想學(xué)習(xí)路由器、網(wǎng)絡(luò)的配置……。于是,今天看了VC++深入詳解,明天學(xué)習(xí)Linux shell編程。計(jì)算機(jī)技術(shù)包含了太多技術(shù)。我們無(wú)法一一將他們都掌握。所以不要想什么都學(xué)會(huì)。至少在一段時(shí)間內(nèi)學(xué)習(xí)一種技術(shù)。我給自己制定了這樣的計(jì)劃,今年要把所有的精力都致力為 java EE 開發(fā)技術(shù)上。一年后,努力學(xué)習(xí)C/C++編程。

                  是的。我們學(xué)習(xí)的東西可以廣一點(diǎn),但一定要有自己專的方面。學(xué)專了一個(gè)方面,你就可以接著學(xué)習(xí)其他的技術(shù)。一個(gè)什么都會(huì)的人,很可能什么都不會(huì);所以,精于一,而博于廣。

            3.學(xué)會(huì)休息

                 我們都很忙,上學(xué)的時(shí)候?qū)W好各科,至少不能掛科,然后在課外學(xué)習(xí)自己喜歡的java 編程;工作的時(shí)候,需要做好工作,然后在工作之余多學(xué)一些東西;時(shí)間長(zhǎng)了,我們就可能倦了,累了。所以我們需要學(xué)會(huì)休息來(lái)改變自己的精神狀態(tài)。

                 整天在電腦前進(jìn)行軟件開發(fā)的我們,要學(xué)會(huì)放松自己和休息。作為程序員整天在電腦前,極容易養(yǎng)成工作和休息都離不開電腦的習(xí)慣。休息的時(shí)候,也是在電腦前看電影,玩游戲。我想,在我們工作累了之后,應(yīng)該離開電腦,走向戶外來(lái)放松和休息。或到大街上轉(zhuǎn)轉(zhuǎn),或到商場(chǎng)里購(gòu)物,或去游泳館游泳,或去健身房健身,或和朋友一起打臺(tái)球。等等等等。總之要學(xué)會(huì)放松自己,走出戶外,不要整天在電腦前。

                 以上3點(diǎn)是自己對(duì)自己工作學(xué)習(xí)的總結(jié)和提醒,特別寫出來(lái)和大家一起分享。


              感謝HiMagic!分享自己的觀點(diǎn)。值得學(xué)習(xí)。

            提高開發(fā)技術(shù)->如何學(xué)習(xí),這個(gè)轉(zhuǎn)換并不完全對(duì)等。對(duì)于學(xué)習(xí)來(lái)說(shuō),最重要的不是計(jì)劃和過(guò)程,而是結(jié)果,沒(méi)有成果的學(xué)習(xí)等于白費(fèi)時(shí)間。對(duì)于提高技術(shù)來(lái)說(shuō),必須要有笑傲江湖唯我獨(dú)尊的氣勢(shì),以及持之以恒的定力。
            2009-11-17 08:54 | HiMagic!


            感謝CoderCream分享自己的觀點(diǎn),沒(méi)錯(cuò),執(zhí)行和結(jié)果更加重要!

            posted @ 2009-11-16 15:11 追求無(wú)止境 閱讀(1778) | 評(píng)論 (6)編輯 收藏

            Java DOC學(xué)習(xí)筆記

            1、Interface Comparable<T>

            只有實(shí)現(xiàn)該接口的對(duì)象的列表或數(shù)組才能調(diào)用Collections.sort()方法。

            在實(shí)現(xiàn) int compareTo(T o)時(shí),需要注意:

            1、如果兩個(gè)對(duì)象相等,返回為0;

            2、如果同一個(gè)null對(duì)象進(jìn)行比較,應(yīng)拋出NullPointerException。

            3、實(shí)現(xiàn)必須保證sgn(x.compareTo(y)) == -sgn(y.compareTo(x))、(x.compareTo(y)==0) == (x.equals(y)) 、(x.compareTo(y)>0 && y.compareTo(z)>0) impliesx.compareTo(z)>0 。如果 x.compareTo(y)拋出異常,y.compareTo(x)也必須拋出異常。

            2、Interface Iterable<T>

            Iterator<T> iterator()

            對(duì)于鏈表等對(duì)象應(yīng)實(shí)現(xiàn)該接口來(lái)允許一個(gè)對(duì)象可以使用foreach語(yǔ)句。

            上面的方法返回java.util.Interface Iterator<E>,該接口的主要方法有:

            hasNext();next();remove();

            3、Interface Readable

            java.lang.Interface Readable

                  一個(gè)Readable 是一個(gè)字符串的來(lái)源。實(shí)現(xiàn)這個(gè)接口需要實(shí)現(xiàn)的方法是:

            int read(CharBuffer cb)

            4、java.lang  Interface Runnable

            不用說(shuō),這個(gè)誰(shuí)都知道。如果想在一個(gè)單獨(dú)的線程中執(zhí)行,就需要實(shí)現(xiàn)這個(gè)接口。

            5、java.lang Interface Thread.UncaughtExceptionHandler

                   從名字就可以判斷出來(lái),當(dāng)線程拋出未捕獲的異常時(shí),實(shí)現(xiàn)這個(gè)接口的類的對(duì)象可以對(duì)一場(chǎng)進(jìn)行處理。

                  官方文檔:當(dāng)線程被一個(gè)未捕獲的異常打斷時(shí),這個(gè)接口被調(diào)用。

                  當(dāng)線程要被為捕獲異常打斷是,JVM使用Thread.getUncaughtExceptionHandler(),查詢異常處理器,如果線程沒(méi)有這個(gè)接口的設(shè)置,則查詢?cè)摼€程的ThreadGroup的UncaughtExceptionHandler,如果縣城沒(méi)有處理異常,他就會(huì)拋出這個(gè)異常。

            void uncaughtException(Thread t, Throwable e)
                      Method invoked when the given thread terminates due to the given uncaught exception.

            6、包裝型對(duì)象:Boolean Byte Character Double Float Long Short Integer

                這些類就不用了說(shuō)了,主要會(huì)使用里面的靜態(tài)方法和一些常量就可以了。

            7、Class Character.Subset

               這個(gè)類的實(shí)例代表了Unicode字符集的特殊的子集。定義在Character中的唯一子集族類是UnicodeBlock.其他的Java API或許因?yàn)樽约旱挠脩舳x了其他的子集。

            static Character.UnicodeBlock
            AEGEAN_NUMBERS
                      Constant for the "Aegean Numbers" Unicode character block.

            static Character.UnicodeBlock
            ALPHABETIC_PRESENTATION_FORMS
                      Constant for the "Alphabetic Presentation Forms" Unicode character block.

            static Character.UnicodeBlock
            ARABIC
                      Constant for the "Arabic" Unicode character block.

            static Character.UnicodeBlock
            ARABIC_PRESENTATION_FORMS_A
                      Constant for the "Arabic Presentation Forms-A" Unicode character block.

            static Character.UnicodeBlock
            ARABIC_PRESENTATION_FORMS_B
                      Constant for the "Arabic Presentation Forms-B" Unicode character block.

            static Character.UnicodeBlock
            ARMENIAN
                      Constant for the "Armenian" Unicode character block.

            static Character.UnicodeBlock
            ARROWS
                      Constant for the "Arrows" Unicode character block.

            static Character.UnicodeBlock
            BASIC_LATIN
                      Constant for the "Basic Latin" Unicode character block.

            static Character.UnicodeBlock
            BENGALI
                      Constant for the "Bengali" Unicode character block.

            static Character.UnicodeBlock
            BLOCK_ELEMENTS
                      Constant for the "Block Elements" Unicode character block.

            static Character.UnicodeBlock
            BOPOMOFO
                      Constant for the "Bopomofo" Unicode character block.

            static Character.UnicodeBlock
            BOPOMOFO_EXTENDED
                      Constant for the "Bopomofo Extended" Unicode character block.

            static Character.UnicodeBlock
            BOX_DRAWING
                      Constant for the "Box Drawing" Unicode character block.

            …………

            具體參見(jiàn)java.lang
            Class Character.UnicodeBlock里面的定義。

            8 、java.langClass Class<T>

            這個(gè)類的實(shí)力代表了Java運(yùn)行程序中的類和接口。Enum是類,而Annotation是一個(gè)接口。Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions.

            Class的對(duì)象在程序中可以獲取類的詳細(xì)信息。

            9、Java.lang.Class ClassLoader

            ClassLoader是個(gè)不錯(cuò)的東西,下面是官方文檔的簡(jiǎn)單翻譯和注解:

            1、ClassLoader用于加載類對(duì)象。ClassLoader是一個(gè)抽象類。給出類的二進(jìn)制名字(如“

              "java.lang.String"
               "javax.swing.JSpinner$DefaultEditor"
               "java.security.KeyStore$Builder$FileBuilder$1"
               "java.net.URLClassLoader$3$1"

            ”),ClassLoader會(huì)使用定位和生成類。一個(gè)典型的策略就是將二進(jìn)制名字轉(zhuǎn)化為文件名,然后從文件系統(tǒng)中讀取這個(gè)類文件。

            每一個(gè)Class對(duì)象都包含了一個(gè)創(chuàng)建它的引用。

            數(shù)組的Class對(duì)象不能由ClassLoader創(chuàng)建,但是可以由Java運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建。一個(gè)數(shù)組類的ClassLoader,和他的元素的ClassLoader是一樣的;如果元素是基本類型,則數(shù)組類沒(méi)有ClassLoader。

            應(yīng)用程序可以實(shí)現(xiàn)ClassLoader的子類,來(lái)擴(kuò)展行為。這樣可以在JVM動(dòng)態(tài)的創(chuàng)建類。

            ClassLoader主要由安全管理器來(lái)使用,用于保證安全區(qū)域。

            ClassLoader 使用一個(gè)delegation(委托)模型來(lái)搜索類和資源。每一個(gè)ClassLoader有一個(gè)相關(guān)的父類ClassLoader。當(dāng)請(qǐng)求來(lái)查找一個(gè)資源或者類的時(shí)候,ClassLoader 實(shí)例會(huì)委托搜索類和資源。

            內(nèi)建的ClassLoader,叫做bootstrap class loader,沒(méi)有父類。

            正常的,ClassLoader從本地文件系統(tǒng)中加載數(shù)據(jù)。通過(guò)CLassPath。

            當(dāng)然,也可以通過(guò)NetWork從服務(wù)器上下載字節(jié)碼。來(lái)加載類:

            ClassLoader loader = new NetworkClassLoader(host, port);
            Object main = loader.loadClass("Main", true).newInstance();
            Network ClassLoader 子類必須定義方法FindClass 和loadClassData來(lái)加載來(lái)自互聯(lián)網(wǎng)上的類。一旦或得到字節(jié)碼,它使用defineClass方法來(lái)創(chuàng)建類實(shí)例。
            class NetworkClassLoader extends ClassLoader {
                     String host;
                     int port;
            
                     public Class findClass(String name) {
                         byte[] b = loadClassData(name);
                         return defineClass(name, b, 0, b.length);
                     }
            
                     private byte[] loadClassData(String name) {
                         // load the class data from the connection  . . .
                     }
                 }

            個(gè)人理解:

            ClassLoader是一個(gè)類加載器,除了可以從ClassPath加載類之外,還可以從ClassPath中加載資源:

            InputStream
            getResourceAsStream(String name)
                      Returns an input stream for reading the specified resource.

            Enumeration<URL>
            getResources(String name)
                      Finds all the resources with the given name.

            static URL
            getSystemResource(String name)
                      Find a resource of the specified name from the search path used to load classes.

            static InputStream
            getSystemResourceAsStream(String name)
                      Open for reading, a resource of the specified name from the search path used to load classes.

            static Enumeration<URL>
            getSystemResources(String name)
                      Finds all resources of the specified name from the search path used to load classes.

            protected  Class<?>
            findClass(String name)
                      Finds the class with the specified binary name.

            10、Compiler類3

            編譯類是提供給支持Java到本地代碼編譯器和相關(guān)服務(wù)。根據(jù)設(shè)計(jì),編譯器類什么都不做;它作為一個(gè)占位符來(lái)為運(yùn)行時(shí)編譯執(zhí)行的技術(shù)。

            當(dāng)JVM第一次啟動(dòng)時(shí),他判斷java.compiler是否存在。如果存在,他3

            posted @ 2009-11-16 13:11 追求無(wú)止境 閱讀(145) | 評(píng)論 (0)編輯 收藏

            CSS學(xué)習(xí)筆記


            1、background相關(guān):

            屬性
            描述

            background
            簡(jiǎn)寫屬性,作用是將背景屬性設(shè)置在一個(gè)聲明中。

            background-attachment
            背景圖像是否固定或者隨著頁(yè)面的其余部分滾動(dòng)。

            background-color
            設(shè)置元素的背景顏色。

            background-image
            把圖像設(shè)置為背景。

            background-position
            設(shè)置背景圖像的起始位置。

            background-repeat
            設(shè)置背景圖像是否及如何重復(fù)。

            (1)background

            background-color:


            描述

            color_name
            規(guī)定顏色值為顏色名稱的背景顏色(比如 red)。

            hex_number
            規(guī)定顏色值為十六進(jìn)制值的背景顏色(比如 #ff0000)。

            rgb_number
            規(guī)定顏色值為 rgb 代碼的背景顏色(比如 rgb(255,0,0))。

            transparent
            默認(rèn)。背景顏色為透明。

            inherit
            規(guī)定應(yīng)該從父元素繼承 background-color 屬性的設(shè)置。

            background-image :


            描述

            url('URL')
            指向圖像的路徑。

            none
            默認(rèn)值。不顯示背景圖像。

            inherit
            規(guī)定應(yīng)該從父元素繼承 background-image 屬性的設(shè)置。

            background-repeat :

            repeat

            默認(rèn)。背景圖像將在垂直方向和水平方向重復(fù)。

            repeat-x

            背景圖像將在水平方向重復(fù)。

            repeat-y

            背景圖像將在垂直方向重復(fù)。

            no-repeat

            背景圖像將僅顯示一次。

            background-position :center top buttom right left XX% XX%


            描述

            • top left
            • top center
            • top right
            • center left
            • center center
            • center right
            • bottom left
            • bottom center
            • bottom right

            如果您僅規(guī)定了一個(gè)關(guān)鍵詞,那么第二個(gè)值將是"center"。

            默認(rèn)值:0% 0%。

            x% y%

            第一個(gè)值是水平位置,第二個(gè)值是垂直位置。

            左上角是 0% 0%。右下角是 100% 100%。

            如果您僅規(guī)定了一個(gè)值,另一個(gè)值將是 50%。

            xpos ypos

            第一個(gè)值是水平位置,第二個(gè)值是垂直位置。

            左上角是 0 0。單位是像素 (0px 0px) 或任何其他的 CSS 單位。

            如果您僅規(guī)定了一個(gè)值,另一個(gè)值將是50%。

            您可以混合使用 % 和 position 值。

            background-attachment: fixed

             


            2、文本相關(guān)

            text-indent :縮進(jìn)元素中的首行文本。


            描述

            length
            定義固定的縮進(jìn)。默認(rèn)值:0。

            %
            定義基于父元素寬度的百分比的縮進(jìn)。

            text-align: 文本對(duì)應(yīng)方式

            您可能會(huì)認(rèn)為 text-align:center 與 <CENTER> 元素的作用一樣,但實(shí)際上二者大不相同。

            <CENTER> 不僅影響文本,還會(huì)把整個(gè)元素居中。text-align 不會(huì)控制元素的對(duì)齊,而只影響內(nèi)部?jī)?nèi)容。元素本身不會(huì)從一段移到另一端,只是其中的文本受影響。


            描述

            left
            把文本排列到左邊。默認(rèn)值:由瀏覽器決定。

            right
            把文本排列到右邊。

            center
            把文本排列到中間。

            justify
            實(shí)現(xiàn)兩端對(duì)齊文本效果。

            word-spacing :以改變字(單詞)之間的標(biāo)準(zhǔn)間隔


            描述

            normal
            默認(rèn)。定義單詞間的標(biāo)準(zhǔn)空間。

            length
            定義單詞間的固定空間。

            letter-spacing:改變字母之間的距離


            描述

            normal
            默認(rèn)。定義字符間的標(biāo)準(zhǔn)空間。

            length
            定義字符間的固定空間。

            text-transform:處理文本的大小寫


            描述

            none
            默認(rèn)。定義帶有小寫字母和大寫字母的標(biāo)準(zhǔn)的文本。

            capitalize
            文本中的每個(gè)單詞以大寫字母開頭。

            uppercase
            定義僅有大寫字母。

            lowercase
            定義無(wú)大寫字母,僅有小寫字母。

            text-decoration


            描述

            none
            默認(rèn)。定義標(biāo)準(zhǔn)的文本。

            underline
            定義文本下的一條線。

            overline
            定義文本上的一條線。

            line-through
            定義穿過(guò)文本下的一條線。

            blink
            定義閃爍的文本(無(wú)法運(yùn)行在 IE 和 Opera 中)。

            white-space


            描述

            normal
            默認(rèn)。空白會(huì)被瀏覽器忽略。

            pre
            空白會(huì)被瀏覽器保留。其行為方式類似 HTML 中的 <pre> 標(biāo)簽。

            nowrap
            文本不會(huì)換行,文本會(huì)在在同一行上繼續(xù),直到遇到 <br> 標(biāo)簽為止。

            pre-wrap
            保留空白符序列,但是正常地進(jìn)行換行。

            pre-line
            合并空白符序列,但是保留換行符。

             

            空白 換行 自動(dòng)換行
            pre-line 合并 保留 允許
            normal 合并 忽略 允許
            nowrap 合并 忽略 不允許
            pre 保留 保留 不允許

            pre-wrap

            保留

            保留

            允許

            direction :文本的方向?qū)傩?/p>

            ltr
            默認(rèn)。文本方向從左到右。

            rtl
            文本方向從右到左。

            屬性
            描述

            color
            設(shè)置文本顏色

            direction
            設(shè)置文本方向。

            line-height
            設(shè)置行高。

            letter-spacing
            設(shè)置字符間距。

            text-align
            對(duì)齊元素中的文本。

            text-decoration
            向文本添加修飾。

            text-indent
            縮進(jìn)元素中文本的首行。

            text-shadow
            設(shè)置文本陰影。CSS2 包含該屬性,但是 CSS2.1 沒(méi)有保留該屬性。

            text-transform
            控制元素中的字母。

            unicode-bidi
            設(shè)置文本方向。

            white-space
            設(shè)置元素中空白的處理方式。

            word-spacing
            設(shè)置字間距。


            3、CSS字體相關(guān)

            font
            簡(jiǎn)寫屬性。作用是把所有針對(duì)字體的屬性設(shè)置在一個(gè)聲明中。

            font-family
            設(shè)置字體系列。

            font-size
            設(shè)置字體的尺寸。

            font-size-adjust
            當(dāng)首選字體不可用時(shí),對(duì)替換字體進(jìn)行智能縮放。(CSS2.1 已刪除該屬性。)

            font-stretch
            對(duì)字體進(jìn)行水平拉伸。(CSS2.1 已刪除該屬性。)

            font-style
            設(shè)置字體風(fēng)格。

            font-variant
            以小型大寫字體或者正常字體顯示文本。

            font-weight
            設(shè)置字體的粗細(xì)。


            CSS 列表屬性(list)

            屬性
            描述

            list-style
            簡(jiǎn)寫屬性。用于把所有用于列表的屬性設(shè)置于一個(gè)聲明中。

            list-style-image
            將圖象設(shè)置為列表項(xiàng)標(biāo)志。

              1. url
                圖像的路徑。
              2. none
                默認(rèn)。無(wú)圖形被顯示。

            list-style-position
            設(shè)置列表中列表項(xiàng)標(biāo)志的位置。

              1. inside
                列表項(xiàng)目標(biāo)記放置在文本以內(nèi),且環(huán)繞文本根據(jù)標(biāo)記對(duì)齊。
              2. outside
                默認(rèn)。保持標(biāo)記位于文本的左側(cè)。列表項(xiàng)目標(biāo)記放置在文本以外,且環(huán)繞文本不根據(jù)標(biāo)記對(duì)齊。

            list-style-type
            設(shè)置列表項(xiàng)標(biāo)志的類型。

              1. none
                無(wú)標(biāo)記。
              2. disc
                默認(rèn)。標(biāo)記是實(shí)心圓。
              3. circle
                標(biāo)記是空心圓。
              4. square
                標(biāo)記是實(shí)心方塊。
              5. decimal
                標(biāo)記是數(shù)字。
              6. decimal-leading-zero
                0開頭的數(shù)字標(biāo)記。(01, 02, 03, 等。)
              7. lower-roman
                小寫羅馬數(shù)字(i, ii, iii, iv, v, 等。)
              8. upper-roman
                大寫羅馬數(shù)字(I, II, III, IV, V, 等。)
              9. lower-alpha
                小寫英文字母The marker is lower-alpha (a, b, c, d, e, 等。)
              10. upper-alpha
                大寫英文字母The marker is upper-alpha (A, B, C, D, E, 等。)
              11. lower-greek
                小寫希臘字母(alpha, beta, gamma, 等。)
              12. lower-latin
                小寫拉丁字母(a, b, c, d, e, 等。)
              13. upper-latin
                大寫拉丁字母(A, B, C, D, E, 等。)
              14. hebrew
                傳統(tǒng)的希伯來(lái)編號(hào)方式
              15. armenian
                傳統(tǒng)的亞美尼亞編號(hào)方式
              16. georgian
                傳統(tǒng)的喬治亞編號(hào)方式(an, ban, gan, 等。)
              17. cjk-ideographic
                簡(jiǎn)單的表意數(shù)字
              18. hiragana
                標(biāo)記是:a, i, u, e, o, ka, ki, 等。(日文片假名)
              19. katakana
                標(biāo)記是:A, I, U, E, O, KA, KI, 等。(日文片假名)
              20. hiragana-iroha
                標(biāo)記是:i, ro, ha, ni, ho, he, to, 等。(日文片假名)
              21. katakana-iroha
                標(biāo)記是:I, RO, HA, NI, HO, HE, TO, 等。(日文片假名)

            marker-offset


            CSS Table 屬性

            CSS 表格屬性允許你設(shè)置表格的布局。(請(qǐng)注意,本節(jié)介紹的不是如何使用表來(lái)建立布局,而是要介紹 CSS 中表本身如何布局。)

            屬性
            描述

            border-collapse
            設(shè)置是否把表格邊框合并為單一的邊框。

            caption-side
            設(shè)置表格標(biāo)題的位置。

            table-layout
            設(shè)置顯示單元、行和列的算法。


            CSS 邊框?qū)傩?/h4>

            "CSS" 列中的數(shù)字指示哪個(gè) CSS 版本定義了該屬性。

            輪廓(outline)是繪制于元素周圍的一條線,位于邊框邊緣的外圍,可起到突出元素的作用。

            CSS outline 屬性規(guī)定元素輪廓的樣式、顏色和寬度。

            outline
            在一個(gè)聲明中設(shè)置所有的輪廓屬性。
            2

            outline-color
            設(shè)置輪廓的顏色。
            2

            outline-style
            設(shè)置輪廓的樣式。
            2

            outline-width
            設(shè)置輪廓的寬度。
            2


            CSS 框模型概述

             

            CSS 框模型 (Box Model) 規(guī)定了元素框處理元素內(nèi)容、內(nèi)邊距邊框外邊距 的方式。

            ct_boxmodel

             

            • element : 元素。
            • padding : 內(nèi)邊距,也有資料將其翻譯為填充。
            • border : 邊框。
            • margin : 外邊距,也有資料將其翻譯為空白或空白邊。

            CSS 內(nèi)邊距屬性

            屬性
            描述

            padding
            簡(jiǎn)寫屬性。作用是在一個(gè)聲明中設(shè)置元素的所內(nèi)邊距屬性。

            padding-bottom
            設(shè)置元素的下內(nèi)邊距。

            padding-left
            設(shè)置元素的左內(nèi)邊距。

            padding-right
            設(shè)置元素的右內(nèi)邊距。

            padding-top
            設(shè)置元素的上內(nèi)邊距。


            CSS 邊框?qū)傩?/h4>

            屬性
            描述

            border
            簡(jiǎn)寫屬性,用于把針對(duì)四個(gè)邊的屬性設(shè)置在一個(gè)聲明。

            border-style
            用于設(shè)置元素所有邊框的樣式,或者單獨(dú)地為各邊設(shè)置邊框樣式。

            1. none
              定義無(wú)邊框。
            2. hidden
              與 "none" 相同。不過(guò)應(yīng)用于表時(shí)除外,對(duì)于表,hidden 用于解決邊框沖突。
            3. dotted
              定義點(diǎn)狀邊框。在大多數(shù)瀏覽器中呈現(xiàn)為實(shí)線。
            4. dashed
              定義虛線。在大多數(shù)瀏覽器中呈現(xiàn)為實(shí)線。
            5. solid
              定義實(shí)線。
            6. double
              定義雙線。雙線的寬度等于 border-width 的值。
            7. groove
              定義 3D 凹槽邊框。其效果取決于 border-color 的值。
            8. ridge
              定義 3D 壟狀邊框。其效果取決于 border-color 的值。
            9. inset
              定義 3D inset 邊框。其效果取決于 border-color 的值。
            10. outset
              定義 3D outset 邊框。其效果取決于 border-color 的值。

            border-width
            簡(jiǎn)寫屬性,用于為元素的所有邊框設(shè)置寬度,或者單獨(dú)地為各邊邊框設(shè)置寬度。

            1. thin
              定義細(xì)的邊框。
            2. medium
              默認(rèn)。定義中等的邊框。
            3. thick
              定義粗的邊框。
            4. length
              允許您自定義邊框的寬度。

            border-color
            簡(jiǎn)寫屬性,設(shè)置元素的所有邊框中可見(jiàn)部分的顏色,或?yàn)?4 個(gè)邊分別設(shè)置顏色。

             

            border-bottom
            簡(jiǎn)寫屬性,用于把下邊框的所有屬性設(shè)置到一個(gè)聲明中。

            border-bottom-color
            設(shè)置元素的下邊框的顏色。

            border-bottom-style
            設(shè)置元素的下邊框的樣式。

            border-bottom-width
            設(shè)置元素的下邊框的寬度。

            border-left
            簡(jiǎn)寫屬性,用于把左邊框的所有屬性設(shè)置到一個(gè)聲明中。

            border-left-color
            設(shè)置元素的左邊框的顏色。

            border-left-style
            設(shè)置元素的左邊框的樣式。

            border-left-width
            設(shè)置元素的左邊框的寬度。

            border-right
            簡(jiǎn)寫屬性,用于把右邊框的所有屬性設(shè)置到一個(gè)聲明中。

            border-right-color
            設(shè)置元素的右邊框的顏色。

            border-right-style
            設(shè)置元素的右邊框的樣式。

            border-right-width
            設(shè)置元素的右邊框的寬度。

            border-top
            簡(jiǎn)寫屬性,用于把上邊框的所有屬性設(shè)置到一個(gè)聲明中。

            border-top-color
            設(shè)置元素的上邊框的顏色。

            border-top-style
            設(shè)置元素的上邊框的樣式。

            border-top-width
            設(shè)置元素的上邊框的寬度。


            CSS 外邊距屬性

            屬性
            描述

            margin
            簡(jiǎn)寫屬性。在一個(gè)聲明中設(shè)置所有外邊距屬性。

            margin-bottom
            設(shè)置元素的下外邊距。

            margin-left
            設(shè)置元素的左外邊距。

            margin-right
            設(shè)置元素的右外邊距。

            margin-top
            設(shè)置元素的上外邊距。


            CSS 定位屬性

            CSS 定位屬性允許你對(duì)元素進(jìn)行定位。

            詳細(xì)參見(jiàn)http://www.w3school.com.cn/css/css_positioning.asp

            CSS 定位和浮動(dòng)

            CSS 為定位和浮動(dòng)提供了一些屬性,利用這些屬性,可以建立列式布局,將布局的一部分與另一部分重疊,還可以完成多年來(lái)通常需要使用多個(gè)表格才能完成的任務(wù)。

            定位的基本思想很簡(jiǎn)單,它允許你定義元素框相對(duì)于其正常位置應(yīng)該出現(xiàn)的位置,或者相對(duì)于父元素、另一個(gè)元素甚至瀏覽器窗口本身的位置。顯然,這個(gè)功能非常強(qiáng)大,也很讓人吃驚。要知道,用戶代理對(duì) CSS2 中定位的支持遠(yuǎn)勝于對(duì)其它方面的支持,對(duì)此不應(yīng)感到奇怪。

            另一方面,CSS1 中首次提出了浮動(dòng),它以 Netscape 在 Web 發(fā)展初期增加的一個(gè)功能為基礎(chǔ)。浮動(dòng)不完全是定位,不過(guò),它當(dāng)然也不是正常流布局。我們會(huì)在后面的章節(jié)中明確浮動(dòng)的含義。

            一切皆為框

            div、h1 或 p 元素常常被稱為塊級(jí)元素。這意味著這些元素顯示為一塊內(nèi)容,即“塊框”。與之相反,span 和 strong 等元素稱為“行內(nèi)元素”,這是因?yàn)樗鼈兊膬?nèi)容顯示在行中,即“行內(nèi)框”。

            您可以使用 display 屬性改變生成的框的類型。這意味著,通過(guò)將 display 屬性設(shè)置為 block,可以讓行內(nèi)元素(比如 <a> 元素)表現(xiàn)得像塊級(jí)元素一樣。還可以通過(guò)把 display 設(shè)置為 none,讓生成的元素根本沒(méi)有框。這樣的話,該框及其所有內(nèi)容就不再顯示,不占用文檔中的空間。

            但是在一種情況下,即使沒(méi)有進(jìn)行顯式定義,也會(huì)創(chuàng)建塊級(jí)元素。這種情況發(fā)生在把一些文本添加到一個(gè)塊級(jí)元素(比如 div)的開頭。即使沒(méi)有把這些文本定義為段落,它也會(huì)被當(dāng)作段落對(duì)待:

            <div>
            some text
            <p>Some more text.</p>
            </div>
            

            在這種情況下,這個(gè)框稱為無(wú)名塊框,因?yàn)樗慌c專門定義的元素相關(guān)聯(lián)。

            塊級(jí)元素的文本行也會(huì)發(fā)生類似的情況。假設(shè)有一個(gè)包含三行文本的段落。每行文本形成一個(gè)無(wú)名框。無(wú)法直接對(duì)無(wú)名塊或行框應(yīng)用樣式,因?yàn)闆](méi)有可以應(yīng)用樣式的地方(注意,行框和行內(nèi)框是兩個(gè)概念)。但是,這有助于理解在屏幕上看到的所有東西都形成某種框。

            CSS 定位機(jī)制

            CSS 有三種基本的定位機(jī)制:普通流、浮動(dòng)和絕對(duì)定位。

            除非專門指定,否則所有框都在普通流中定位。也就是說(shuō),普通流中的元素的位置由元素在 X(HTML) 中的位置決定。

            塊級(jí)框從上到下一個(gè)接一個(gè)地排列,框之間的垂直距離是由框的垂直外邊距計(jì)算出來(lái)。

            行內(nèi)框在一行中水平布置。可以使用水平內(nèi)邊距、邊框和外邊距調(diào)整它們的間距。但是,垂直內(nèi)邊距、邊框和外邊距不影響行內(nèi)框的高度。由一行形成的水平框稱為行框(Line Box),行框的高度總是足以容納它包含的所有行內(nèi)框。不過(guò),設(shè)置行高可以增加這個(gè)框的高度。

            在下面的章節(jié),我們會(huì)為您詳細(xì)講解相對(duì)定位、絕對(duì)定位和浮動(dòng)。

            CSS position 屬性

            通過(guò)使用 position 屬性,我們可以選擇 4 中不同類型的定位,這會(huì)影響元素框生成的方式。

            position 屬性值的含義:

            static
            元素框正常生成。塊級(jí)元素生成一個(gè)矩形框,作為文檔流的一部分,行內(nèi)元素則會(huì)創(chuàng)建一個(gè)或多個(gè)行框,置于其父元素中。
            relative
            元素框偏移某個(gè)距離。元素仍保持其未定位前的形狀,它原本所占的空間仍保留。
            absolute
            元素框從文檔流完全刪除,并相對(duì)于其包含塊定位。包含塊可能是文檔中的另一個(gè)元素或者是初始包含塊。元素原先在正常文檔流中所占的空間會(huì)關(guān)閉,就好像元素原來(lái)不存在一樣。元素定位后生成一個(gè)塊級(jí)框,而不論原來(lái)它在正常流中生成何種類型的框。
            fixed
            元素框的表現(xiàn)類似于將 position 設(shè)置為 absolute,不過(guò)其包含塊是視窗本身。

            提示:相對(duì)定位實(shí)際上被看作普通流定位模型的一部分,因?yàn)樵氐奈恢孟鄬?duì)于它在普通流中的位置。

            屬性
            描述

            position
            把元素放置到一個(gè)靜態(tài)的、相對(duì)的、絕對(duì)的、或固定的位置中。

            1. static
              默認(rèn)。位置設(shè)置為 static 的元素,它始終會(huì)處于頁(yè)面流給予的位置(static 元素會(huì)忽略任何 top、bottom、left 或 right 聲明)。
            2. relative
              位置被設(shè)置為 relative 的元素,可將其移至相對(duì)于其正常位置的地方,因此 "left:20" 將向元素的 LEFT 位置添加 20 個(gè)像素。
            3. absolute
              位置設(shè)置為 absolute 的元素,可定位于相對(duì)于包含它的元素的指定坐標(biāo)。此元素的位置可通過(guò) "left"、"top"、"right" 以及"bottom" 屬性來(lái)規(guī)定。
            4. fixed
              位置被設(shè)置為 fixed 的元素,可定位于相對(duì)于瀏覽器窗口的指定坐標(biāo)。此元素的位置可通過(guò) "left"、"top"、"right" 以及"bottom" 屬性來(lái)規(guī)定。不論窗口滾動(dòng)與否,元素都會(huì)留在那個(gè)位置。工作于 IE7(strict 模式)。

            top
            定義了一個(gè)定位元素的上外邊距邊界與其包含塊上邊界之間的偏移。

            1. auto
              默認(rèn)。通過(guò)瀏覽器來(lái)計(jì)算頂部的位置。
            2. %
              設(shè)置元素的頂部到最近一個(gè)具有定位設(shè)置父元素的上邊緣的百分比位置。
            3. length
              使用 px、cm 等單位設(shè)置元素的頂部到最近一個(gè)具有定位設(shè)置上邊緣的頂部的位置。可使用負(fù)值。

            right
            定義了定位元素右外邊距邊界與其包含塊右邊界之間的偏移。

            bottom
            定義了定位元素下外邊距邊界與其包含塊下邊界之間的偏移。

            left
            定義了定位元素左外邊距邊界與其包含塊左邊界之間的偏移。

            overflow
            設(shè)置當(dāng)元素的內(nèi)容溢出其區(qū)域時(shí)發(fā)生的事情。

            1. visible
              默認(rèn)。內(nèi)容不會(huì)被修剪,會(huì)呈現(xiàn)在元素之外。
            2. hidden
              內(nèi)容會(huì)被修剪,但是瀏覽器不會(huì)顯示供查看內(nèi)容的滾動(dòng)條。
            3. scroll
              內(nèi)容會(huì)被修剪,但是瀏覽器會(huì)顯示滾動(dòng)條以便查看其余的內(nèi)容。
            4. auto
              如果內(nèi)容被修剪,則瀏覽器會(huì)顯示滾動(dòng)條以便查看其余的內(nèi)容。

            clip
            設(shè)置元素的形狀。元素被剪入這個(gè)形狀之中,然后顯示出來(lái)。

            1. shape
              設(shè)置元素的形狀。合法的形狀值是:rect (top, right, bottom, left)
            2. auto
              默認(rèn)。瀏覽器可設(shè)置元素的形狀。

            vertical-align
            設(shè)置元素的垂直對(duì)齊方式。

            1. baseline
              默認(rèn)。元素放置在父元素的基線上。
            2. sub
              垂直對(duì)齊文本的下標(biāo)。
            3. super
              垂直對(duì)齊文本的上標(biāo)
            4. top
              把元素的頂端與行中最高元素的頂端對(duì)齊
            5. text-top
              把元素的頂端與父元素字體的頂端對(duì)齊
            6. middle
              把此元素放置在父元素的中部。
            7. bottom
              把元素的頂端與行中最低的元素的頂端對(duì)齊。
            8. text-bottom
              把元素的底端與父元素字體的底端對(duì)齊。
            9. length
            10. %
              使用 "line-height" 屬性的百分比值來(lái)排列此元素。允許使用負(fù)值。

            z-index
            設(shè)置元素的堆疊順序。

            1. auto
              默認(rèn)。堆疊順序與父元素相等。
            2. number
              設(shè)置元素的堆疊順序。

             


            CSS 尺寸屬性

            CSS 尺寸屬性允許你控制元素的高度和寬度。同樣,還允許你增加行間距。

            屬性
            描述

            height
            設(shè)置元素的高度。

            line-height
            設(shè)置行高。

            max-height
            設(shè)置元素的最大高度。

            max-width
            設(shè)置元素的最大寬度。

            min-height
            設(shè)置元素的最小高度。

            min-width
            設(shè)置元素的最小寬度。

            width
            設(shè)置元素的寬度。


            CSS 分類屬性 (Classification)

            CSS 分類屬性允許你控制如何顯示元素,設(shè)置圖像顯示于另一元素中的何處,相對(duì)于其正常位置來(lái)定位元素,使用絕對(duì)值來(lái)定位元素,以及元素的可見(jiàn)度。

            屬性
            描述

            clear
            設(shè)置一個(gè)元素的側(cè)面是否允許其他的浮動(dòng)元素。

            cursor
            規(guī)定當(dāng)指向某元素之上時(shí)顯示的指針類型。

            display
            設(shè)置是否及如何顯示元素。

            float
            定義元素在哪個(gè)方向浮動(dòng)。

            position
            把元素放置到一個(gè)靜態(tài)的、相對(duì)的、絕對(duì)的、或固定的位置中。

            visibility
            設(shè)置元素是否可見(jiàn)或不可見(jiàn)。

             

            偽類

            瀏覽器支持IE Internet Explorer, F: Firefox, N: Netscape。

            W3C:“W3C” 列的數(shù)字顯示出偽類屬性由哪個(gè) CSS 標(biāo)準(zhǔn)定義(CSS1 還是 CSS2)。

            偽類
            作用
            IE
            F
            N
            W3C

            :active
            將樣式添加到被激活的元素
            4
            1
            8
            1

            :focus
            將樣式添加到被選中的元素
            -
            -
            -
            2

            :hover
            當(dāng)鼠標(biāo)懸浮在元素上方時(shí),向元素添加樣式
            4
            1
            7
            1

            :link
            將特殊的樣式添加到未被訪問(wèn)過(guò)的鏈接
            3
            1
            4
            1

            :visited
            將特殊的樣式添加到被訪問(wèn)過(guò)的鏈接
            3
            1
            4
            1

            :first-child
            將特殊的樣式添加到元素的第一個(gè)子元素
            1
            7
            2

            :lang
            允許創(chuàng)作者來(lái)定義指定的元素中使用的語(yǔ)言
            1
            8
            2

            偽元素
            作用
            IE
            F
            N
            W3C

            :first-letter
            將特殊的樣式添加到文本的首字母
            5
            1
            8
            1

            :first-line
            將特殊的樣式添加到文本的首行
            5
            1
            8
            1

            :before
            在某元素之前插入某些內(nèi)容
            1.5
            8
            2

            :after
            在某元素之后插入某些內(nèi)容
            1.5
            8
            2

             

            不同的媒介類型

            注釋:媒介類型名稱對(duì)大小寫不敏感。

            瀏覽器支持IE: Internet Explorer, F: Firefox, N: Netscape。

            W3C:“W3C” 列的數(shù)字顯示出屬性背景由哪個(gè) CSS 標(biāo)準(zhǔn)定義(CSS1 還是 CSS2)。

            媒介類型
            描述

            all
            用于所有的媒介設(shè)備。

            aural
            用于語(yǔ)音和音頻合成器。

            braille
            用于盲人用點(diǎn)字法觸覺(jué)回饋設(shè)備。

            embossed
            用于分頁(yè)的盲人用點(diǎn)字法打印機(jī)。

            handheld
            用于小的手持的設(shè)備。

            print
            用于打印機(jī)。

            projection
            用于方案展示,比如幻燈片。

            screen
            用于電腦顯示器。

            tty
            用于使用固定密度字母柵格的媒介,比如電傳打字機(jī)和終端。

            tv
            用于電視機(jī)類型的設(shè)備。

            posted @ 2009-11-16 13:08 追求無(wú)止境 閱讀(288) | 評(píng)論 (0)編輯 收藏

            JDBC高級(jí)特性

            1、可滾動(dòng)的結(jié)果集(Scrollable Result Sets)

            (1)創(chuàng)建可滾動(dòng)的結(jié)果集:

              Statement stmt = con.createStatement(
                                   ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                   ResultSet.CONCUR_READ_ONLY);
            ResultSet.TYPE_FORWARD_ONLY:結(jié)果集是不能滾動(dòng)的;他的游標(biāo)只能向前移動(dòng);
            ResultSet.TYPE_SCROLL_INSENSITIVE:結(jié)果是可滾動(dòng)的;游標(biāo)可以向前也可以后退。也可以移動(dòng)到一個(gè)絕對(duì)位置。
            ResultSet.TYPE_SCROLL_SENSITIVE:結(jié)果是可滾動(dòng)的;游標(biāo)可以向前也可以后退。也可以移動(dòng)到一個(gè)絕對(duì)位置。
            ResultSet.CONCUR_READ_ONLY:結(jié)果集是只讀的。
            ResultSet.ResultSet.CONCUR_UPDATABLE:結(jié)果集是可以更新的。
            
              ResultSet srs = stmt.executeQuery("SELECT COF_NAME, 
                                   PRICE FROM COFFEES");
            盡管我們可以在這里設(shè)置創(chuàng)建的是可滾動(dòng)結(jié)果集,但是如果廠商的JDBC實(shí)現(xiàn)不支持,我們獲取到的結(jié)果將不具有可滾動(dòng)屬性。
            可以使用ResultSet.getType()方法來(lái)獲取是否支持滾動(dòng):
             int type = rs.getType();
            

            The variable type will be one of the following:

            1003 to indicate ResultSet.TYPE_FORWARD_ONLY

            1004 to indicate ResultSet.TYPE_SCROLL_INSENSITIVE

            1005 to indicate ResultSet.TYPE_SCROLL_SENSITIVE

            TYPE_SCROLL_INSENSITIVE和TYPE_SCROLL_SENSITIVE的主要區(qū)別是在如果發(fā)生改變他們的敏感度。前一個(gè)將不會(huì)很敏感后一個(gè)則會(huì)。

            (2)移動(dòng)游標(biāo),使用以下方法可以移動(dòng)游標(biāo):

            rs.next();

            rs.previous();

            rs.absolute();

            rs.relative();

            rs.first();

            rs.last();

            rs.beforeFirst();

            rs.afterLast();

            使用rs.getRow()獲取游標(biāo)當(dāng)前行。

            rs.isAfterLast();
            rs.isBeforeFirst();
            rs.isLast();
            rs.isFirst();
            rs.hasNext();
            等等方法。
            2、更新結(jié)果集
            (1)創(chuàng)建可以更新的結(jié)果集
            Statement stmt = con.createStatement(
                           ResultSet.TYPE_SCROLL_SENSITIVE, 
                           ResultSet.CONCUR_UPDATABLE);
              ResultSet uprs = stmt.executeQuery(
                           "SELECT COF_NAME, 
                           PRICE FROM COFFEES");

            在JDBC 2.0中,我們可以向可以更新的結(jié)果集中插入行或刪除行,或者修改其中的行。

            下面的方法用于判斷結(jié)果集是否可以更新:

              int concurrency = uprs.getConcurrency();
            

            The variable concurrency will be one of the following:

            1007 to indicate ResultSet.CONCUR_READ_ONLY

            1008 to indicate ResultSet.CONCUR_UPDATABLE

            (2)更新結(jié)果集

            JDBC 1.0中可以這樣更新: 
             stmt.executeUpdate(
                "UPDATE COFFEES SET PRICE = 10.99 " +
                "WHERE COF_NAME = 'French_Roast_Decaf'");
            在JDBC2.0中。則可以:
             uprs.last();
              uprs.updateFloat("PRICE", 10.99f);
            uprs.updateRow();
            在移動(dòng)游標(biāo)前,必須先調(diào)用updateRow方法。否則更新信息會(huì)丟失。調(diào)用cancelRowUpdates可以取消對(duì)行的更新。
            (3)向結(jié)果集中插入或者刪除行
              Connection con = DriverManager.getConnection(
                                  "jdbc:mySubprotocol:mySubName");
              Statement stmt = con.createStatement(
                                   ResultSet.TYPE_SCROLL_SENSITIVE, 
                                   ResultSet.CONCUR_UPDATABLE);
              ResultSet uprs = stmt.executeQuery(
                                  "SELECT * FROM COFFEES");
              uprs.moveToInsertRow();
            
              uprs.updateString("COF_NAME", "Kona");
              uprs.updateInt("SUP_ID", 150);
              uprs.updateFloat("PRICE", 10.99f);
              uprs.updateInt("SALES", 0);
              uprs.updateInt("TOTAL", 0);
              
              uprs.insertRow();
            在移動(dòng)游標(biāo)前,必須要先調(diào)用insertRow否則插入的信息將丟失。
            uprs.absolute(4);
            uprs.deleteRow();
            刪除行。
            (4)查看結(jié)果集中的變化(其實(shí)就是說(shuō)了一個(gè)意思,用TYPE_SCROLL_SENSITIVE對(duì)數(shù)據(jù)很敏感,一旦數(shù)據(jù)變化就會(huì)反映在ResultSet中)

            Result sets vary greatly in their ability to reflect changes made in their underlying data. If you modify data in a ResultSet object, the change will always be visible if you close it and then reopen it during a transaction. In other words, if you re-execute the same query after changes have been made, you will produce a new result set based on the new data in the target table. This new result set will naturally reflect changes you made earlier. You will also see changes made by others when you reopen a result set if your transaction isolation level makes them visible.

            So when can you see visible changes you or others made while the ResultSet object is still open? (Generally, you will be most interested in the changes made by others because you know what changes you made yourself.) The answer depends on the type of ResultSet object you have.

            With a ResultSet object that is TYPE_SCROLL_SENSITIVE, you can always see visible updates made to existing column values. You may see inserted and deleted rows, but the only way to be sure is to use DatabaseMetaData methods that return this information. ("New JDBC 2.0 Core API Features" on page 371 explains how to ascertain the visibility of changes.)

            You can, to some extent, regulate what changes are visible by raising or lowering the transaction isolation level for your connection with the database. For example, the following line of code, wherecon is an active Connection object, sets the connection's isolation level to TRANSACTION_READ_COMMITTED:

              con.setTransactionIsolation(
                          Connection.TRANSACTION_READ_COMMITTED);
            

            With this isolation level, a TYPE_SCROLL_SENSITIVE result set will not show any changes before they are committed, but it can show changes that may have other consistency problems. To allow fewer data inconsistencies, you could raise the transaction isolation level to TRANSACTION_REPEATABLE_READ. The problem is that, in most cases, the higher the isolation level, the poorer the performance is likely to be. And, as is always true of JDBC drivers, you are limited to the levels your driver actually provides. Many programmers find that the best choice is generally to use their database's default transaction isolation level. You can get the default with the following line of code, where con is a newly-created connection:

              int level = con.getTransactionIsolation();
            

            The explanation of Connection fields, beginning on page 347, gives the transaction isolation levels and their meanings.

            If you want more information about the visibility of changes and transaction isolation levels, see "What Is Visible to Transactions" on page 597.

            In a ResultSet object that is TYPE_SCROLL_INSENSITIVE, you cannot see changes made to it by others while it is still open, but you may be able to see your own changes with some implementations. This is the type of ResultSet object to use if you want a consistent view of data and do not want to see changes made by others.

            posted @ 2009-11-16 13:05 追求無(wú)止境 閱讀(280) | 評(píng)論 (0)編輯 收藏

            視頻感想

            昨天晚上看了關(guān)于“都市信息網(wǎng)”項(xiàng)目開發(fā)視頻,給人總體感覺(jué)差強(qiáng)人意,學(xué)到了一些知識(shí),記錄如下:

            1、頁(yè)面結(jié)構(gòu):

            在頁(yè)面結(jié)構(gòu)的定義上,將頁(yè)面分成多部分,例如頁(yè)頭,頁(yè)尾,左側(cè)欄和右主欄。在每個(gè)欄中導(dǎo)入需要的JSP文件。

            2、關(guān)于controller:

            要讓controller實(shí)現(xiàn)RequestAware和ResponseAware。然后使用繼承。

            3、關(guān)于DAO層的設(shè)計(jì)

            遺憾的是都市信息在DAO層的設(shè)計(jì)上,是一個(gè)敗筆。在controller里面使用sql語(yǔ)句。不利于各個(gè)層次的獨(dú)立。

            4、關(guān)于TreeMap

            在該項(xiàng)目中,使用map多使用TreeMap,查一下TreeMap是什么東西吧:

            A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by aComparator provided at map creation time, depending on which constructor is used.

            哦,是一個(gè)基于紅黑樹的Map。

            什么是紅黑樹。

            紅黑樹(Red-Black Tree)是二叉搜索樹(Binary Search Tree)的一種改進(jìn)。我們知道二叉搜索樹在最壞的情況下可能會(huì)變成一個(gè)鏈表(當(dāng)所有節(jié)點(diǎn)按從小到大的順序依次插入后)。而紅黑樹在每一次插入或刪除節(jié)點(diǎn)之后都會(huì)花O(log N)的時(shí)間來(lái)對(duì)樹的結(jié)構(gòu)作修改,以保持樹的平衡。也就是說(shuō),紅黑樹的查找方法與二叉搜索樹完全一樣;插入和刪除節(jié)點(diǎn)的的方法前半部分節(jié)與二叉搜索樹完全一樣,而后半部分添加了一些修改樹的結(jié)構(gòu)的操作。
            紅黑樹的每個(gè)節(jié)點(diǎn)上的屬性除了有一個(gè)key、3個(gè)指針:parent、lchild、rchild以外,還多了一個(gè)屬性:color。它只能是兩種顏色:紅或黑。而紅黑樹除了具有二叉搜索樹的所有性質(zhì)之外,還具有以下4點(diǎn)性質(zhì):
            1. 根節(jié)點(diǎn)是黑色的。
            2. 空節(jié)點(diǎn)是黑色的(紅黑樹中,根節(jié)點(diǎn)的parent以及所有葉節(jié)點(diǎn)lchild、rchild都不指向NULL,而是指向一個(gè)定義好的空節(jié)點(diǎn))。
            3. 紅色節(jié)點(diǎn)的父、左子、右子節(jié)點(diǎn)都是黑色。
            4. 在任何一棵子樹中,每一條從根節(jié)點(diǎn)向下走到空節(jié)點(diǎn)的路徑上包含的黑色節(jié)點(diǎn)數(shù)量都相同。

            有了這幾條規(guī)則,就可以保證整棵樹的平衡,也就等于保證了搜索的時(shí)間為O(log N)。

            但是在插入、刪除節(jié)點(diǎn)后,就有可能破壞了紅黑樹的性質(zhì)。所以我們要做一些操作來(lái)把整棵樹修補(bǔ)好。下面我就來(lái)介紹一下。

            posted @ 2009-11-16 13:03 追求無(wú)止境 閱讀(98) | 評(píng)論 (0)編輯 收藏

            主站蜘蛛池模板: 金乡县| 界首市| 清镇市| 彭阳县| 汶川县| 吴旗县| 北川| 孟连| 长宁县| 明光市| 遵化市| 沅江市| 六安市| 米脂县| 黑水县| 和顺县| 蒙自县| 白城市| 马公市| 南城县| 丰都县| 西安市| 苏尼特右旗| 台中县| 方正县| 威信县| 巴中市| 若尔盖县| 玉门市| 香河县| 舒兰市| 东辽县| 额济纳旗| 平邑县| 东明县| 湖州市| 贵溪市| 崇礼县| 盐源县| 开平市| 黄浦区|