自定義視圖和自定義視圖解析器

有的時候 SpringMVC 框架提供的視圖解析器不能滿足我們的需求,這時候我們可以來自定義視圖以及視圖解析器來完成訂製的功能。

主要分為以下三步:

  • 編寫自定義視圖實現類
  • 編寫視圖解析器
  • 在配置文件中將自定義的視圖解析器注入ioc容器中

1、編寫自定義視圖實現類:

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.View;

// 實現 View 介面才能讓框架知道這是一個視圖
public class MyView implements View {

	@Override
	public String getContentType() {
		return "text/html";
	}

	@Override
	public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// 編寫渲染視圖頁面的業務邏輯
		// 可以在這裡取得 model 中保存的數據
                // 可以使用 request 和 response 進行請求和響應
	}

}

2、編寫視圖解析器:

import java.util.Locale;

import org.springframework.core.Ordered;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;

// 實現 ViewResolver 介面來讓框架知道這是一個視圖解析器,實現 Ordered 介面來進行排序
public class MyViewResolver implements ViewResolver, Ordered {

        // 視圖解析器的遍歷順序
	private Integer order;

	@Override
	public int getOrder() {
		return order;
	}

        // 設置視圖解析器的遍歷順序
	public void setOrder(Integer order) {
		this.order = order;
	}

	@Override
	public View resolveViewName(String viewName, Locale locale) throws Exception {
		
		// 進行視圖解析器的業務邏輯,返回視圖對象則進行渲染,若返回 null 則繼續遍歷下一個視圖解析器
		if (viewName.startsWith("myView:")) {
			return new MyView();
		}
		
		return null;
	}

}

3、在配置文件中將自定義的視圖解析器注入ioc容器中:

	<bean class="com.pudding.view.MyViewResolver">
                // order的值越小優先順序越高,InternalResourceViewResolver 的 order 值為 Integer 的最大值。
		<property name="order" value="1"></property>
	</bean>
Tags: