`

DispatcherServlet定義檔

阅读更多

DispatcherServlet預設使用servlet名稱加上"-servlet.xml"作為其定義檔名稱,定義檔預設是放在WEB-INF下,您也可以自行指定定義檔名稱與位置,例如:

代碼:
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/hello1-servlet.xml, /WEB-INF/hello2-servlet.xml</param-value>
    </init-param>     
</servlet>



DispatcherServlet各有其namespace與應用程式context,您可以在web.xml中定義多個DispatcherServlet的實例,分別負責不同模組的請求處理工作。

Spring對DispatcherServlet所處理的組件(component)都當作一般的Bean來處理,所以在設定DispatcherServlet的定義檔時,就如同之前的主題中處理Bean定義檔一樣,一致性的組態方式是Spring所提供的優點之一,每個組件的設定都像是Bean,所以您只要查詢API文件,瞭解屬性的關係與作用,並在定義檔中設定好依賴關係,就可以使用這些組件。

一些設定DispatcherServlet的定義檔方式,我們前一個主題中介紹了大半,這邊補充一些額外的設定。

首先,我們之前在設定helloUserAction,在設定viewPage時,必須設定好完整的目錄與檔案名稱,例如:

代碼:
    <bean id="helloUserAction" class="onlyfun.caterpillar.HelloUserAction">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
        <property name="viewPage">
            <value>/WEB-INF/jsp/hellouser.jsp</value>
        </property>
    </bean>



您可以在viewResolver中設定prefix與suffix屬性,分別設定除了檔名之外的前置與後置文字,這樣您的viewPage屬性就可以只打檔案的主要名稱,直接給個實例:

代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hellouser.do">helloUserAction</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.InternalResourceView</value>
        </property>
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>

    </bean>
   
    <bean id="helloUserAction" class="onlyfun.caterpillar.HelloUserAction">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
        <property name="viewPage">
            <value>hellouser</value>
        </property>

    </bean>
</beans>



您也可以將viewResolver的定義獨立出來至一個屬性檔中,使用org.springframework.web.servlet.view.ResourceBundleViewResolver,這樣作的好處是您可以根據您實際的url去處設定不同的表示層技術,例如:

代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hellouser.do">helloUserAction</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
        <property name="basename">
            <value>views</value>
        </property>
    </bean>

   
    <bean id="helloUserAction" class="onlyfun.caterpillar.HelloUserAction">
        <property name="helloWord">
            <value>Hello!</value>
        </property>
        <property name="viewPage">
            <value>hellouser</value>
        </property>

    </bean>
</beans>



我們在ResourceBundleViewResolver的basename屬性設定了views名稱(實際上,views也是basename的預設值),這表示我們將使用views.properties來設定表示層技術的viewClass與url,我們的views.properties如下:

代碼:
hellouser.class=org.springframework.web.servlet.view.InternalResourceView
hellouser.url=/WEB-INF/jsp/hellouser.jsp

welcomeuser.class=org.springframework.web.servlet.view.JstlView
welcomeuser.url=/WEB-INF/jsp/welcomeuser.jsp

otherview.class=org.springframework.web.servlet.view.VelocityView
otherview.url=/WEB-INF/vm/other.vm



利用這個方式,我們可以混合不同的表示層技術在同一個Web應用程式中,views.properties中是class與url值設定,其hellouser與welcomeuser的名稱是我們給ModelAndView的名稱,例如我們設定了hellouser給ModelAndView的話,就會去找hellouser.class與hellouser.url來設定表示層技術與url去處,我們則在這邊是透過helloUserAction的viewPage屬性來注入,避免將名稱寫死在程式中。

如果您的JSP網頁或Servlet中會丟出例外,而您想捕捉這個例外,除了容器與JSP網頁的設定方法之外(參考JSP/Servlet版面中的介紹),您也可以在DispatcherServlet的定義檔中設定錯誤處理網頁,設定一個exceptionResolver Bean,例如SimpleMappingExceptionResolver:

代碼:
....
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.InternalResourceView</value>
        </property>
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>

    </bean>
    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.sql.SQLException">exsql</prop>
                <prop key="java.sql.IOException">exio</prop>
            </props>
        </property>
    </bean>
....



如此設定,只要發生了SQLException,就會連接至/WEB-INF/jsp/exsql.jsp,而發生了IOException,就會連接至/WEB-INF/jsp/exio.jsp。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics