0

我有简单的 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 />

直接渲染没有控制器参与。

4

2 回答 2

0

我认为对资源进行简单的配置就足够了。

<mvc:resources mapping="/resources/**" location="/resources/" />
于 2015-12-26T12:01:12.707 回答
0

看来我发现了问题。不知何故,default-sevlet-handler 覆盖了DefaultAnnotationHandlerMapping处理程序?这就是基于注释的处理程序失败的原因。以下场景对我有用 -

  1. 使用<mvc:annotation-driven/>. 这似乎启用了默认 bean,包括DefaultAnnotationHandlerMappingSo 组合

     <mvc:annotation-driven/>
     <mvc:default-servlet-handler />
    

工作。

  1. 以最高优先级(链接)显式定义您需要的处理程序映射和处理程序适配器。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创建它自己的处理程序映射,它会覆盖所有具有相同偏好的注释。

于 2015-12-26T12:14:33.543 回答