但我认为春季文档有时会变得复杂且难以理解,所以我对这门课程的解释很少。
答案 0 :(得分:23)
如文档中所述,BeanNameViewResolver
解析声明为bean的View
。通常你需要一些特殊用途的观点。
想象一下,例如,您的某个控制器应该呈现Excel电子表格。因此,您将AbstractExcelView
子类化并实现自定义逻辑,以根据模型值呈现电子表格:
public class MyExcelView extends AbstractExcelView { ... }
并将其声明为bean:
<bean id = "myExcelView" class = "MyExcelView" />
然后声明BeanNameViewResolver
使其可供控制器使用:当控制器返回ModelAndView
且视图名称为myExcelView
时,您的电子表格将会呈现。
BeanNameViewResolver
通常与处理“常规”视图的其他视图解析器一起使用(如果BeanNameViewResolver
无法找到视图,则另一个解析器会尝试查找它):< / p>
<bean class = "...BeanNameViewResolver">
<property name = "order" value = "0" />
</bean>
<bean class = "...InternalResourceViewResolver">
<property name = "order" value = "1" />
...
</bean>
答案 1 :(得分:8)
确实,文档并不出色。
spring mvc中的视图解析器是一个bean,它从视图名称转换为视图。
视图名称是简单的字符串。它由ModelAndView对象中控制器的handleRequest()方法返回。
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
....
return ModelAndView("thisIsTheViewName", ...);
}
此视图名称由视图解析器解析为实际视图类。
BeanNameViewResolver有一个简单的工作:它在applicationContext中查找具有此视图名称作为其id的视图bean。
<bean id="thisIsTheViewName" class="....MyView" />
对于简单的应用程序,这可以是从视图名称转换为视图的最简单方法。
答案 2 :(得分:0)
如果您正在寻找一个非常简单但完整的示例:
@Controller
public class MyController {
@GetMapping("/hello")
public String getHello() {
return "helloView";
}
}
@Component
public class HelloView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> map,
HttpServletRequest req, HttpServletResponse res) throws Exception {
res.setContentType("text/plain");
res.getOutputStream().println("hello world");
}
}