我的 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/myfilenameBeanNameViewResolver
尝试获取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/