Spring Framework 筆記 (二)
從上面一個 hello 例子應該很難感覺出 Spring 的迷人之處在哪,所以接著就從上面的例子,我們再做一些改進。在上面的例子裡面,要呈現的 hello.jsp 檔案是寫死在 SpringappController 程式裡的,這在以後的程式維護上會缺少彈性,另外除此之外,Web View 部分也同樣可以在 Spring 的設定檔裡面做設定。
首先我們先把 SpringappController 裡面的 hello.jsp 透過 Spring 來做管理。Spring Framework 裡面最重要的概念就是 IoC (or Dependences Injection),所以我們在這邊使用 Setter Injection 的方式,在設定檔裡面來做參數的設定:
<bean id="springappController" class="com.esolution.Controller.SpringappController">
<property name="viewFileName">
<value>hello.jsp</value>
</property>
</bean>
但是我們希望可以在更簡化一點,可以只單純的使用一個代數方式來表現,不需要每次都要把路徑以及副檔名都寫上。因此這邊我們使用 Spring ViewResolver 來簡化設定:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix">
<value>/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
如上面設定所示,加入了 prefix 以及 suffix property 讓 springappController 可以只用 hello 就可以代表 /hello.jsp,除此之外,上面的設定也指定使用 JSTL 來當作 View 端的呈現方式。(若是要使用其他種的 Presentation 方式,只需要在這邊做設定)。
而原本的 springappContoller 設定就轉變為:
<bean id="springappController" class="com.esolution.Controller.SpringappController">
<property name="viewFileName">
<value>hello</value>
</property>
</bean>
如同上面提到的,我們使用 setter injection 來控制,所以現在我們需要在 springappController.java 上面加入 viewFileName property,讓 Spring 可以把 viewFileName 指定給 springappContoller。
package com.esolution.Controller;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class SpringappController implements Controller {
private String viewFileName;
/** Logger for this class and subclasses */
protected final Log logger = LogFactory.getLog(getClass());
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.info("SpringappController - returning hello view");
String now = (new java.util.Date()).toString();
return new ModelAndView(getViewFileName(), "now", now);
}
public String getViewFileName() {
return viewFileName;
}
public void setViewFileName(String viewFileName) {
this.viewFileName = viewFileName;
}
}
現在若是需要變動 view 的部分,原本的 springappContoller 就可以不需要做任何的變動,只需要去改變 spring 設定檔即可。
沒有留言:
張貼留言