Spring ContentNegotiatingViewResolver - 如何使用 jsp View 的 bean 名称而不是带有路径参数的完整 url

标签 spring jsp spring-annotations

我的 servlet 上下文文件有

<beans:bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <beans:property name="useNotAcceptableStatusCode"
        value="false" />
    <beans:property name="contentNegotiationManager">
        <beans:bean
            class="org.springframework.web.accept.ContentNegotiationManager">
            <beans:constructor-arg>
                <beans:bean
                    class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
                    <beans:constructor-arg>
                        <beans:map>
                            <beans:entry key="html" value="text/html" />
                            <beans:entry key="json" value="application/json" />
                        </beans:map>
                    </beans:constructor-arg>
                </beans:bean>
            </beans:constructor-arg>
        </beans:bean>
    </beans:property>

    <beans:property name="viewResolvers">
        <beans:list>
            <beans:bean
                class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
            <beans:bean id="jspView"
                class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <beans:property name="prefix" value="/WEB-INF/jsp/" />
                <beans:property name="suffix" value=".jsp" />
            </beans:bean>
        </beans:list>
    </beans:property>

    <beans:property name="defaultViews">
        <beans:list>
            <beans:bean
                class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
        </beans:list>
    </beans:property>
</beans:bean>

我的 Controller 文件有

@Controller("resources")
public class Resources {

     @RequestMapping(value = "/resources/{name}", method = RequestMethod.GET)
     public Map getResource(@PathVariable String name) {
        return new HashMap();
     }
}

但是每当我尝试访问/server/resources/myfilename.html

服务器抛出 404 错误,表示未找到 /server/WEB-INF/jsp/resources/myfilename.jsp。 但它应该使用 BeanNameViewResolver 加载 /server/WEB-INF/jsp/resources.jsp 。请帮忙。

最佳答案

你得到什么:

  • Controller返回空 View 名称,因此 DefaultRequestToViewNameTranslator从 URI = path from servlet path 生成一个,不带斜杠和文件扩展名:resources/myfilename

  • BeanNameViewResolver尝试获取 View从名为 resources/myfilename 的上下文中,似乎失败并链接到下一个 ViewResolver

  • InternalResourceViewResolver返回 JstlView指向jsp前缀+viewName+后缀=/WEB-INF/jsp/resources/myfilename.jsp

所以BeanNameViewResolver似乎没有解析 InternalResourceViewResolver 的 View 和返回是预期的。

你想要什么(我认为)

您想要从默认 View 名称中删除文件名,而不仅仅是扩展名。

  • 实现 RequestToViewNameTranslator并在 DispatcherServlet 中声明它名称为 viewNameTranslator 的上下文。

例如:

public class StripFileNameViewNameTranslator extends DefaultRequestToViewNameTranslator {

    @Override
    protected String transformPath(String lookupPath) {
        String path = super.transformPath(lookupPath);
        return  StringUtils.substringBeforeLast(path, "/");
    }
}

关于Spring ContentNegotiatingViewResolver - 如何使用 jsp View 的 bean 名称而不是带有路径参数的完整 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16443450/

相关文章:

javascript - 当存在超过 9 个相同脚本时,由于脚本原因,页面加载需要时间

java - 如何获取所有带有@Entity注解的bean?

java - Spring : Unable to resolve view name in Spring MVC

java - Maven 全新安装 : Failed to execute goal org. apache.maven.plugins :maven-resources-plugin:3. 2.0:resources

java - 使用 Spring MVC 通过 AJAX 发送 HTML 数据

java - Spring Boot 没有在 Jersey 的 ResourceConfig 类中设置 @Value 属性

java - 在没有 Spring Boot 应用程序的情况下使用 Spring Boot Actuator

java - Spring登录后避免后退按钮

java - 使用 Spring 3.1 保护两个网页的密码

java - 如何分离与@SpringBootApplication注释的类不同的类中的bean