Spring MVC的网站上根(“/”)(spring mvc website on root (

2019-07-30 18:20发布

我想Spring MVC的控制器根(地图/** )路径(而不是子文件夹,如“/某事”),同时与例外mvc:resources (开放的另一种方法)。

这应该是框架的ABC,但显然是一个非常复杂的东西要问它。

我的app-servlet.xml有这些明显的映射例外:

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" />
<mvc:resources mapping="/robots.txt" location="/robots.txt" />

我有此控制器:

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/**")
public class MainController {

    @RequestMapping(method = RequestMethod.GET)
    public String service(final HttpServletRequest request) {
        final String servlet_path = request.getServletPath();
        System.out.println(String.format("%s %s", new Date().toString(), servlet_path));
        return "test";
    }
}

现在,当我打“/”或“/测试”或“/测试/页”我得到的输出,如:

Fri Aug 03 00:22:12 IDT 2012 /
Fri Aug 03 00:22:13 IDT 2012 /favicon.ico

..看到了什么? service()被调用的/favicon.ico甚至当它明确地排除!

现在,我想有一些“重点”到@Controller过XML,还是,如何使排除工作?

一个简单的要求 - 对“/”的网站。

PS 这个答案回答一个非常类似的问题。

另注:这个问题是不是tomcat的环境。

Answer 1:

这里的问题是,底层的HandlerMapping与注册<mvc:resources相比,与一个注册具有非常低优先级的<mvc:annotation-driven/> 。 如果你的要求是简单的有一些应对“/”更好的办法可能会是有不同的@RequestMapping比/** ,而不是说把它当作/home ,并定义这些方针的东西:

<mvc:view-controller path="/" view-name="home" />

如果这行不通,唯一的选择将是降低潜在HandlerMapping的优先级<mvc:resources ,可以通过明确界定的HandlerMapping来完成-一个有点复杂,但可以做到的。

更新这里是一个可能的配置:

试着用这只是第一:

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" order="0"/>
<mvc:resources mapping="/robots.txt" location="/robots.txt" order="0"/>

如果仅此不能正常工作,请更改<mvc:annotation-driven/>沿着这些路线春季3.1.X的东西:

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="conversionService" ref="conversionService"></property>
            <property name="validator">
                <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
                    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
                </bean>
            </property>
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
        </list>
    </property>
</bean>

<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="order" value="2"></property>
</bean>


Answer 2:

我想阐明重写该代替<mvc:annotation-driven/>一个可以改变处理程序指令的声明顺序:

<mvc:resources mapping="/favicon.ico" location="/favicon.ico" order="0"/>
<mvc:resources mapping="/robots.txt" location="/robots.txt" order="0"/>
<mvc:annotation-driven/>


文章来源: spring mvc website on root (“/”)