Spring MVC default-servlet-handler 配置阻塞 JSTL 视图
Spring MVC default-servlet-handler configuration blocking JSTL view
我有简单的Spring配置
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- Scan for components under this package -->
<context:component-scan base-package="com.osfg.test" />
我的控制器是
package com.osfg.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author athakur
*/
@Controller
public class TestController {
@RequestMapping(value="/test", method=RequestMethod.GET)
public String welcome() {
return "test";
}
}
而我的 JSP 是
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>OSFG Test Page</title>
<link href="CSS/test.css" rel="stylesheet">
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
此配置工作正常(CSS 没有得到应用)。
所以我添加
<mvc:default-servlet-handler />
到我的 Spring 配置,现在页面本身停止加载并显示 404。
同样令人惊讶的是,一切正常(CSS)将遵循配置
<mvc:view-controller path="/test" view-name="test"/>
<mvc:default-servlet-handler />
不涉及控制器的直接渲染。
我认为对资源进行简单的配置就足够了。
<mvc:resources mapping="/resources/**" location="/resources/" />
看来我发现了问题。 default-sevlet-handler 以某种方式覆盖了 DefaultAnnotationHandlerMapping
处理程序?这就是基于注释的处理程序失败的原因。以下场景对我有用 -
使用<mvc:annotation-driven/>
。这似乎启用了默认 bean,包括 DefaultAnnotationHandlerMapping
所以
的组合
<mvc:annotation-driven/>
<mvc:default-servlet-handler />
成功了。
以最高优先级显式定义您需要的处理程序映射和处理程序适配器 (chaining)。 Spring 扫描所有处理程序映射并分配一个顺序 属性 Integer.MAX (如果未明确定义),它给出最低的优先级。然后根据这个顺序对这些处理程序映射进行排序。此外,如果两个处理程序映射相同,则看起来它采用首先定义的 bean。所以以下对我有用 -
<mvc:default-servlet-handler />
<bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="0" />
</bean>
<bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
所以我猜 default-sevlet-handler
创建了它自己的处理程序映射,它覆盖了所有具有相同偏好的注释。
我有简单的Spring配置
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- Scan for components under this package -->
<context:component-scan base-package="com.osfg.test" />
我的控制器是
package com.osfg.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* @author athakur
*/
@Controller
public class TestController {
@RequestMapping(value="/test", method=RequestMethod.GET)
public String welcome() {
return "test";
}
}
而我的 JSP 是
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>OSFG Test Page</title>
<link href="CSS/test.css" rel="stylesheet">
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
此配置工作正常(CSS 没有得到应用)。
所以我添加
<mvc:default-servlet-handler />
到我的 Spring 配置,现在页面本身停止加载并显示 404。
同样令人惊讶的是,一切正常(CSS)将遵循配置
<mvc:view-controller path="/test" view-name="test"/>
<mvc:default-servlet-handler />
不涉及控制器的直接渲染。
我认为对资源进行简单的配置就足够了。
<mvc:resources mapping="/resources/**" location="/resources/" />
看来我发现了问题。 default-sevlet-handler 以某种方式覆盖了 DefaultAnnotationHandlerMapping
处理程序?这就是基于注释的处理程序失败的原因。以下场景对我有用 -
使用
的组合<mvc:annotation-driven/>
。这似乎启用了默认 bean,包括DefaultAnnotationHandlerMapping
所以<mvc:annotation-driven/> <mvc:default-servlet-handler />
成功了。
以最高优先级显式定义您需要的处理程序映射和处理程序适配器 (chaining)。 Spring 扫描所有处理程序映射并分配一个顺序 属性 Integer.MAX (如果未明确定义),它给出最低的优先级。然后根据这个顺序对这些处理程序映射进行排序。此外,如果两个处理程序映射相同,则看起来它采用首先定义的 bean。所以以下对我有用 -
<mvc:default-servlet-handler /> <bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="order" value="0" /> </bean> <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
所以我猜 default-sevlet-handler
创建了它自己的处理程序映射,它覆盖了所有具有相同偏好的注释。