1

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

@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";
        }                
}

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

4

2 回答 2

1

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

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

鉴于这一切,除非您View的资源与某个jsp或相关资源完全不同,否则在容器实际使用RequestDispatcher.

您将不得不重新考虑您的设计。

于 2013-10-09T17:49:49.200 回答
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。

谢谢,

于 2019-12-14T04:34:27.763 回答