亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

web.xml詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年07月18日 11:32:03   投稿:mrr  
這篇文章給大家詳細(xì)介紹了web.xml的相關(guān)知識(shí),需要的朋友可以參考下

一、            Web.xml詳解:

(一)  web.xml加載過(guò)程(步驟)

首先簡(jiǎn)單說(shuō)一下,web.xml的加載過(guò)程。

當(dāng)我們?nèi)?dòng)一個(gè)WEB項(xiàng)目時(shí),容器包括(JBoss、Tomcat等)首先會(huì)讀取項(xiàng)目web.xml配置文件里的配置,當(dāng)這一步驟沒(méi)有出錯(cuò)并且完成之后,項(xiàng)目才能正常地被啟動(dòng)起來(lái)。

  •   啟動(dòng)WEB項(xiàng)目的時(shí)候,容器首先會(huì)去它的配置文件web.xml讀取兩個(gè)節(jié)點(diǎn): 
<listener></listener>和<context-param></context-param>
  •   緊接著,容器創(chuàng)建一個(gè)ServletContext(application),這個(gè)WEB項(xiàng)目所有部分都將共享這個(gè)上下文。
  •   容器以<context-param></context-param>的name作為鍵,value作為值,將其轉(zhuǎn)化為鍵值對(duì),存入ServletContext。
  •   容器創(chuàng)建<listener></listener>中的類實(shí)例,根據(jù)配置的class類路徑<listener-class>來(lái)創(chuàng)建監(jiān)聽,在監(jiān)聽中會(huì)有contextInitialized(ServletContextEvent args)初始化方法,啟動(dòng)Web應(yīng)用時(shí),系統(tǒng)調(diào)用Listener的該方法,在這個(gè)方法中獲得:
ServletContext application =ServletContextEvent.getServletContext();
context-param的值= application.getInitParameter("context-param的鍵");

得到這個(gè)context-param的值之后,你就可以做一些操作了。

  •    舉例:你可能想在項(xiàng)目啟動(dòng)之前就打開數(shù)據(jù)庫(kù),那么這里就可以在<context-param>中設(shè)置數(shù)據(jù)庫(kù)的連接方式(驅(qū)動(dòng)、url、user、password),在監(jiān)聽類中初始化數(shù)據(jù)庫(kù)的連接。這個(gè)監(jiān)聽是自己寫的一個(gè)類,除了初始化方法,它還有銷毀方法,用于關(guān)閉應(yīng)用前釋放資源。比如:說(shuō)數(shù)據(jù)庫(kù)連接的關(guān)閉,此時(shí),調(diào)用contextDestroyed(ServletContextEvent args),關(guān)閉Web應(yīng)用時(shí),系統(tǒng)調(diào)用Listener的該方法。
  •   接著,容器會(huì)讀取<filter></filter>,根據(jù)指定的類路徑來(lái)實(shí)例化過(guò)濾器。
  •   以上都是在WEB項(xiàng)目還沒(méi)有完全啟動(dòng)起來(lái)的時(shí)候就已經(jīng)完成了的工作。如果系統(tǒng)中有Servlet,則Servlet是在第一次發(fā)起請(qǐng)求的時(shí)候被實(shí)例化的,而且一般不會(huì)被容器銷毀,它可以服務(wù)于多個(gè)用戶的請(qǐng)求。所以,Servlet的初始化都要比上面提到的那幾個(gè)要遲。

總的來(lái)說(shuō),web.xml的加載順序是: <context-param>-> <listener> -> <filter> -> <servlet>。其中,如果web.xml中出現(xiàn)了相同的元素,則按照在配置文件中出現(xiàn)的先后順序來(lái)加載。

對(duì)于某類元素而言,與它們出現(xiàn)的順序是有關(guān)的。以<filter>為例,web.xml中當(dāng)然可以定義多個(gè)<filter>,與<filter>相關(guān)的一個(gè)元素是<filter-mapping>,注意,對(duì)于擁有相同<filter-name>的<filter>和<filter-mapping>元素而言,<filter-mapping>必須出現(xiàn)在<filter>之后,否則當(dāng)解析到<filter-mapping>時(shí),它所對(duì)應(yīng)的<filter-name>還未定義。web容器啟動(dòng)初始化每個(gè)<filter>時(shí),按照<filter>出現(xiàn)的順序來(lái)初始化的,當(dāng)請(qǐng)求資源匹配多個(gè)<filter-mapping>時(shí),<filter>攔截資源是按照<filter-mapping>元素出現(xiàn)的順序來(lái)依次調(diào)用doFilter()方法的。<servlet>同<filter>類似,此處不再贅述。

(二)    web.xml標(biāo)簽詳解

1.XML文檔有效性檢查

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://Java.sun.com/dtd/web-app_2_3.dtd" >

這段代碼指定文件類型定義(DTD),可以通過(guò)它檢查XML文檔的有效性。下面顯示的<!DOCTYPE>元素有幾個(gè)特性,這些特性告訴我們關(guān)于DTD的信息: 

2.web-app定義該文檔(部署描述符,不是DTD文件)的根元素 

PUBLIC意味著DTD文件可以被公開使用 

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"意味著DTD由Sun Microsystems, Inc.維護(hù)。該信息也表示它描述的文檔類型是DTD Web Application 2.3,而且DTD是用英文書寫的。 

URL"

部署描述符的根元素是<web-app>。DTD文件規(guī)定<web-app>元素的子元素的語(yǔ)法如下: 

<!ELEMENT web-app (icon?, display-name?, description?, 
distributable?, context-param*, filter*, filter-mapping*, 
listener*, servlet*, servlet-mapping*, session-config?, 
mime-mapping*, welcome-file-list?, 
error-page*, taglib*, resource-env-ref*, resource-ref*, 
security-constraint*, login-config?, security-role*,env-entry*, 
ejb-ref*, ejb-local-ref*)> 

    正如您所看到的,這個(gè)元素含有23個(gè)子元素,而且子元素都是可選的。問(wèn)號(hào)(?)表示子元素是可選的,而且只能出現(xiàn)一次。星號(hào)(*)表示子元素可在部署描述符中出現(xiàn)零次或多次。有些子元素還可以有它們自己的子元素。web.xml文件中<web-app>元素聲明的是下面每個(gè)子元素的聲明。下面講述部署描述符中可能包含的所有子元素。

注意:

在Servlet 2.3中,子元素必須按照DTD文件語(yǔ)法描述中指定的順序出現(xiàn)。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>兩個(gè)子元素,則<servlet>子元素必須出現(xiàn)在<servlet-mapping>子元素之前。在Servlet2.4中,順序并不重要。

3. <display-name></display-name>

<display-name>test-hwp-web-application</display-name>定義了web應(yīng)用的名稱,可以在

http://localhost:8080/manager/html中顯示。如下所示:

4.<distributable/>

<distributable/>可以使用distributable元素來(lái)告訴servlet/JSP容器,Web容器中部署的應(yīng)用程序適合在分布式環(huán)境下運(yùn)行。

5.<context-param></context-param>

<!--****************************上下文初始化參數(shù)配***************************--> 
<context-param> 
 <param-name>webAppRootKey</param-name> 
 <param-value>business.root</param-value> 
</context-param> 
<!-- spring config --> 
<context-param> 
 <param-name>contextConfigLocation</param-name> 
 <param-value>/WEB-INF/spring-configuration/*.xml</param-value> 
</context-param> 

 <context-param>解釋:

<context-param>元素含有一對(duì)參數(shù)名和參數(shù)值,用作應(yīng)用的Servlet上下文初始化參數(shù),參數(shù)名在整個(gè)Web應(yīng)用中必須是惟一的,在web應(yīng)用的整個(gè)生命周期中上下文初始化參數(shù)都存在,任意的Servlet和jsp都可以隨時(shí)隨地訪問(wèn)它。<param-name>子元素包含有參數(shù)名,而<param-value>子元素包含的是參數(shù)值。作為選擇,可用<description>子元素來(lái)描述參數(shù)。

什么情況下使用,為什么使用<context-param>:

比如:定義一個(gè)管理員email地址用來(lái)從程序發(fā)送錯(cuò)誤,或者與你整個(gè)應(yīng)用程序有關(guān)的其他設(shè)置。使用自己定義的設(shè)置文件需要額外的代碼和管理;直接在你的程序中使用硬編碼(Hard-coding)參數(shù)值會(huì)給你之后修改程序帶來(lái)麻煩,更困難的是,要根據(jù)不同的部署使用不同的設(shè)置;通過(guò)這種辦法,可以讓其他開發(fā)人員更容易找到相關(guān)的參數(shù),因?yàn)樗且粋€(gè)用于設(shè)置這種參數(shù)的標(biāo)準(zhǔn)位置。

Spring配置文件:

配置Spring,必須需要<listener>,而<context-param>可有可無(wú),如果在web.xml中不寫<context-param>配置信息,默認(rèn)的路徑是/WEB-INF/applicationContext.xml,在WEB-INF目錄下創(chuàng)建的xml文件的名稱必須是applicationContext.xml。如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個(gè)context參數(shù):在<param-value>里指定相應(yīng)的xml文件名,如果有多個(gè)xml文件,可以寫在一起并以“,”號(hào)分隔,比如在business-client工程中,我們采用了自定義配置方式,<context-param>配置如下:

<!-- spring config --> 
<context-param> 
 <param-name>contextConfigLocation</param-name> 
 <param-value>/WEB-INF/spring-configuration/*.xml</param-value> 
</context-param> 
<listener> 
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
 </listener> 

對(duì)應(yīng)工程目錄結(jié)構(gòu)如下所示:

webAppRootKey配置:

部署在同一容器中的多個(gè)Web項(xiàng)目,要配置不同的webAppRootKey,web.xml文件中最好定義webAppRootKey參數(shù),如果不定義,將會(huì)缺省為“webapp.root”,如下:

<!-- 應(yīng)用路徑 --> 
 <context-param> 
  <param-name>webAppRootKey</param-name> 
  <param-value>webapp.root</param-value> 
 </context-param> 
 

當(dāng)然也不能重復(fù),否則報(bào)類似下面的錯(cuò)誤:

Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!  

意思是“webapp.root”這個(gè)key已經(jīng)指向了項(xiàng)目1,不可以再指向項(xiàng)目2。多個(gè)項(xiàng)目要對(duì)webAppRootKey進(jìn)行配置,我們工程主要是讓log4j能將日志寫到對(duì)應(yīng)項(xiàng)目根目錄下,比如:我們的項(xiàng)目的webAppRootKey為

<!—business-client應(yīng)用路徑 --> 
 <context-param> 
  <param-name>webAppRootKey</param-name> 
  <param-value> business.root </param-value> 
 </context-param> 
<!—public-base應(yīng)用路徑 --> 
 <context-param> 
  <param-name>webAppRootKey</param-name> 
  <param-value> pubbase.root</param-value> 
 </context-param> 

  這樣就不會(huì)出現(xiàn)沖突了。就可以在運(yùn)行時(shí)動(dòng)態(tài)地找到項(xiàng)目路徑,在log4j.properties配置文件中可以按下面的方式使用${webapp.root}:

log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log

 就可以在運(yùn)行時(shí)動(dòng)態(tài)地找出項(xiàng)目的路徑。

多個(gè)配置文件交叉引用處理:

如果web.xml中有contextConfigLocation參數(shù)指定的Spring配置文件,則會(huì)去加載相應(yīng)的配置文件,而不會(huì)去加載/WEB-INF/下的applicationContext.xml。但是如果沒(méi)有指定的話,默認(rèn)會(huì)去/WEB-INF/下加載applicationContext.xml。
在一個(gè)團(tuán)隊(duì)使用Spring的實(shí)際項(xiàng)目中,應(yīng)該需要多個(gè)Spring的配置文件,如何使用和交叉引用的問(wèn)題:

多個(gè)配置文件可以在web.xml里用空格分隔寫入,如:

 <context-param> 
<param-name>contextConfigLocation </param-name> 
<param-value> applicationContext-database.xml,applicationContext.xml</param-value> 
<context-param> 

多個(gè)配置文件里的交叉引用可以用ref的external或bean解決,例如:

applicationContext.xml

<bean id="userService" class="domain.user.service.impl.UserServiceImpl"> 
<property name="dbbean"> 
<ref bean="dbBean"/> 
</property> 
</bean> 

dbBean在applicationContext-database.xml中。

在不同環(huán)境下如何獲?。?/p>

范例:

<context-param> 
<param-name>param_name</param-name> 
<param-value>param_value</param-value> 
</context-param> 

此所設(shè)定的參數(shù),在JSP網(wǎng)頁(yè)中可以使用下列方法來(lái)取得:

${initParam.param_name}

若在Servlet可以使用下列方法來(lái)獲得:

String param_name=getServletContext().getInitParamter("param_name");

Servlet的ServletConfig對(duì)象擁有該Servlet的ServletContext的一個(gè)引用,所以可這樣取得上下文初始化參數(shù):getServletConfig().getServletContext().getInitParameter()也可以在Servlet中直接調(diào)用getServletContext().getInitParameter(),兩者是等價(jià)的。

6.<session-config></session-config>

<!-- Set timeout to 120 minutes --> 
<session-config> 
<session-timeout>120</session-timeout> 
</session-config> 

<session-config> 用于設(shè)置容器的session參數(shù),比如:<session-timeout>用于指定http session的失效時(shí)間。默認(rèn)時(shí)間設(shè)置在<jakarta>/conf/web.xml (30 minutes)。<session-timeout>用來(lái)指定默認(rèn)的會(huì)話超時(shí)時(shí)間間隔,以分鐘為單位。該元素值必須為整數(shù)。如果 session-timeout元素的值為零或負(fù)數(shù),則表示會(huì)話將永遠(yuǎn)不會(huì)超時(shí)。

7.<listener></listener>

<!--****************************監(jiān)聽器配置*********************************--> 
<!-- Spring的log4j監(jiān)聽器 --> 
<listener> 
 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<listener> 
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<!-- 與CAS Single Sign Out Filter配合,注銷登錄信息 --> 
<listener> 
<listener-class>com.yonyou.mcloud.cas.client.session.SingleSignOutHttpSessionListener</listener-class> 
</listener> 

1.         Listener介紹:

<listener>為web應(yīng)用程序定義監(jiān)聽器,監(jiān)聽器用來(lái)監(jiān)聽各種事件,比如:application和session事件,所有的監(jiān)聽器按照相同的方式定義,功能取決去它們各自實(shí)現(xiàn)的接口,常用的Web事件接口有如下幾個(gè):

ServletContextListener:用于監(jiān)聽Web應(yīng)用的啟動(dòng)和關(guān)閉;

ServletContextAttributeListener:用于監(jiān)聽ServletContext范圍(application)內(nèi)屬性的改變;

ServletRequestListener:用于監(jiān)聽用戶的請(qǐng)求;

ServletRequestAttributeListener:用于監(jiān)聽ServletRequest范圍(request)內(nèi)屬性的改變;

HttpSessionListener:用于監(jiān)聽用戶session的開始和結(jié)束;

HttpSessionAttributeListener:用于監(jiān)聽HttpSession范圍(session)內(nèi)屬性的改變。

<listener>主要用于監(jiān)聽Web應(yīng)用事件,其中有兩個(gè)比較重要的WEB應(yīng)用事件:應(yīng)用的啟動(dòng)和停止(starting up or shutting down)和Session的創(chuàng)建和失效(created or destroyed)。應(yīng)用啟動(dòng)事件發(fā)生在應(yīng)用第一次被Servlet容器裝載和啟動(dòng)的時(shí)候;停止事件發(fā)生在Web應(yīng)用停止的時(shí)候。Session創(chuàng)建事件發(fā)生在每次一個(gè)新的session創(chuàng)建的時(shí)候,類似地Session失效事件發(fā)生在每次一個(gè)Session失效的時(shí)候。為了使用這些Web應(yīng)用事件做些有用的事情,我們必須創(chuàng)建和使用一些特殊的“監(jiān)聽類”。它們是實(shí)現(xiàn)了以下兩個(gè)接口中任何一個(gè)接口的簡(jiǎn)單java類:javax.servlet.ServletContextListener或javax.servlet.http.HttpSessionListener,如果想讓你的類監(jiān)聽?wèi)?yīng)用的啟動(dòng)和停止事件,你就得實(shí)現(xiàn)ServletContextListener接口;想讓你的類去監(jiān)聽Session的創(chuàng)建和失效事件,那你就得實(shí)現(xiàn)HttpSessionListener接口。

2.     Listener配置:

配置Listener只要向Web應(yīng)用注冊(cè)Listener實(shí)現(xiàn)類即可,無(wú)序配置參數(shù)之類的東西,因?yàn)長(zhǎng)istener獲取的是Web應(yīng)用ServletContext(application)的配置參數(shù)。為Web應(yīng)用配置Listener的兩種方式:

  •   使用@WebListener修飾Listener實(shí)現(xiàn)類即可。
  •   在web.xml文檔中使用<listener>進(jìn)行配置。

我們選擇web.xml這種配置方式,只有一個(gè)元素<listener-class>指定Listener的實(shí)現(xiàn)類,如下所示:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

這里的<listener>用于Spring的加載,Spring加載可以利用ServletContextListener實(shí)現(xiàn),也可以采用load-on-startup Servlet 實(shí)現(xiàn),但是當(dāng)<filter>需要用到bean時(shí),但加載順序是:先加載<filter>后加載<servlet>,則<filter>中初始化操作中的bean為null;所以,如果過(guò)濾器中要使用到bean,此時(shí)就可以根據(jù)加載順序<listener> -> <filter> -> <servlet>,將spring的加載改成Listener的方式。

1)     利用ServletContextListener實(shí)現(xiàn):

<servlet> 
   <servlet-name>context</servlet-narne> 
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 

2)     采用load-on-startup Servlet 實(shí)現(xiàn):

<listener> 
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

我們選擇了第二種方式,在J2EE工程中web服務(wù)器啟動(dòng)的時(shí)候最先調(diào)用web.xml,上面這段配置的意思是加載spring的監(jiān)聽器,其中ContextLoaderListener的作用就是啟動(dòng)Web容器時(shí),自動(dòng)裝配applicationContext.xml的配置信息,執(zhí)行它所實(shí)現(xiàn)的方法。

8.<filter></filter>

<!--****************************過(guò)濾器配置*********************************--> 
 <!-- 字符集過(guò)濾器 --> 
 <filter> 
 <filter-name>CharacterEncodingFilter</filter-name> 
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
 <init-param> 
  <param-name>encoding</param-name> 
  <param-value>UTF-8</param-value> 
 </init-param> 
 <init-param> 
  <param-name>forceEncoding</param-name> 
  <param-value>true</param-value> 
 </init-param> 
 </filter> 
 <!-- 單點(diǎn)登出過(guò)濾器 --> 
 <filter> 
 <filter-name>CAS Single Sign Out Filter</filter-name> 
 <filter-class>com.yonyou.mcloud.cas.client.session.SingleSignOutFilter</filter-class> 
 </filter> 
 <!-- 認(rèn)證過(guò)濾器 --> 
 <filter> 
 <filter-name>CAS Authentication Filter</filter-name> 
<filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class> 
 <init-param> 
  <param-name>casServerLoginUrl</param-name> 
  <param-value>https://dev.yonyou.com:443/sso-server/login</param-value> 
 </init-param> 
 <init-param> 
  <!--這里的server是服務(wù)端的IP --> 
  <param-name>serverName</param-name> 
  <param-value>http://10.1.215.40:80</param-value> 
 </init-param> 
 </filter> 
 <!-- 驗(yàn)證ST/PT過(guò)濾器 --> 
 <filter> 
 <filter-name>CAS Validation Filter</filter-name> 
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 
 <init-param> 
  <param-name>casServerUrlPrefix</param-name> 
  <param-value>https://dev.yonyou.com:443/sso-server</param-value> 
 </init-param> 
 <init-param> 
  <param-name>serverName</param-name> 
  <param-value>http://10.1.215.40:80</param-value> 
 </init-param> 
 <init-param> 
  <param-name>proxyCallbackUrl</param-name> 
  <param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value> 
 </init-param> 
 <init-param> 
  <param-name>proxyReceptorUrl</param-name> 
  <param-value>/proxyCallback</param-value> 
 </init-param> 
 <init-param> 
  <param-name>proxyGrantingTicketStorageClass</param-name> 
<param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value> 
 </init-param> 
 <!-- 解決中文問(wèn)題 --> 
 <init-param> 
  <param-name>encoding</param-name> 
  <param-value>UTF-8</param-value> 
 </init-param> 
 </filter> 
 <filter> 
 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 
 <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 
 </filter> 
 <filter> 
 <filter-name>CAS Assertion Thread Local Filter</filter-name> 
 <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 
 </filter> 
 <filter> 
 <filter-name>NoCache Filter</filter-name> 
 <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class> 
 </filter> 
 <!--****************************映射關(guān)系配置********************************--> 
 <filter-mapping> 
 <filter-name>CharacterEncodingFilter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
 <filter-name>NoCache Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
 <filter-name>CAS Single Sign Out Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
 <filter-name>CAS Validation Filter</filter-name> 
 <url-pattern>/proxyCallback</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
 <filter-name>CAS Authentication Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
 <filter-name>CAS Validation Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
 <filter-name>CAS Assertion Thread Local Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 

1.      Filter介紹:

Filter可認(rèn)為是Servle的一種“加強(qiáng)版”,主要用于對(duì)用戶請(qǐng)求request進(jìn)行預(yù)處理,也可以對(duì)Response進(jìn)行后處理,是個(gè)典型的處理鏈。使用Filter的完整流程是:Filter對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,接著將請(qǐng)求HttpServletRequest交給Servlet進(jìn)行處理并生成響應(yīng),最后Filter再對(duì)服務(wù)器響應(yīng)HttpServletResponse進(jìn)行后處理。Filter與Servlet具有完全相同的生命周期,且Filter也可以通過(guò)<init-param>來(lái)配置初始化參數(shù),獲取Filter的初始化參數(shù)則使用FilterConfig的getInitParameter()。
換種說(shuō)法,Servlet里有request和response兩個(gè)對(duì)象,F(xiàn)ilter能夠在一個(gè)request到達(dá)Servlet之前預(yù)處理request,也可以在離開Servlet時(shí)處理response,F(xiàn)ilter其實(shí)是一個(gè)Servlet鏈。以下是Filter的一些常見應(yīng)用場(chǎng)合,

(1)認(rèn)證Filter

(2)日志和審核Filter

(3)圖片轉(zhuǎn)換Filter

(4)數(shù)據(jù)壓縮Filter

(5)密碼Filter

(6)令牌Filter

(7)觸發(fā)資源訪問(wèn)事件的Filter

(8)XSLT Filter

(9)媒體類型鏈Filter

Filter可負(fù)責(zé)攔截多個(gè)請(qǐng)求或響應(yīng);一個(gè)請(qǐng)求或響應(yīng)也可被多個(gè)Filter攔截。創(chuàng)建一個(gè)Filter只需兩步:

創(chuàng)建Filter處理類

Web.xml文件中配置Filter

Filter必須實(shí)現(xiàn)javax.servlet.Filter接口,在該接口中定義了三個(gè)方法:

void init(FilterConfig config):用于完成Filter的初始化。FilteConfig用于訪問(wèn)Filter的配置信息。

void destroy():用于Filter銷毀前,完成某些資源的回收。

void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實(shí)現(xiàn)過(guò)濾功能的核心方法,該方法就是對(duì)每個(gè)請(qǐng)求及響應(yīng)增加額外的處理。該方法實(shí)現(xiàn)對(duì)用戶請(qǐng)求request進(jìn)行預(yù)處理,也可以實(shí)現(xiàn)對(duì)服務(wù)器響應(yīng)response進(jìn)行后處理---它們的分界線為是否調(diào)用了chain.doFilter(request,response),執(zhí)行該方法之前,即對(duì)用戶請(qǐng)求request進(jìn)行預(yù)處理,執(zhí)行該方法之后,即對(duì)服務(wù)器響應(yīng)response進(jìn)行后處理。

2.      Filter配置:

Filter可認(rèn)為是Servlet的“增強(qiáng)版”,因此Filter配置與Servlet的配置非常相似,需要配置兩部分:配置Filter名稱和Filter攔截器URL模式。區(qū)別在于Servlet通常只配置一個(gè)URL,而Filter可以同時(shí)配置多個(gè)請(qǐng)求的URL。配置Filter有兩種方式:

  在Filter類中通過(guò)Annotation進(jìn)行配置。

  在web.xml文件中通過(guò)配置文件進(jìn)行配置。

我們使用的是web.xml這種配置方式,下面重點(diǎn)介紹<filter>內(nèi)包含的一些元素。

  • <filter>用于指定Web容器中的過(guò)濾器,可包含<filter-name>、<filter-class>、<init-param>、<icon>、<display-name>、<description>。
  •   <filter-name>用來(lái)定義過(guò)濾器的名稱,該名稱在整個(gè)程序中都必須唯一。
  •   <filter-class>元素指定過(guò)濾器類的完全限定的名稱,即Filter的實(shí)現(xiàn)類。
  •   <init-param>為Filter配置參數(shù),與<context-param>具有相同的元素描述符<param-name>和<param-value>。
  •   <filter-mapping>元素用來(lái)聲明Web應(yīng)用中的過(guò)濾器映射,過(guò)濾器被映射到一個(gè)servlet或一個(gè)URL 模式。這個(gè)過(guò)濾器的<filter>和<filter-mapping>必須具有相同的<filter-name>,指定該Filter所攔截的URL。過(guò)濾是按照部署描述符的<filter-mapping>出現(xiàn)的順序執(zhí)行的。

1)  字符集過(guò)濾器

<!-- 字符集過(guò)濾器 --> 
 <filter> 
 <filter-name>CharacterEncodingFilter</filter-name> 
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
 <init-param> 
  <param-name>encoding</param-name> 
  <param-value>UTF-8</param-value> 
 </init-param> 
 <init-param> 
  <param-name>forceEncoding</param-name> 
  <param-value>true</param-value> 
 </init-param> 
 </filter> 
<filter-mapping> 
 <filter-name>CharacterEncodingFilter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
CharacterEncodingFilter類可以通過(guò)簡(jiǎn)單配置來(lái)幫我們實(shí)現(xiàn)字符集轉(zhuǎn)換的功能,參數(shù)encoding用于指定編碼類型,參數(shù)forceEncoding設(shè)為true時(shí),強(qiáng)制執(zhí)行request.setCharacterEncoding(this.encoding)和reponse.setCharacterEncoding(this.encoding)中的方法。
) 緩存控制
<filter> 
 <filter-name>NoCache Filter</filter-name> 
 <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class> 
</filter> 
 <filter-mapping> 
<filter-name>NoCache Filter</filter-name> 
<!—表示對(duì)URL全部過(guò)濾--> 
 <url-pattern>/*</url-pattern> 
</filter-mapping> 
) 登錄認(rèn)證
<!-- 認(rèn)證過(guò)濾器 -->
<filter> 
 <filter-name>CAS Authentication Filter</filter-name> 
<filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class> 
<init-param> 
  <param-name>casServerLoginUrl</param-name> 
  <param-value>https://dev.yonyou.com:443/sso-server/login</param-value> 
 </init-param> 
 <init-param> 
  <!--這里的server是服務(wù)端的IP --> 
  <param-name>serverName</param-name> 
  <param-value>http://10.1.215.40:80</param-value> 
 </init-param> 
 </filter> 
 <filter-mapping> 
  <filter-name>CAS Authentication Filter</filter-name> 
  <url-pattern>/*</url-pattern> 
 </filter-mapping> 

登錄認(rèn)證,未登錄用戶導(dǎo)向CAS Server進(jìn)行認(rèn)證。

4)  單點(diǎn)登出

<filter> 
   <filter-name>CAS Single Sign Out Filter</filter-name> 
   <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> 
</filter> 
<filter-mapping> 
   <filter-name>CAS Single Sign Out Filter</filter-name> 
   <url-pattern>/*</url-pattern> 
 
</filter-mapping> 
<listener> 
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> 
</listener> 

CAS Server通知CAS Client,刪除session,注銷登錄信息。

)  封裝request

<filter> 
 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 
 <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 
</filter> 
<filter-mapping> 
 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
</filter-mapping> 

封裝request, 支持getUserPrincipal等方法。

6)  存放Assertion到ThreadLocal中

<filter> 
 <filter-name>CAS Assertion Thread Local Filter</filter-name> 
 <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 
</filter> 
<filter-mapping> 
 <filter-name>CAS Assertion Thread Local Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
</filter-mapping> 

7)  禁用瀏覽器緩存

<filter> 
 <filter-name>NoCache Filter</filter-name> 
 <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class> 
 </filter> 
 <filter-mapping> 
 <filter-name>NoCache Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 

8)  CAS Client向CAS Server進(jìn)行ticket驗(yàn)證

<!-- 驗(yàn)證ST/PT過(guò)濾器 --> 
<filter> 
 <filter-name>CAS Validation Filter</filter-name> 
 <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 
 <init-param> 
  <param-name>casServerUrlPrefix</param-name> 
  <param-value>https://dev.yonyou.com:443/sso-server</param-value> 
 </init-param> 
 <init-param> 
  <param-name>serverName</param-name> 
  <param-value>http://10.1.215.40:80</param-value> 
 </init-param> 
 <init-param> 
  <param-name>proxyCallbackUrl</param-name> 
  <param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value> 
 </init-param> 
 <init-param> 
  <param-name>proxyReceptorUrl</param-name> 
  <param-value>/proxyCallback</param-value> 
 </init-param> 
 <init-param> 
  <param-name>proxyGrantingTicketStorageClass</param-name> 
<param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value> 
 </init-param> 
 <!-- 解決中文問(wèn)題 --> 
 <init-param> 
  <param-name>encoding</param-name> 
  <param-value>UTF-8</param-value> 
 </init-param> 
</filter> 
<filter-mapping> 
 <filter-name>CAS Validation Filter</filter-name> 
 <url-pattern>/proxyCallback</url-pattern> 
</filter-mapping> 
<filter-mapping> 
 <filter-name>CAS Validation Filter</filter-name> 
 <url-pattern>/*</url-pattern> 
</filter-mapping> 

 9.<servlet></servlet>

<!--****************************servlet配置******************************--> 
<!-- Spring view分發(fā)器 對(duì)所有的請(qǐng)求都由business對(duì)應(yīng)的類來(lái)控制轉(zhuǎn)發(fā) --> 
<servlet> 
 <servlet-name>business</servlet-name> 
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
 <init-param> 
  <param-name>publishContext</param-name> 
  <param-value>false</param-value> 
 </init-param> 
 <load-on-startup>1</load-on-startup> 
</servlet> 
<!-- 用戶登出 --> 
<servlet> 
 <servlet-name>LogOutServlet</servlet-name> 
 <servlet-class>com.yonyou.mcloud.cas.web.servlet.LogOutServlet</servlet-class> 
 <init-param> 
  <param-name>serverLogoutUrl</param-name> 
  <param-value>https://dev.yonyou.com:443/sso-server/logout</param-value> 
 </init-param> 
 <init-param> 
  <param-name>serverName</param-name> 
  <param-value>http://10.1.215.40:80/business/</param-value> 
 </init-param> 
</servlet> 
<!--****************************servlet映射關(guān)系配置*************************--> 
<servlet-mapping> 
 <servlet-name>LogOutServlet</servlet-name> 
 <url-pattern>/logout</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
 <servlet-name>business</servlet-name> 
 <url-pattern>/</url-pattern> 
</servlet-mapping> 

1.Servlet介紹:

Servlet通常稱為服務(wù)器端小程序,是運(yùn)行在服務(wù)器端的程序,用于處理及響應(yīng)客戶的請(qǐng)求。Servlet是個(gè)特殊的java類,繼承于HttpServlet??蛻舳送ǔV挥蠫ET和POST兩種請(qǐng)求方式,Servlet為了響應(yīng)則兩種請(qǐng)求,必須重寫doGet()和doPost()方法。大部分時(shí)候,Servlet對(duì)于所有的請(qǐng)求響應(yīng)都是完全一樣的,此時(shí)只需要重寫service()方法即可響應(yīng)客戶端的所有請(qǐng)求。

另外HttpServlet有兩個(gè)方法

init(ServletConfig config):創(chuàng)建Servlet實(shí)例時(shí),調(diào)用該方法的初始化Servlet資源。

destroy():銷毀Servlet實(shí)例時(shí),自動(dòng)調(diào)用該方法的回收資源。

通常無(wú)需重寫init()和destroy()兩個(gè)方法,除非需要在初始化Servlet時(shí),完成某些資源初始化的方法,才考慮重寫init()方法,如果重寫了init()方法,應(yīng)在重寫該方法的第一行調(diào)用super.init(config),該方法將調(diào)用HttpServlet的init()方法。如果需要在銷毀Servlet之前,先完成某些資源的回收,比如關(guān)閉數(shù)據(jù)庫(kù)連接,才需要重寫destory方法()。

Servlet的生命周期:

創(chuàng)建Servlet實(shí)例有兩個(gè)時(shí)機(jī):

客戶端第一次請(qǐng)求某個(gè)Servlet時(shí),系統(tǒng)創(chuàng)建該Servlet的實(shí)例,大部分Servlet都是這種Servlet。

Web應(yīng)用啟動(dòng)時(shí)立即創(chuàng)建Servlet實(shí)例,即load-on-start Servlet。

每個(gè)Servlet的運(yùn)行都遵循如下生命周期:

1.創(chuàng)建Servlet實(shí)例。

2.Web容器調(diào)用Servlet的init()方法,對(duì)Servlet進(jìn)行初始化。

3.Servlet初始化后,將一直存在于容器中,用于響應(yīng)客戶端請(qǐng)求,如果客戶端發(fā)送GET請(qǐng)求,容器調(diào)用Servlet的doGet()方法處理并響應(yīng)請(qǐng)求;如果客戶端發(fā)送POST請(qǐng)求,容器調(diào)用Servlet的doPost()方法處理并響應(yīng)請(qǐng)求?;蛘呓y(tǒng)一使用service()方法處理來(lái)響應(yīng)用戶請(qǐng)求。

4.Web容器決定銷毀Servlet時(shí),先調(diào)用Servlet的destory()方法,通常在關(guān)閉Web應(yīng)用時(shí)銷毀Servlet實(shí)例。

2.Servlet配置:

為了讓Servlet能響應(yīng)用戶請(qǐng)求,還必須將Servlet配置在web應(yīng)用中,配置Servlet需要修改web.xml文件。

從Servlet3.0開始,配置Servlet有兩種方式:

  • 在Servlet類中使用@WebServlet Annotation進(jìn)行配置。
  • 在web.xml文件中進(jìn)行配置。

我們用web.xml文件來(lái)配置Servlet,需要配置<servlet>和<servlet-mapping>。

<servlet>用來(lái)聲明一個(gè)Servlet。<icon>、<display-name>和<description>元素的用法和<filter>的用法相同。<init-param>元素與<context-param>元素具有相同的元素描述符,可以使用<init-param>子元素將初始化參數(shù)名和參數(shù)值傳遞給Servlet,訪問(wèn)Servlet配置參數(shù)通過(guò)ServletConfig對(duì)象來(lái)完成,ServletConfig提供如下方法:

java.lang.String.getInitParameter(java.lang.String name):用于獲取初始化參數(shù)

ServletConfig獲取配置參數(shù)的方法和ServletContext獲取配置參數(shù)的方法完全一樣,只是ServletConfig是取得當(dāng)前Servlet的配置參數(shù),而ServletContext是獲取整個(gè)Web應(yīng)用的配置參數(shù)。

1.<description>、<display-name>和<icon>

<description>:為Servlet指定一個(gè)文本描述。

<display-name>:為Servlet提供一個(gè)簡(jiǎn)短的名字被某些工具顯示。

<icon>:為Servlet指定一個(gè)圖標(biāo),在圖形管理工具中表示該Servlet。

2.<servlet-name>、<servlet-class>和<jsp-file>元素

<servlet>必須含有<servlet-name>和<servlet-class>,或者<servlet-name>和<jsp-file>。 描述如下:

<servlet-name>用來(lái)定義servlet的名稱,該名稱在整個(gè)應(yīng)用中必須是惟一的

<servlet-class>用來(lái)指定servlet的完全限定的名稱。

<jsp-file>用來(lái)指定應(yīng)用中JSP文件的完整路徑。這個(gè)完整路徑必須由/開始。

3.<load-on-startup>

如果load-on-startup元素存在,而且也指定了jsp-file元素,則JSP文件會(huì)被重新編譯成Servlet,同時(shí)產(chǎn)生的Servlet也被載入內(nèi)存。<load-on-startup>的內(nèi)容可以為空,或者是一個(gè)整數(shù)。這個(gè)值表示由Web容器載入內(nèi)存的順序。

舉個(gè)例子:如果有兩個(gè)Servlet元素都含有<load-on-startup>子元素,則<load-on-startup>子元素值較小的Servlet將先被加載。如果<load-on-startup>子元素值為空或負(fù)值,則由Web容器決定什么時(shí)候加載Servlet。如果兩個(gè)Servlet的<load-on-startup>子元素值相同,則由Web容器決定先加載哪一個(gè)Servlet。

<load-on-startup>1</load-on-startup>表示啟動(dòng)容器時(shí),初始化Servlet。

4.<servlet-mapping>

<servlet-mapping>含有<servlet-name>和<url-pattern>

<servlet-name>:Servlet的名字,唯一性和一致性,與<servlet>元素中聲明的名字一致。

<url-pattern>:指定相對(duì)于Servlet的URL的路徑。該路徑相對(duì)于web應(yīng)用程序上下文的根路徑。<servlet-mapping>將URL模式映射到某個(gè)Servlet,即該Servlet處理的URL。

5.加載Servlet的過(guò)程 

容器的Context對(duì)象對(duì)請(qǐng)求路徑(URL)做出處理,去掉請(qǐng)求URL的上下文路徑后,按路徑映射規(guī)則和Servlet映射路徑(<url- pattern>)做匹配,如果匹配成功,則調(diào)用這個(gè)Servlet處理請(qǐng)求。

3.DispatcherServlet在web.xml中的配置:

<!-- Spring view分發(fā)器 對(duì)所有的請(qǐng)求都由business對(duì)應(yīng)的類來(lái)控制轉(zhuǎn)發(fā) --> 
<servlet> 
 <servlet-name>business</servlet-name> 
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
 <init-param> 
  <param-name>publishContext</param-name> 
  <param-value>false</param-value> 
 </init-param> 
 <load-on-startup>1</load-on-startup> 
</servlet> 

配置Spring MVC,指定處理請(qǐng)求的Servlet,有兩種方式:

  •   默認(rèn)查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml
  •   可以通過(guò)配置修改MVC配置文件的位置,需要在配置DispatcherServlet時(shí)指定MVC配置文件的位置。

    我們?cè)谄脚_(tái)項(xiàng)目?jī)蓚€(gè)工程中分別使用了不同的配置方式,介紹如下:

我們?cè)赽usiness-client工程中按照默認(rèn)方式查找MVC的配置文件,配置文件目錄為: /WEB-INF/business-servlet.xml。工程目錄結(jié)構(gòu)如下所示:

我們?cè)趐ublic-base-server工程中,通過(guò)第2種方式進(jìn)行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,則需要在配置DispatcherServlet時(shí)指定<init-param>標(biāo)簽。具體代碼如下:

<servlet> 
 <servlet-name>spring</servlet-name> 
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  <init-param> 
    <param-name>publishContext</param-name> 
    <param-value>false</param-value> 
</init-param> 
 <init-param> 
      <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:config/spring-servlet.xml</param-value> 
   </init-param> 
  <load-on-startup>1</load-on-startup> 
</servlet> 

工程目錄結(jié)構(gòu)如下:

其中,classpath是web項(xiàng)目的類路徑,可以理解為classes下面。因?yàn)闊o(wú)論這些配置文件放在哪,編譯之后如果沒(méi)有特殊情況的話都直接在classes下面。jar包的話雖然放在lib文件夾里,但實(shí)際上那些類可以直接引用,比如:com.test.ABC,仿佛也在classes下面一樣。

在我們的工程里,經(jīng)過(guò)驗(yàn)證,maven工程這兩個(gè)

 

路徑經(jīng)過(guò)編譯后生成的文件都位于classes目錄下,即這兩個(gè)路徑相當(dāng)于類路徑,在下面創(chuàng)建config文件夾(folder),然后創(chuàng)建自定義的xml配置文件即可。

classpath和classpath*區(qū)別:

同名資源存在時(shí),classpath只從第一個(gè)符合條件的classpath中加載資源,而classpath*會(huì)從所有的classpath中加載符合條件的資源。classpath*,需要遍歷所有的classpath,效率肯定比不上classpath,因此在項(xiàng)目設(shè)計(jì)的初期就盡量規(guī)劃好資源文件所在的路徑,避免使用classpath*來(lái)加載。

4.ContextLoaderListener和DispatcherServlet初始化上下文關(guān)系和區(qū)別:

從上圖可以看出,ContextLoaderListener初始化的上下文加載的Bean是對(duì)于整個(gè)應(yīng)用程序共享的,一般如:DAO層、Service層Bean;DispatcherServlet初始化的上下文加載的Bean是只對(duì)Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,該初始化上下文只加載Web相關(guān)組件。

注意:用戶可以配置多個(gè)DispatcherServlet來(lái)分別處理不同的url請(qǐng)求,每個(gè)DispatcherServlet上下文都對(duì)應(yīng)一個(gè)自己的子Spring容器,他們都擁有相同的父Spring容器(業(yè)務(wù)層,持久(dao)bean所在的容器)。

10.<welcome-file-list></welcome-file-list>

<!-- welcome page --> 
<welcome-file-list> 
 <welcome-file>index.html</welcome-file> 
</welcome-file-list> 

<welcome-file-list>包含一個(gè)子元素<welcome-file>,<welcome-file>用來(lái)指定首頁(yè)文件名稱。<welcome-file-list>元素可以包含一個(gè)或多個(gè)<welcome-file>子元素。如果在第一個(gè)<welcome-file>元素中沒(méi)有找到指定的文件,Web容器就會(huì)嘗試顯示第二個(gè),以此類推。

相關(guān)文章

  • Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間

    Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間

    這篇文章主要為大家詳細(xì)介紹了Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • java實(shí)現(xiàn)對(duì)服務(wù)器的自動(dòng)巡檢郵件通知

    java實(shí)現(xiàn)對(duì)服務(wù)器的自動(dòng)巡檢郵件通知

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)對(duì)服務(wù)器的自動(dòng)巡檢郵件通知,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式

    Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式

    這篇文章主要介紹了Java通過(guò)反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式,JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類,都能夠知道這個(gè)類的所有屬性和方法,需要的朋友可以參考下
    2023-10-10
  • 五種單件模式之Singleton的實(shí)現(xiàn)方法詳解

    五種單件模式之Singleton的實(shí)現(xiàn)方法詳解

    本篇文章是對(duì)Singleton的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Java實(shí)現(xiàn)文件名倒序排序的技術(shù)指南

    Java實(shí)現(xiàn)文件名倒序排序的技術(shù)指南

    在實(shí)際開發(fā)過(guò)程中,我們經(jīng)常需要對(duì)文件進(jìn)行操作和處理,一個(gè)常見的需求是按文件名倒序排列文件列表,以便于文件的管理和查找,本文將介紹如何在Java中實(shí)現(xiàn)文件名倒序排序,并提供詳細(xì)的代碼案例,需要的朋友可以參考下
    2024-08-08
  • SpringBoot?上傳文件判空以及格式檢驗(yàn)流程

    SpringBoot?上傳文件判空以及格式檢驗(yàn)流程

    這篇文章主要介紹了SpringBoot?上傳文件判空以及格式檢驗(yàn)流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解Java進(jìn)階知識(shí)注解

    詳解Java進(jìn)階知識(shí)注解

    這篇文章主要介紹了詳解Java進(jìn)階知識(shí)注解,從注解的定義、元注解、自定義注解、注解實(shí)例這幾個(gè)方面,讓同學(xué)們更加深入的了解注解
    2021-04-04
  • Spring Cloud 網(wǎng)關(guān)服務(wù) zuul  動(dòng)態(tài)路由的實(shí)現(xiàn)方法

    Spring Cloud 網(wǎng)關(guān)服務(wù) zuul 動(dòng)態(tài)路由的實(shí)現(xiàn)方法

    網(wǎng)關(guān)服務(wù)是流量的唯一入口。不能隨便停服務(wù)。所以動(dòng)態(tài)路由就顯得尤為必要。這篇文章主要介紹了Spring Cloud 網(wǎng)關(guān)服務(wù) zuul 三 動(dòng)態(tài)路由的相關(guān)知識(shí),需要的朋友可以參考下
    2019-10-10
  • Java利用哈夫曼編碼實(shí)現(xiàn)字符串壓縮

    Java利用哈夫曼編碼實(shí)現(xiàn)字符串壓縮

    赫夫曼編碼也翻譯為?哈夫曼編碼(Huffman?Coding),又稱霍夫曼編碼,是一種編碼方式,?屬于一種程序算法。本文將利用哈夫曼樹實(shí)現(xiàn)哈夫曼編碼進(jìn)行字符串壓縮,需要的可以參考一下
    2022-09-09
  • Java讀取寄存器數(shù)據(jù)的方法示例詳解

    Java讀取寄存器數(shù)據(jù)的方法示例詳解

    在Java中讀取硬件寄存器數(shù)據(jù)不直接支持,但可以通過(guò)JNI或JNA技術(shù)實(shí)現(xiàn),此過(guò)程需要編寫本地代碼(如C/C++)以模擬硬件交互,然后在Java中調(diào)用這些方法,注意,JNI使用可能引入復(fù)雜性和性能開銷,且需考慮跨平臺(tái)兼容性,感興趣的朋友跟隨小編一起看看吧
    2024-09-09

最新評(píng)論