在Spring MVC中,public interface View 和 public interface ViewResolver 是兩個相互關聯但功能不同的介面。它們共同在檢視解析和渲染過程中發揮作用,但各自承擔的責任不同。
-
View 介面
View 介面定義瞭如何渲染一個特定的檢視。它通常包含一個 render 方法,該方法接受一個 ModelMap(或類似的模型資料)和一個 HttpServletRequest/HttpServletResponse 對,然後生成響應的內容。Spring MVC 提供了許多 View 介面的實現,例如 JstlView 用於 JSP,RedirectView 用於重定向,FreeMarkerView 用於 FreeMarker 模板等。 -
ViewResolver 介面
ViewResolver 介面則定義瞭如何將邏輯檢視名稱解析為 View 物件的規則。在Spring MVC中,當Controller處理完請求並返回一個邏輯檢視名稱(通常是一個字串)時,DispatcherServlet 會使用配置的 ViewResolver 來解析這個邏輯檢視名稱,並找到對應的 View 物件。然後,DispatcherServlet 會呼叫該 View 物件的 render 方法來渲染檢視。
Spring MVC 同樣提供了多種 ViewResolver 的實現,例如 InternalResourceViewResolver 用於解析JSP檢視,FreeMarkerViewResolver 用於解析FreeMarker模板等。你也可以實現自定義的 ViewResolver 以滿足特殊需求。
示例
假設你有一個Controller方法,它返回一個字串 "home" 作為邏輯檢視名稱:
@Controller
public class MyController {
@RequestMapping("/")
public String home() {
return "home";
}
}
在Spring MVC的配置中,你可能配置了一個 InternalResourceViewResolver,它會將 "home" 解析為JSP檔案路徑(如 /WEB-INF/views/home.jsp):
xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
在這個例子中,InternalResourceViewResolver 就是 ViewResolver 的一個實現,它將邏輯檢視名稱 "home" 解析為一個 JstlView(或類似的 View 實現),該 View 知道如何渲染 /WEB-INF/views/home.jsp JSP檔案。