我想在实际解决之前检查一个视图是否存在。这是我的控制器,对我希望它如何工作有一些评论。
@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";
}
}
我想返回一个视图,但只有当我确认确实存在定义了该名称的视图时。我该怎么做?
答案 0 :(得分:1)
首先,考虑如何在Spring中完成视图分辨率。假设您使用InternalResourceViewResolver
,默认情况下或显式声明,创建了InternalResourceView
对象,并通过连接InternalResourceViewResolver
的前缀,视图名称(由您返回)来解析资源的路径hanbdler)和后缀。
返回View
个对象。请注意,对于InternalResourceViewResolver
,该对象不能为null
,因此无法实现ViewResolver
chaining。然后DispatcherServlet
使用返回的View
对象的render()
方法来创建HTTP响应。在这种情况下,它将使用RequestDispatcher
并向其转发由View名称描述的资源。如果该资源不存在,Servlet
容器将产生404响应。
考虑到所有这些,除非你的View
与jsp
或相关资源完全不同,否则在容器实际转发{{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中使用。
谢谢