2

我正在尝试让后备解决方案在移动设备上运行,但遇到了一些问题。

我有以下jsp结构

views
-mobile
--about.jsp
-tablet
--about.jsp
--intermediary.jsp
about.jsp
intermediary.jsp

目前我在移动设备中没有 intermediary.jsp,但我在后备目录中有它。AbstractDeviceDelegatingViewResolver 中的 resolveViewName 仅在视图为空时触发。

    public View resolveViewName(String viewName, Locale locale) throws Exception {
    String deviceViewName = getDeviceViewName(viewName);
    View view = delegate.resolveViewName(deviceViewName, locale);
    if (enableFallback && view == null) {
        view = delegate.resolveViewName(viewName, locale);
    }
    if (logger.isDebugEnabled() && view != null) {
        logger.deb

我遇到的问题是我找不到任何 viewResolver 来返回 null。InternalResourceViewResolver 不返回 null 并且 UrlBasedViewResolver 始终返回不存在的 /mobile/intermediary.jsp 的视图名称,这又会引发 404。有人知道我应该使用哪个解析器来使后备解决方案工作吗?

谢谢,

4

1 回答 1

0

看看源码你会找到答案:

 public abstract class AbstractUrlBasedView{
...
         public boolean checkResource(Locale locale) throws Exception {
        return true;
    }
...
}

public class InternalResourceView extends AbstractUrlBasedView {
     //!!not override the checkResource method!!
}

 public class FreeMarkerView extends AbstractTemplateView {
 ...
 @Override
         public boolean checkResource(Locale locale) throws Exception {
            try {
                // Check that we can get the template, even if we might subsequently get it again.
                 getTemplate(getUrl(), locale);
            return true;
        }
        catch (FileNotFoundException ex) {
            if (logger.isDebugEnabled()) {
                logger.debug("No FreeMarker view found for URL: " + getUrl());
            }
            return false;
        }
        catch (ParseException ex) {
            throw new ApplicationContextException(
                    "Failed to parse FreeMarker template for URL [" +  getUrl() + "]", ex);
        }
        catch (IOException ex) {
            throw new ApplicationContextException(
                    "Could not load FreeMarker template for URL [" + getUrl() + "]", ex);
        }
    }
...
 }

这样您就可以扩展 InternalResourceView,如下所示:

public class MyInternalResourceView extends InternalResourceView {
    private static final boolean SEP_IS_SLASH = File.separatorChar == '/';


    protected File getTemplate(String name, Locale locale) throws IOException {
        File source;
        if(getServletContext()!=null){
            name = getServletContext().getRealPath("")+name;
            source =  new File( SEP_IS_SLASH ? name : name.replace('/',
                File.separatorChar));
        }
        else{
            source = new File( SEP_IS_SLASH ? name : name.replace('/',
                File.separatorChar));
        }
        if (!source.isFile()) {
            return null;
        }
        return source;
    }

    @Override
    public boolean checkResource(Locale locale) throws Exception {
        try {
            // Check that we can get the template, even if we might subsequently
            // get it again.
            return getTemplate(getUrl(), locale)!=null;

        } catch (IOException ex) {
             return false;
        }
    }
}

并在 viewResolver 中设置您的视图类

<bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:viewClass="com.xxxx.MyInternalResourceView"  p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"  p:contentType="text/html;charset=UTF-8" />
于 2015-03-18T06:36:31.027 回答