需要一些关于BeanNameViewResolver的解释

时间:2011-09-12 16:09:48

标签: spring spring-mvc

我在这里阅读文档: http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/web/servlet/view/BeanNameViewResolver.html

但我认为春季文档有时会变得复杂且难以理解,所以我对这门课程的解释很少。

3 个答案:

答案 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");
    }
}