SpringMVC視圖解析器

SpringMVC視圖解析器

前言

?? 在前一篇博客中講了SpringMVC的Controller控制器,在這篇博客中將接著介紹一下SpringMVC視 圖解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的DispatcherServlet處理,接著 Spring會分析看哪一個HandlerMapping定義的所有請求映射中存在對該請求的最合理的映射。然后通過該HandlerMapping取得 其對應的Handler,接著再通過相應的HandlerAdapter處理該Handler。HandlerAdapter在對Handler進行處理 之后會返回一個ModelAndView對象。在獲得了ModelAndView對象之后,Spring就需要把該View渲染給用戶,即返回給瀏覽器。 在這個渲染的過程中,發揮作用的就是ViewResolver和View。當Handler返回的ModelAndView中不包含真正的視圖,只返回一 個邏輯視圖名稱的時候,ViewResolver就會把該邏輯視圖名稱解析為真正的視圖View對象。View是真正進行視圖渲染,把結果返回給瀏覽器 的。

ViewResolver和View介紹

SpringMVC用于處理視圖最重要的兩個接口是ViewResolver和View。ViewResolver的主要作用是把一個邏輯上的視圖名稱解析為一個真正的視圖,SpringMVC中用于把View對象呈現給客戶端的是View對象本身,而ViewResolver只是把邏輯視圖名稱解析為對象的View對象。View接口的主要作用是用于處理視圖,然后返回給客戶端。

Spring為我們提供了非常多的視圖解析器,下面將列舉一些視圖解析器。

AbstractCachingViewResolver:這是一個抽象類,這種視圖解析器會把它曾經解析過的視圖保存起來,然后每次要解析視圖的時候先從緩存里面找,如果找到了對應的視圖就直接返回,如果沒有就創建一個新的視圖對象,然后把它放到一個用于緩存的map中,接著再把新建的視圖返回。使用這種視圖緩存的方式可以把解析視圖的性能問題降到最低。

UrlBasedViewResolver:它是對ViewResolver的一種簡單實現,而且繼承了AbstractCachingViewResolver,主要就是提供的一種拼接URL的方式來解析視圖,它可以讓我們通過prefix屬性指定一個指定的前綴,通過suffix屬性指定一個指定的后綴,然后把返回的邏輯視圖名稱加上指定的前綴和后綴就是指定的視圖URL了。如prefix=/WEB-INF/jsps/,suffix=.jsp,返回的視圖名稱viewName=test/indx,則UrlBasedViewResolver解析出來的視圖URL就是/WEB-INF/jsps/test/index.jsp。默認的prefix和suffix都是空串。URLBasedViewResolver支持返回的視圖名稱中包含redirect:前綴,這樣就可以支持URL在客戶端的跳轉,如當返回的視圖名稱是”redirect:test.do”的時候,URLBasedViewResolver發現返回的視圖名稱包含”redirect:”前綴,于是把返回的視圖名稱前綴”redirect:”去掉,取后面的test.do組成一個RedirectView,RedirectView中將把請求返回的模型屬性組合成查詢參數的形式組合到redirect的URL后面,然后調用HttpServletResponse對象的sendRedirect方法進行重定向。同樣URLBasedViewResolver還支持forword:前綴,對于視圖名稱中包含forword:前綴的視圖名稱將會被封裝成一個InternalResourceView對象,然后在服務器端利用RequestDispatcher的forword方式跳轉到指定的地址。使用UrlBasedViewResolver的時候必須指定屬性viewClass,表示解析成哪種視圖,一般使用較多的就是InternalResourceView,利用它來展現jsp,但是當我們使用JSTL的時候我們必須使用JstlView。下面是一段UrlBasedViewResolver的定義,根據該定義,當返回的邏輯視圖名稱是test的時候,UrlBasedViewResolver將把邏輯視圖名稱加上定義好的前綴和后綴,即“/WEB-INF/test.jsp”,然后新建一個viewClass屬性指定的視圖類型予以返回,即返回一個url為“/WEB-INF/test.jsp”的InternalResourceView對象。

Xml代碼 ?
  1. <bean??
  2. ???class="org.springframework.web.servlet.view.UrlBasedViewResolver">??
  3. ???<property?name="prefix"?value="/WEB-INF/"?/>??
  4. ???<property?name="suffix"?value=".jsp"?/>??
  5. ???<property?name="viewClass"?value="org.springframework.web.servlet.view.InternalResourceView"/>??
  6. </bean>??

?

InternalResourceViewResolver:它是URLBasedViewResolver的子類,所以URLBasedViewResolver支持的特性它都支持。在實際應用中InternalResourceViewResolver也是使用的最廣泛的一個視圖解析器。那么InternalResourceViewResolver有什么自己獨有的特性呢?單從字面意思來看,我們可以把InternalResourceViewResolver解釋為內部資源視圖解析器,這就是InternalResourceViewResolver的一個特性。InternalResourceViewResolver會把返回的視圖名稱都解析為InternalResourceView對象,InternalResourceView會把Controller處理器方法返回的模型屬性都存放到對應的request屬性中,然后通過RequestDispatcher在服務器端把請求forword重定向到目標URL。比如在InternalResourceViewResolver中定義了prefix=/WEB-INF/,suffix=.jsp,然后請求的Controller處理器方法返回的視圖名稱為test,那么這個時候InternalResourceViewResolver就會把test解析為一個InternalResourceView對象,先把返回的模型屬性都存放到對應的HttpServletRequest屬性中,然后利用RequestDispatcher在服務器端把請求forword到/WEB-INF/test.jsp。這就是InternalResourceViewResolver一個非常重要的特性,我們都知道存放在/WEB-INF/下面的內容是不能直接通過request請求的方式請求到的,為了安全性考慮,我們通常會把jsp文件放在WEB-INF目錄下,而InternalResourceView在服務器端跳轉的方式可以很好的解決這個問題。下面是一個InternalResourceViewResolver的定義,根據該定義當返回的邏輯視圖名稱是test的時候,InternalResourceViewResolver會給它加上定義好的前綴和后綴,組成“/WEB-INF/test.jsp”的形式,然后把它當做一個InternalResourceView的url新建一個InternalResourceView對象返回。

Xml代碼 ?
  1. <bean?class="org.springframework.web.servlet.view.InternalResourceViewResolver">??
  2. ???<property?name="prefix"?value="/WEB-INF/"/>??
  3. ???<property?name="suffix"?value=".jsp"></property>??
  4. </bean>??

?

XmlViewResolver:它繼承自AbstractCachingViewResolver抽象類,所以它也是支持視圖緩存的。XmlViewResolver需要給定一個xml配置文件,該文件將使用和Spring的bean工廠配置文件一樣的DTD定義,所以其實該文件就是用來定義視圖的bean對象的。在該文件中定義的每一個視圖的bean對象都給定一個名字,然后XmlViewResolver將根據Controller處理器方法返回的邏輯視圖名稱到XmlViewResolver指定的配置文件中尋找對應名稱的視圖bean用于處理視圖。該配置文件默認是/WEB-INF/views.xml文件,如果不使用默認值的時候可以在XmlViewResolver的location屬性中指定它的位置。XmlViewResolver還實現了Ordered接口,因此我們可以通過其order屬性來指定在ViewResolver鏈中它所處的位置,order的值越小優先級越高。以下是使用XmlViewResolver的一個示例:

(1)在SpringMVC的配置文件中加入XmlViewResolver的bean定義。使用location屬性指定其配置文件所在的位置,order屬性指定當有多個ViewResolver的時候其處理視圖的優先級。關于ViewResolver鏈的問題將在后續內容中講到。

Xml代碼 ?
  1. <bean?class="org.springframework.web.servlet.view.XmlViewResolver">??
  2. ???<property?name="location"?value="/WEB-INF/views.xml"/>??
  3. ???<property?name="order"?value="1"/>??
  4. </bean>??

?

(2)在XmlViewResolver對應的配置文件中配置好所需要的視圖定義。在下面的代碼中我們就配置了一個名為internalResource的InternalResourceView,其url屬性為“/index.jsp”。

Xml代碼 ?
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <beans?xmlns="http://www.springframework.org/schema/beans"??
  3. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  4. ????xsi:schemaLocation="http://www.springframework.org/schema/beans??
  5. ?????http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">??
  6. ????<bean?id="internalResource"?class="org.springframework.web.servlet.view.InternalResourceView">??
  7. ???????<property?name="url"?value="/index.jsp"/>??
  8. ????</bean>??
  9. </beans>??

?

(3)定義一個返回的邏輯視圖名稱為在XmlViewResolver配置文件中定義的視圖名稱——internalResource。

Java代碼 ?
  1. @RequestMapping("/xmlViewResolver")??
  2. public?String?testXmlViewResolver()?{??
  3. ???return?"internalResource";??
  4. }??

?

(4)這樣當我們訪問到上面定義好的testXmlViewResolver處理器方法的時候返回的邏輯視圖名稱為“internalResource”,這時候Spring就會到定義好的views.xml中尋找id或name為“internalResource”的bean對象予以返回,這里Spring找到的是一個url為“/index.jsp”的InternalResourceView對象。

BeanNameViewResolver:這個視圖解析器跟XmlViewResolver有點類似,也是通過把返回的邏輯視圖名稱去匹配定義好的視圖bean對象。不同點有二,一是BeanNameViewResolver要求視圖bean對象都定義在Spring的application context中,而XmlViewResolver是在指定的配置文件中尋找視圖bean對象,二是BeanNameViewResolver不會進行視圖緩存。看一個例子,在SpringMVC的配置文件中定義了一個BeanNameViewResolver視圖解析器和一個id為test的InternalResourceview bean對象。

Xml代碼 ?
  1. <bean?class="org.springframework.web.servlet.view.BeanNameViewResolver">??
  2. ???<property?name="order"?value="1"/>??
  3. </bean>??
  4. ??
  5. <bean?id="test"?class="org.springframework.web.servlet.view.InternalResourceView">??
  6. ???<property?name="url"?value="/index.jsp"/>??
  7. </bean>??

?

這樣當返回的邏輯視圖名稱是 test的時候,就會解析為上面定義好id為test的InternalResourceView。

ResourceBundleViewResolver:它和XmlViewResolver一樣,也是繼承自AbstractCachingViewResolver,但是它緩存的不是視圖,這個會在后面有說到。和XmlViewResolver一樣它也需要有一個配置文件來定義邏輯視圖名稱和真正的View對象的對應關系,不同的是ResourceBundleViewResolver的配置文件是一個屬性文件,而且必須是放在classpath路徑下面的,默認情況下這個配置文件是在classpath根目錄下的views.properties文件,如果不使用默認值的話,則可以通過屬性baseName或baseNames來指定。baseName只是指定一個基名稱,Spring會在指定的classpath根目錄下尋找以指定的baseName開始的屬性文件進行View解析,如指定的baseName是base,那么base.properties、baseabc.properties等等以base開始的屬性文件都會被Spring當做ResourceBundleViewResolver解析視圖的資源文件。ResourceBundleViewResolver使用的屬性配置文件的內容類似于這樣:

Properties代碼 ?
  1. resourceBundle.(class)=org.springframework.web.servlet.view.InternalResourceView??
  2. resourceBundle.url=/index.jsp??
  3. test.(class)=org.springframework.web.servlet.view.InternalResourceView??
  4. test.url=/test.jsp??

?

在這個配置文件中我們定義了兩個InternalResourceView對象,一個的名稱是resourceBundle,對應URL是/index.jsp,另一個名稱是test,對應的URL是/test.jsp。從這個定義來看我們可以知道resourceBundle是對應的視圖名稱,使用resourceBundle.(class)來指定它對應的視圖類型,resourceBundle.url指定這個視圖的url屬性。會思考的讀者看到這里可能會有這樣一個問題:為什么resourceBundle的class屬性要用小括號包起來,而它的url屬性就不需要呢?這就需要從ResourceBundleViewResolver進行視圖解析的方法來說了。ResourceBundleViewResolver還是通過bean工廠來獲得對應視圖名稱的視圖bean對象來解析視圖的。那么這些bean從哪里來呢?就是從我們定義的properties屬性文件中來。在ResourceBundleViewResolver第一次進行視圖解析的時候會先new一個BeanFactory對象,然后把properties文件中定義好的屬性按照它自身的規則生成一個個的bean對象注冊到該BeanFactory中,之后會把該BeanFactory對象保存起來,所以ResourceBundleViewResolver緩存的是BeanFactory,而不是直接的緩存從BeanFactory中取出的視圖bean。然后會從bean工廠中取出名稱為邏輯視圖名稱的視圖bean進行返回。接下來就講講Spring通過properties文件生成bean的規則。它會把properties文件中定義的屬性名稱按最后一個點“.”進行分割,把點前面的內容當做是bean名稱,點后面的內容當做是bean的屬性。這其中有幾個特別的屬性,Spring把它們用小括號包起來了,這些特殊的屬性一般是對應的attribute,但不是bean對象所有的attribute都可以這樣用。其中(class)是一個,除了(class)之外,還有(scope)、(parent)、(abstract)、(lazy-init)。而除了這些特殊的屬性之外的其他屬性,Spring會把它們當做bean對象的一般屬性進行處理,就是bean對象對應的property。所以根據上面的屬性配置文件將生成如下兩個bean對象:

Xml代碼 ?
  1. <bean?id="resourceBundle"?class="org.springframework.web.servlet.view.InternalResourceView">??
  2. ???<property?name="url"?value="/index.jsp"/>??
  3. </bean>??
  4. ??
  5. <bean?id="test"?class="org.springframework.web.servlet.view.InternalResourceView">??
  6. ???<property?name="url"?value="/test.jsp"/>??
  7. </bean>??

?

從ResourceBundleViewResolver使用的配置文件我們可以看出,它和XmlViewResolver一樣可以解析多種不同類型的View,因為它們的View是通過配置的方式指定的,這也就意味著我們可以指定A視圖是InternalResourceView,B視圖是JstlView。

來看下面這個一個例子,我在SpringMVC的配置文件中定義了一個ResourceBundleViewResolver對象,指定其baseName為views,然后order為1。

Xml代碼 ?
  1. <bean?class="org.springframework.web.servlet.view.ResourceBundleViewResolver">??
  2. ???<property?name="basename"?value="views"/>??
  3. ???<property?name="order"?value="1"/>??
  4. </bean>??

?

我在classpath的根目錄下有兩個屬性文件,一個是views.properties,一個是views_abc.properties,它們的內容分別如下:

views.properties:

Properties代碼 ?
  1. resourceBundle.(class)=org.springframework.web.servlet.view.InternalResourceView??
  2. resourceBundle.url=/index.jsp??
  3. test.(class)=org.springframework.web.servlet.view.InternalResourceView??
  4. test.url=/test.jsp??

?

views_abc.properties:

Properties代碼 ?
  1. abc.(class)=org.springframework.web.servlet.view.InternalResourceView??
  2. abc.url=/abc.jsp??

?

定義了如下這樣一個Controller,它有三個處理器方法。

Java代碼 ?
  1. @Controller??
  2. @RequestMapping("/mytest")??
  3. public?class?MyController?{??
  4. ????@RequestMapping("resourceBundle")??
  5. ????public?String?resourceBundle()?{??
  6. ???????return?"resourceBundle";??
  7. ????}??
  8. ??
  9. ????@RequestMapping("testResourceBundle")??
  10. ????public?String?testResourceBundle()?{??
  11. ???????return?"test";??
  12. ????}??
  13. ??
  14. ????@RequestMapping("abc")??
  15. ????public?String?abc()?{??
  16. ???????return?"abc";??
  17. ????}??
  18. ??
  19. }??

?

那么當我們請求/mytest/resourceBundle.do的時候,ResourceBundleViewResolver會首先嘗試著來解析該視圖,這里Controller處理器方法返回的邏輯視圖名稱是resourceBundle,ResourceBundleViewResolver按照上面提到的解析方法進行解析,這個時候它發現它是可以解析的,然后就返回了一個url為/index.jsp的InternalResourceView對象。同樣,請求/mytest/testResourceBundle.do返回的邏輯視圖test和/mytest/abc.do返回的邏輯視圖abc它都可以解析。當我們把basename指定為包的形式,如“com.tiantian.views”,的時候Spring會按照點“.”劃分為目錄的形式,到classpath相應目錄下去尋找basename開始的配置文件,如上面我們指定basename為“com.tiantian.views”,那么spring就會到classpath下的com/tiantian目錄下尋找文件名以views開始的properties文件作為解析視圖的配置文件。

FreeMarkerViewResolverVolocityViewResolver:這兩個視圖解析器都是UrlBasedViewResolver的子類。FreeMarkerViewResolver會把Controller處理方法返回的邏輯視圖解析為FreeMarkerView,而VolocityViewResolver會把返回的邏輯視圖解析為VolocityView。因為這兩個視圖解析器類似,所以這里我就只挑FreeMarkerViewResolver來做一個簡單的講解。FreeMarkerViewResolver和VilocityViewResolver都繼承了UrlBasedViewResolver。

對于FreeMarkerViewResolver而言,它會按照UrlBasedViewResolver拼接URL的方式進行視圖路徑的解析。但是使用FreeMarkerViewResolver的時候不需要我們指定其viewClass,因為FreeMarkerViewResolver中已經把viewClass定死為FreeMarkerView了。

我們先在SpringMVC的配置文件里面定義一個FreeMarkerViewResolver視圖解析器,并定義其解析視圖的order順序為1。

Xml代碼 ?
  1. <bean?class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">??
  2. ???<property?name="prefix"?value="fm_"/>??
  3. ???<property?name="suffix"?value=".ftl"/>??
  4. ???<property?name="order"?value="1"/>??
  5. </bean>??

?

那么當我們請求的處理器方法返回一個邏輯視圖名稱viewName的時候,就會被該視圖處理器加上前后綴解析為一個url為“fm_viewName.ftl”的FreeMarkerView對象。對于FreeMarkerView我們需要給定一個FreeMarkerConfig的bean對象來定義FreeMarker的配置信息。FreeMarkerConfig是一個接口,Spring已經為我們提供了一個實現,它就是FreeMarkerConfigurer。我們可以通過在SpringMVC的配置文件里面定義該bean對象來定義FreeMarker的配置信息,該配置信息將會在FreeMarkerView進行渲染的時候使用到。對于FreeMarkerConfigurer而言,我們最簡單的配置就是配置一個templateLoaderPath,告訴Spring應該到哪里尋找FreeMarker的模板文件。這個templateLoaderPath也支持使用“classpath:”和“file:”前綴。當FreeMarker的模板文件放在多個不同的路徑下面的時候,我們可以使用templateLoaderPaths屬性來指定多個路徑。在這里我們指定模板文件是放在“/WEB-INF/freemarker/template”下面的。

Xml代碼 ?
  1. <bean?class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">??
  2. ???<property?name="templateLoaderPath"?value="/WEB-INF/freemarker/template"/>??
  3. </bean>??

?

接下來我們定義如下一個Controller:

Java代碼 ?
  1. @Controller??
  2. @RequestMapping("/mytest")??
  3. public?class?MyController?{??
  4. ??
  5. ????@RequestMapping("freemarker")??
  6. ????public?ModelAndView?freemarker()?{??
  7. ???????ModelAndView?mav?=?new?ModelAndView();??
  8. ???????mav.addObject("hello",?"andy");??
  9. ???????mav.setViewName("freemarker");??
  10. ???????return?mav;??
  11. ????}??
  12. ??
  13. }??

?

由上面的定義我們可以看到這個Controller的處理器方法freemarker返回的邏輯視圖名稱是“freemarker”。那么如果我們需要把該freemarker視圖交給FreeMarkerViewResolver來解析的話,我們就需要根據上面的定義,在模板路徑下定義視圖對應的模板,即在“/WEB-INF/freemarker/template”目錄下建立fm_freemarker.ftl模板文件。這里我們定義其內容如下:

Ftl代碼 ?
  1. <html>??
  2. ????<head>??
  3. ???????<title>FreeMarker</title>??
  4. ????</head>??
  5. ????<body>??
  6. ???????<b>Hello?World</b>??
  7. ???????<font?color="red">Hello?World!</font>??
  8. ???????${hello}??
  9. ????</body>??
  10. </html>??

?

經過上面的定義當我們訪問/mytest/freemarker.do的時候就會返回一個邏輯視圖名稱為“freemarker”的ModelAndView對象,根據定義好的視圖解析的順序,首先進行視圖解析的是FreeMarkerViewResolver,這個時候FreeMarkerViewResolver會試著解析該視圖,根據它自身的定義,它會先解析到該視圖的URL為fm_freemarker.ftl,然后它會看是否能夠實例化該視圖對象,即在定義好的模板路徑下是否有該模板存在,如果有則返回該模板對應的FreeMarkerView。在這里的話/WEB-INF/freemarker/template目錄下是存在模板文件fm_freemarker.ftl的,所以會返回一個url為fm_freemarker.ftl的FreeMarkerView對象。接著FreeMarkerView就可以利用該模板文件進行視圖的渲染了。所以訪問結果應該如下所示:

?

?

視圖解析器鏈

?????? 在SpringMVC中可以同時定義多個ViewResolver視圖解析器,然后它們會組成一個ViewResolver鏈。當Controller處理器方法返回一個邏輯視圖名稱后,ViewResolver鏈將根據其中ViewResolver的優先級來進行處理。所有的ViewResolver都實現了Ordered接口,在Spring中實現了這個接口的類都是可以排序的。在ViewResolver中是通過order屬性來指定順序的,默認都是最大值。所以我們可以通過指定ViewResolver的order屬性來實現ViewResolver的優先級,order屬性是Integer類型,order越小,對應的ViewResolver將有越高的解析視圖的權利,所以第一個進行解析的將是ViewResolver鏈中order值最小的那個。當一個ViewResolver在進行視圖解析后返回的View對象是null的話就表示該ViewResolver不能解析該視圖,這個時候如果還存在其他order值比它大的ViewResolver就會調用剩余的ViewResolver中的order值最小的那個來解析該視圖,依此類推。當ViewResolver在進行視圖解析后返回的是一個非空的View對象的時候,就表示該ViewResolver能夠解析該視圖,那么視圖解析這一步就完成了,后續的ViewResolver將不會再用來解析該視圖。當定義的所有ViewResolver都不能解析該視圖的時候,Spring就會拋出一個異常。

?????? 基于Spring支持的這種ViewResolver鏈模式,我們就可以在SpringMVC應用中同時定義多個ViewResolver,給定不同的order值,這樣我們就可以對特定的視圖特定處理,以此來支持同一應用中有多種視圖類型。注意:像InternalResourceViewResolver這種能解析所有的視圖,即永遠能返回一個非空View對象的ViewResolver一定要把它放在ViewResolver鏈的最后面。

?

Xml代碼 ?
    1. <bean?class="org.springframework.web.servlet.view.XmlViewResolver">??
    2. ???<property?name="location"?value="/WEB-INF/views.xml"/>??
    3. ???<property?name="order"?value="1"/>??
    4. </bean>??
    5. ??
    6. <bean??
    7. ???class="org.springframework.web.servlet.view.UrlBasedViewResolver">??
    8. ???<property?name="prefix"?value="/WEB-INF/"?/>??
    9. ???<property?name="suffix"?value=".jsp"?/>??
    10. ???<property?name="viewClass"?value="org.springframework.web.servlet.view.InternalResourceView"/>??
    11. </bean>?

轉載于:https://www.cnblogs.com/renpei/p/5682025.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395572.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TIOBE 10月編程語言排行榜 : GO 問鼎本年度語言 ?

距離2016年度編程語言的公布只剩3個月了&#xff0c;誰將奪得桂冠&#xff1f; 與去年同期相比&#xff0c;2016年只有Go語言和Groovy語言的增長率超過了1%。 需要注意的是&#xff0c;Groovy語言2015年以一個爆炸性增長的收尾&#xff0c;所以到2017年1月左右的增長速度可能不…

校友郵箱_freeCodeCamp校友網絡:FCC校友的自主指導網絡

校友郵箱by peterWeinberg彼得溫伯格 freeCodeCamp校友網絡&#xff1a;FCC校友的自主指導網絡 (The freeCodeCamp Alumni Network: A homegrown mentorship network for FCC alumni) For the last year, I’ve been spending nearly all my free time learning to code. I’v…

oracle severity,ORACLE10G如何清除OEM下的歷史警告信息

ORACLE10G如何清除OEM下的歷史警告信息問題描述&#xff1a;OEM的HOME頁面可以顯示ORACLE的報警信息&#xff0c;但報警事件清除后該信息不會自動清除。隨著時間的增長&#xff0c;信息量逐漸加大&#xff0c;解決方法是手工予以清除。SampleCluster DatabaseTablespaces FullT…

使用 ReSharper,輸入即遵循 StyleCop 的代碼格式化規范

StyleCop 可以幫助強制執行代碼格式化規范&#xff0c;ReSharper 可以幫助你更高效地編寫代碼。把兩者結合起來&#xff0c;你便能高效地編寫符合團隊強制格式化規范的代碼來。 本文就介紹如何使用 ReSharper 來高效地遵循 StyleCop 的代碼格式化規范。 本文內容 安裝插件 Styl…

Oracle數據庫備份恢復,巡檢須要關注的對象設置以及相關恢復概述

數據庫備份恢復。巡檢須要關注的對象設置&#xff1a; 1.數據庫名稱&#xff0c;以及DBID&#xff1b; --dbid在v$database中 SYSORCL>select dbid,name from v$database; DBID NAME ---------- --------- 1385095721 ORCL 2.控制文件的位置&#xff1b; s…

Python迭代器

一、文件迭代器 readline&#xff08;&#xff09;每次讀取文件的一行&#xff0c;每次調用readline方法會自動到下一行&#xff0c;到文件末尾時&#xff0c;會返回空字符串。 _next_()方法同readline&#xff08;&#xff09;一樣&#xff0c;只是到最后一行會引發stopiterat…

成千上萬的在線課程時,如何保持理智和學習編碼

by Travis Chan通過特拉維斯陳 成千上萬的在線課程時&#xff0c;如何保持理智和學習編碼 (How to stay sane and learn to code when there are thousands of online courses) We live in the information age. Information about anything we can think of is accessible to…

oracle中noguarantee,聊聊UNDO_RETENTION作用(修改guarantee)

oracle10g中&#xff0c;針對dba_tablespace&#xff0c;加了其中一個額外列是retention.回憶一下Oracle 10g之前,在自動Undo管理的模式下&#xff0c;我們都知道undo_retention參數的作用是用來控制當transaction被commit之后&#xff0c;undo信息的保留時間。這些undo信息可以…

【Hankson 的趣味題】

可能我只適合這道題的50分 但還是要爭取一下的 我們知道對于\(gcd\)和\(lcm\)有這樣的定義 \(a\prod _{i1}^{\pi(a)}p_i^{d_{i}}\) \(b\prod _{i1}^{\pi(b)}p_i^{g_{i}}\) 那么則有 \(gcd(a,b)\prod_{i1}^{\pi(max(a,b))} p_i^{min(g_i,d_i)}\) \(lcm(a,b)\prod_{i1}^{\pi(max(…

C# 控件雙緩沖控制 ControlStyles 枚舉詳解

ControlStyles 枚舉.NET Framework 4指定控件的樣式和行為。 此枚舉有一個 FlagsAttribute 特性&#xff0c;通過該特性可使其成員值按位組合。 命名空間&#xff1a; System.Windows.Forms程序集&#xff1a; System.Windows.Forms&#xff08;在 System.Windows.Forms.dll …

協作機器人 ai算法_如果我們希望人工智能為我們服務而不是不利于我們,我們需要協作設計...

協作機器人 ai算法by Mariya Yao姚iya(Mariya Yao) 如果我們希望人工智能為我們服務而不是不利于我們&#xff0c;我們需要協作設計 (If we want AI to work for us — not against us — we need collaborative design) The trope “there’s an app for that” is becoming …

Shadow Brokers 公布 2.1 萬美元的 0day 訂閱服務

神秘黑客組織 Shadow Brokers 宣布將向支付 2.1 萬美元 0day 訂閱服務的個人公布最新一批的 NSA 工具&#xff0c;這一聲明給全世界的白帽子黑客或安全研究人員造成了一場倫理危機。 一方面&#xff0c;Shadow Brokers 此前釋出過創造出勒索軟件 WannaCry 的 NSA 工具&#xff…

linux awk 常見字符串處理

awk指定輸出列&#xff1a; awk {print $0} file #打印所有列awk {print $1} file #打印第一列 awk {print $1, $3} file #打印第一和第三列 cat file | awk {print $3, $1} #打印第三列和第一列&#xff0c;注意先后順序。 cat file | awk {print $3, $NF} #打印第三列…

oracle ldap 配置,ldap 安裝

一、安裝步驟1:配置yum源掛著盤鏡像時用到&#xff1a; 這里不做解釋;(yum clean all && yum makecache)2:安裝OpenLDAP組件1)安裝OpenLDAP組件命令如下:[rootgitea ~]# yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -ycom…

scp跨主機拷貝工具

參考&#xff1a;http://www.cnblogs.com/hitwtx/archive/2011/11/16/2251254.html SSH上A機&#xff0c;要將10.1.17.95機/tpdata/shell_script/下面的crontab.tar.gz文件拷貝到A機的當前文件夾下面&#xff1a; scp weblogic10.1.17.95:/tpdata/shell_script/crontab.tar.gz …

Google Chrome瀏覽器可能在您不知情的情況下破壞了您的測試

by Robert Axelsen羅伯特阿克森(Robert Axelsen) Google Chrome瀏覽器可能在您不知情的情況下破壞了您的測試 (Google Chrome might have broken your tests without you even knowing about it) My colleague just discovered that Chrome 58 (released April 19th) has sile…

Java 9 將采用新的版本字符串格式

在現有的版本編碼格式使用了兩年之后&#xff0c;從Java 9開始&#xff0c;Java版本方案將根據業內軟件版本編碼的最佳實踐進行修改。使用或解析Java版本字符串的應用程序開發人員要注意了&#xff0c;因為這種變化可以會影響他們的應用程序。 正如JEP 223所闡述的那樣&#xf…

oracle 表更新表,Oracle 更新表(另一張表)

JUC學習筆記--Thread多線程基礎實現多線程的兩種方法 java 實現多線程通過兩種方式1.繼承Thread類 ,2.實現Runnable接口 class Newthead extends Thread{ public void ru ...SharePoint中新創建的Web Application在瀏覽器中報404錯誤問題描述:在安裝完成SharePoint 2010后,進入…

jQuery(愛前端)

一 jQuery 簡介 官網&#xff1a;www.jquery.com 口號&#xff1a;寫更少的代碼&#xff0c;做更多的事情 jQuery 是一個快速、小型的、特性很多的JS庫&#xff0c;它把很多事兒都變得簡單。jQuery是免費的、開源的。 jQuery 是 DOM 編程領域的霸主&#xff0c;極大的簡化了原生…

跳過 centos部署 webpy的各種坑

用centos部署webpy發現的各種坑&#xff1a; 1、python 版本&#xff1a; 2、中文編碼&#xff1a; 3、web模塊路徑&#xff1a; 在命令行里輸入python&#xff0c;能import web&#xff0c;但是網站錯誤報告一直報告沒有找到web模塊&#xff0c;說明web模塊路徑有問題。python…