当前位置: 首页 > 工具软件 > sparrow-mvc > 使用案例 >

spring mvc view resolver

张翰音
2023-12-01

根据不同的请求后缀返回不同的View

例如:/test.xml 返回xml数据,/test.json 返回Json数据

package com.lss.web.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.lss.web.viewresolver.MultipleViewResolver;

@Controller
public class ResolverController {
	@Autowired
	private MultipleViewResolver resolver;

	@RequestMapping("/test")
	public String test() {
		return "test";
	}

	@RequestMapping("/test.json")
	public String testJson() {
		return "test.json";
	}

	@RequestMapping("/test.xml")
	public String getSampleJsp() {
		return "test.xml";
	}

	@RequestMapping(value = "/test1")
	public ModelAndView test1(HttpServletRequest request, ModelAndView mv) {
		mv.setViewName("test" + getPostfix(request));
		return mv;
	}

	private String getPostfix(HttpServletRequest request) {
		String uri = request.getRequestURI();
		if (uri.indexOf(".") != -1) {
			String postfix = uri.substring(uri.indexOf(".") + 1);
			if (resolver.checkPostfix(postfix)) {
				return "." + postfix;
			}
		}
		return "";
	}
}
package com.lss.web.view;

import java.util.Map;

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

import org.springframework.web.servlet.view.AbstractUrlBasedView;

public class GenericFileView extends AbstractUrlBasedView {

	// default content type
	private final static String CONTENT_TYPE = "text/plain";

	// content of http response
	private String responseContent;

	public GenericFileView() {
		super();
		setContentType(CONTENT_TYPE);
	}

	@Override
	public void setContentType(String contentType) {
		super.setContentType(contentType);
	}

	@Override
	protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
		response.setContentType(getContentType());
		response.getWriter().write(this.responseContent);
		response.getWriter().close();
	}

	/**
	 * Set http request content
	 * 
	 * @param responseContent
	 */
	public void setResponseContent(String responseContent) {
		this.responseContent = responseContent;
	}

}



package com.lss.web.viewresolver;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Locale;
import java.util.logging.Logger;

import org.springframework.core.Ordered;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.AbstractCachingViewResolver;

import com.lss.web.view.GenericFileView;

public class GenericFileViewResolver extends AbstractCachingViewResolver implements Ordered {

	private Logger logger = Logger.getLogger(GenericFileViewResolver.class.getName());

	private int order = Integer.MIN_VALUE;

	// requested file location under web app
	private String location;

	private String viewName;

	public void setViewName(String viewName) {
		this.viewName = viewName;
	}

	public void setOrder(int order) {
		this.order = order;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public int getOrder() {
		return this.order;
	}

	@Override
	protected View loadView(String viewName, Locale locale) throws Exception {
		if (location == null) {
			throw new Exception("No location specified for GenericFileViewResolver.");
		}
		String requestedFilePath = location + viewName;
		Resource resource = null;
		// String url = "";
		try {
			logger.finest(requestedFilePath);
			resource = getApplicationContext().getResource(requestedFilePath);
			// url = resource.getURI().toString();
		} catch (Exception e) {
			// this exception should be catched and return null in order to call
			// next view resolver
			logger.finest("No file found for file: " + requestedFilePath);
			return null;
		}
		logger.info("Requested file found: " + requestedFilePath + ", viewName:" + viewName);
		// get view from application content, scope=prototype
		GenericFileView view = this.getApplicationContext().getBean(this.viewName, GenericFileView.class);
		view.setUrl(requestedFilePath);
		view.setResponseContent(inputStreamToString(resource.getInputStream(), "UTF-8"));
		return view;
	}

	final static int BUFFER_SIZE = 4096;

	/**
	 * Convert Input to String based on specific encoding
	 * 
	 * @param in
	 * @param encoding
	 * @return
	 * @throws Exception
	 */
	public static String inputStreamToString(InputStream in, String encoding) throws Exception {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] data = new byte[BUFFER_SIZE];
		int count = -1;
		while ((count = in.read(data, 0, BUFFER_SIZE)) != -1)
			outStream.write(data, 0, count);

		data = null;
		return new String(outStream.toByteArray(), encoding);
	}

}

package com.lss.web.viewresolver;

import java.util.Locale;
import java.util.Map;

import org.springframework.core.Ordered;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.AbstractCachingViewResolver;

public class MultipleViewResolver extends AbstractCachingViewResolver implements Ordered {

	private int order = Integer.MIN_VALUE;

	public int getOrder() {
		return order;
	}

	public void setOrder(int order) {
		this.order = order;
	}

	private Map<String, ViewResolver> resolvers;

	public void setResolvers(Map<String, ViewResolver> resolvers) {
		this.resolvers = resolvers;
	}

	@Override
	protected View loadView(String viewName, Locale locale) throws Exception {
		String fileExtension = StringUtils.getFilenameExtension(viewName);
		// return null to invoke next resolver if no extension found
		if (fileExtension == null) {
			return null;
		}
		// get resolver by extension
		ViewResolver resolver = resolvers.get(fileExtension);
		// return null to invoke next resolver if no resolver found
		return resolver == null ? null : resolver.resolveViewName(viewName, locale);

	}

	public boolean checkPostfix(String postfix) {
		return resolvers.containsKey(postfix);
	}

}

将以下配置假如到Servlet.XML

<!-- Customized View Resolver to resolve .json, .xml and .properties files -->

    <bean id="viewResolver"

          class="com.lss.web.viewresolver.MultipleViewResolver" p:order="0">

        <property name="resolvers">

            <map>

            

              <entry key="json">

                    <bean class="com.lss.web.viewresolver.GenericFileViewResolver"

                          p:location="/WEB-INF/json/" p:cache="false">

                        <property name="viewName" value="jsonFileView"/>

                    </bean>

                </entry>          


                <entry key="xml">

                    <bean class="com.lss.web.viewresolver.GenericFileViewResolver"

                          p:location="/WEB-INF/xml/" p:cache="false">

                        <property name="viewName" value="xmlFileView"/>

                    </bean>

                </entry>

                

            </map>

        </property>

    </bean>


    <!-- View Resolver for JSP files -->

    <bean id="jspViewResolver"

          class="org.springframework.web.servlet.view.InternalResourceViewResolver"

          p:order="1">

        <property name="prefix" value="/WEB-INF/jsp/"/>

        <property name="suffix" value=".jsp"/>

    </bean>


   <bean id="xmlFileView" class="com.lss.web.view.GenericFileView"

          p:contentType="text/xml" p:url="" scope="prototype"/>



    <bean id="jsonFileView" class="com.lss.web.view.GenericFileView"

          p:contentType="application/json" p:url="" scope="prototype"/>


 类似资料:

相关阅读

相关文章

相关问答