注解和XML配置方式同时存在时,注解失效

注解和XML配置方式同时存在时,注解失效

前面使用了XML配置的方式进行springmvc的测试,一切正常。

后面使用注解做另一个测试,开启了组件扫描。注解配置正常。但是请求路径没办法被注解捕获。

后面把之前xml方式配置的内容注释掉了,请求就可以正常捕获了。

请老师解释下原因。

http://img1.sycdn.imooc.com//climg/5b6721a1000175b810560346.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

在配置SpringMVC的访问路径时,如果在SpringMVC的配置文件中通过bean的方式配置访问路径,又同时使用注解,会使得程序的运行结果存在问题;

与这个问题类似的问题:我们在学习Servlet时,如果既使用配置文件又使用注解声明Servlet,那么程序也是会出错的。

祝学习愉快!

提问者 程序人生001 2018-08-06 15:59:37

配置文件:mySpringmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.imoooc.controller"/>

    <!--<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">-->
        <!--<property name="mappings">-->
            <!--<props>-->
                <!--&lt;!&ndash;<prop key="/login.do">myHandler</prop>&ndash;&gt;-->
            <!--</props>-->
        <!--</property>-->
    <!--</bean>-->

    <bean id="myHandler" class="User"></bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


</beans>

前端页面:weight.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/8/5 0005
  Time: 下午 23:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>BMI计算器</title>
</head>
<body>
    <b>计算BMI身体指数</b>
    <form action="bmi.do" method="post">
        身高: <input type="text" name="height">cm &nbsp;体重: <input type="text" name="weight">kg
        <input type="submit" value="提交测试">
    </form>
</body>
</html>

showBMI.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/8/5 0005
  Time: 下午 23:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>BMI结果</title>
</head>
<body>
    提示信息:${msg}
</body>
</html>

web.xml

<?xml version="1.0" encoding="utf-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

<display-name>Archetype Created Web Application</display-name>

  <filter>
    <filter-name>CharacterEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>MySpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--指定配置springmvc.xml文件的路径-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:mySpringmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>MySpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

实体类:Body

package com.imoooc.controller;

public class Body {

    private double height;
    private double weight;

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }
}

handler:BMIController

package com.imoooc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class BMIController {

    @RequestMapping("/bmi.do")
    public ModelAndView bmiTest(Body body){
        ModelAndView modelAndView = new ModelAndView();
        double height = body.getHeight();
        double weight = body.getWeight();
        System.out.println(height+"-----"+weight);
        double result = weight/(Math.pow(height/100,2));
        System.out.println(height/100);
        System.out.println(result);
        String msg = "无fuck可说";
        if(result<19){
            msg="多吃点,草";
        }else if(result<25){
            msg="你很棒棒哦";
        }else{
            msg="胖子";
        }
        modelAndView.addObject("msg",msg);
        modelAndView.setViewName("showBMI");
        return modelAndView;
    }

}

POM文件没有什么特别的,引入相关jar包就行

  • 提问者 程序人生001 #1
    其中,配置文件中myHandler指向的class为User,可以配合handlerMapping随意改
    2018-08-06 16:05:24
  • 提问者 程序人生001 #2
    如果把注释掉的部分恢复,注解就不起作用了。
    2018-08-06 16:06:20
好帮手慕珊 2018-08-06 10:59:17

控制台有报错提示吗?应该是对同一个内容既配置了注解又配置了xml造成的。祝学习愉快!

  • 提问者 程序人生001 #1
    控制台报错就是现实mvc配置文件中不存在相应的请求路径。 问题是即使我不配置handler这个bean,只配置handlermapping,也会报错。
    2018-08-06 11:08:10
  • 好帮手慕珊 回复 提问者 程序人生001 #2
    你把代码都贴一下吧,我们运行一下试试
    2018-08-06 14:36:50
提问者 程序人生001 2018-08-06 00:21:27

试了一下,发现是SimpleUrlHandlerMapping这个Bean 存在导致的注解失效。

怎么回事呢?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师