如何检查视图是否存在?

时间:2013-10-09 16:56:21

标签: java spring spring-mvc

我想在实际解决之前检查一个视图是否存在。这是我的控制器,对我希望它如何工作有一些评论。

@RequestMapping(value="/somethinghere/")
    public String getSomething(Model inModel,
            @RequestParam(value="one", defaultValue=Constant.EMPTY_STRING) String one,
            @RequestParam(value="two", defaultValue = Constant.EMPTY_STRING) String two) {
        String view = one + two;
         if (a view with name equal to one + two exists) {
            return view;
        } else {
            return "defaultview";
        }                
}

我想返回一个视图,但只有当我确认确实存在定义了该名称的视图时。我该怎么做?

2 个答案:

答案 0 :(得分:1)

首先,考虑如何在Spring中完成视图分辨率。假设您使用InternalResourceViewResolver,默认情况下或显式声明,创建了InternalResourceView对象,并通过连接InternalResourceViewResolver的前缀,视图名称(由您返回)来解析资源的路径hanbdler)和后缀。

返回View个对象。请注意,对于InternalResourceViewResolver,该对象不能为null,因此无法实现ViewResolver chaining。然后DispatcherServlet使用返回的View对象的render()方法来创建HTTP响应。在这种情况下,它将使用RequestDispatcher并向其转发由View名称描述的资源。如果该资源不存在,Servlet容器将产生404响应。

考虑到所有这些,除非你的Viewjsp或相关资源完全不同,否则在容器实际转发{{1}请求之前,无法检查资源是否存在}}

您必须重新考虑您的设计。

答案 1 :(得分:0)

我知道这很老,但认为这可能对某人有所帮助。我有一个方案,其中CMS提供了有关为给定内容类型呈现哪种视图的方向。在这种情况下,至关重要的是仅在这种情况下采取适当的措施。以下是我以前处理过的内容。

首先,我将以下内容注入控制器

@Autowired
private InternalResourceViewResolver viewResolver;

@Autowired
private ServletContext servletContext;

接下来,我添加了此简单方法来检查视图是否存在

private boolean existsView(String path) {
    try {
        JstlView view = (JstlView) viewResolver.resolveViewName(path, null);
        RequestDispatcher rd = null;
        URL resource = servletContext.getResource(view.getUrl());
        return resource != null;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

我这样使用:

    if(!existsView("components/" + fragment.getTemplate().getId())) {
        logger.warn("View for component " + fragment.getTemplate().getId() + " Not found. Rendering fallback.");
        return new ModelAndView("components/notfoundfallback");
    }

我的notfoundfallback.jsp看起来像这样:

<div class="contact-form">
    <div class="contact-form__container container">
        <div class="contact-form__content" style="background-color: aliceblue;">
            <div class="contact-form__header">
                <h2>No design for content available</h2>
                <span>
                    You are seeing this placeholder component because the content you wish to see
                    doesn't yet have a design for display purposes. This will be rectified as soon as possible.
                </span>
            </div>
        </div>
    </div>
</div>

我希望这对以后的人有所帮助。它可以在标准Spring MVC和SpringBoot MVC中使用。

谢谢