当前位置: 首页 > news >正文

小结:Spring MVC 的 XML 的经典配置方式

在 Spring MVC 的基于 XML 的经典配置方式,如何让某个请求 URL 映射到 HelloController 的具体方法,是通过配置 HandlerMapping 来完成的

方式一:使用 BeanNameUrlHandlerMapping(推荐 XML 配置方式)

1. 修改 HelloController,为它指定一个 bean 名称(URL 映射路径)

// HelloController.java
public class HelloController implements Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {ModelAndView mv = new ModelAndView("hello");mv.addObject("msg", "Hello XML Controller");return mv;}
}

1.1 在 spring-servlet.xml 中配置 Controller bean 和 URL 映射

<!-- spring-servlet.xml -->
<context:component-scan base-package="com.example"/><!-- 配置 Controller bean -->
<bean id="/hello.htm" class="com.example.HelloController"/><!-- 配置 HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 配置 ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/>
</bean>

🔍 效果说明:

  • 当访问:http://localhost:8080/your-app/hello.htm
  • 就会调用 HelloControllerhandleRequest 方法。
  • BeanNameUrlHandlerMapping 会将 bean 的 id 视为 URL 路径进行匹配。

方式二:使用 SimpleUrlHandlerMapping(更灵活的 URL 映射)

你也可以使用更显式的 URL 映射方式:

<bean id="helloController" class="com.example.HelloController"/><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/hello.htm">helloController</prop></props></property>
</bean>

这种方式允许你将多个 URL 映射到不同的 Controller bean,结构更清晰。


方式三:使用注解(虽然你用的是 XML,但可以混合使用)

如果你希望使用 @RequestMapping 注解,也可以启用注解驱动(即使你用的是 XML 配置):

<mvc:annotation-driven />
<context:component-scan base-package="com.example"/>

然后修改 Controller:

@Controller
public class HelloController {@RequestMapping("/hello")public String sayHello(Model model) {model.addAttribute("msg", "Hello XML + Annotation Controller");return "hello";  // 映射到 /WEB-INF/jsp/hello.jsp}
}

这样你就可以通过 /hello 访问这个方法。


✅ 五、总结

方式配置方式特点
BeanNameUrlHandlerMappingXMLbean 的 id 就是 URL
SimpleUrlHandlerMappingXML更灵活,支持多个 URL 到 bean 的映射
注解 @RequestMapping + ``XML + 注解更现代,更简洁,推荐使用

🧩 示例:完整 spring-servlet.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"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 扫描 Controller --><context:component-scan base-package="com.example"/><!-- 启用注解驱动(可选) --><mvc:annotation-driven /><!-- 显式配置 Controller 和 URL 映射 --><bean id="/hello.htm" class="com.example.HelloController"/><!-- 使用 BeanNameUrlHandlerMapping --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 或者使用 SimpleUrlHandlerMapping --><!--<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/hello.htm">helloController</prop></props></property></bean>--><!-- ViewResolver --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean></beans>

在 Spring MVC 的经典 XML 配置方式中,如果你使用的是 传统的 Controller 接口(即 org.springframework.web.servlet.mvc.Controller),那么:


不能直接为 HelloController 添加多个方法并分别映射到不同的 URL。

原因:

你当前的 HelloController 是这样定义的:

public class HelloController implements Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {...}
}
  • 它实现了 Spring MVC 的 Controller 接口,该接口 只有一个方法:handleRequest()
  • Spring MVC 会把整个类当作一个控制器,所有的请求都只会调用 handleRequest() 方法
  • 所以,即使你添加了多个方法,也无法通过 URL 映射到不同的方法上

✅ 如何实现一个 Controller 多个方法?

✅ 方法一:使用 MultiActionController(Spring 3.x 及以前支持)

这是 Spring 提供的一个旧版控制器类,允许你在同一个控制器中有多个处理方法。

示例:
public class HelloController extends MultiActionController {public ModelAndView sayHello(HttpServletRequest request, HttpServletResponse response) {ModelAndView mv = new ModelAndView("hello");mv.addObject("msg", "Hello from sayHello");return mv;}public ModelAndView sayHi(HttpServletRequest request, HttpServletResponse response) {ModelAndView mv = new ModelAndView("hello");mv.addObject("msg", "Hello from sayHi");return mv;}
}
XML 配置 URL 映射:
<bean name="/hello/*.htm" class="com.example.HelloController"><property name="methodNameResolver"><bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"><property name="mappings"><props><prop key="/hello/sayHello.htm">sayHello</prop><prop key="/hello/sayHi.htm">sayHi</prop></props></property></bean></property>
</bean>
访问地址:
  • /hello/sayHello.htmsayHello() 方法
  • /hello/sayHi.htmsayHi() 方法

⚠️ 注意:MultiActionController 在 Spring 3.2 以后已被弃用(不推荐使用),建议使用基于注解的方式。


✅ 方法二:使用注解驱动(推荐)

如果你希望一个 Controller 有多个方法,并且每个方法映射不同的 URL,最推荐的方式是使用:

  • @Controller
  • @RequestMapping
示例:
@Controller
public class HelloController {@RequestMapping("/hello")public String sayHello(Model model) {model.addAttribute("msg", "Hello from sayHello");return "hello";}@RequestMapping("/hi")public String sayHi(Model model) {model.addAttribute("msg", "Hello from sayHi");return "hello";}
}
XML 中启用注解支持:
<context:component-scan base-package="com.example"/>
<mvc:annotation-driven />
访问地址:
  • /your-app/hellosayHello()
  • /your-app/hisayHi()

✅ 方法三:混合使用 XML 和多个 Controller

如果你坚持使用 XML 配置方式,但又想支持多个方法,可以:

  • 创建多个 Controller 类(每个类实现 Controller 接口)
  • 每个类对应一个 URL
  • 在 XML 中分别为它们配置 URL 映射
示例:
// HelloController.java
public class HelloController implements Controller {public ModelAndView handleRequest(...) {...}
}// HiController.java
public class HiController implements Controller {public ModelAndView handleRequest(...) {...}
}
XML 配置:
<bean id="/hello.htm" class="com.example.HelloController"/>
<bean id="/hi.htm" class="com.example.HiController"/><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
http://www.lryc.cn/news/592001.html

相关文章:

  • ASP.NET Core Web API 内存缓存(IMemoryCache)入门指南
  • untiy之导入插件(文件方式,适用于git克隆失败)
  • Instagram千号矩阵:亚矩阵云手机破解设备指纹检测的终极方案
  • 【.net core】支持通过属性名称索引的泛型包装类
  • 五国联动!德法意西荷 ASIN 同步上架成泛欧计划硬性门槛
  • 构建智能客服Agent:从需求分析到生产部署
  • 持续同调文章阅读(四)
  • 推荐 1 款 4.5k stars 的AI 大模型驱动的开源知识库搭建系统
  • A33-vstar笔记及资料分享:搭建交叉编译环境
  • Linux云计算基础篇(9)-文本处理工具和变量
  • 无符号乘法运算的硬件逻辑实现 ————取自《湖科大教书匠》
  • 【PTA数据结构 | C语言版】多叉堆的上下调整
  • Python MP3 归一化器和长度分割器实用工具开发指南
  • SQL映射文件
  • Android 应用保活思路
  • 树(Tree)
  • 【C++基础】--多态
  • web域名解析
  • 信息论至AI实践:交叉熵的原理全景与应用深度解析
  • Github库镜像到本地私有Gitlab服务器
  • 您的企业需要服务台经理吗?-ManageEngine卓豪
  • 《5分钟开发订单微服务!飞算JavaAI实战:IDEA插件安装→空指针修复→K8s部署全流程》
  • 3C电子产品蓝光三维扫描检测方案-中科米堆CASAIM
  • 机器视觉的布料丝印应用
  • Duckdb处理excel文件
  • 【实战】一次出口连接数超限事故引发的架构反思:强制代理、NAT 网关与大厂最佳实践
  • Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel
  • LangChain 源码剖析(七)RunnableBindingBase 深度剖析:给 Runnable“穿衣服“ 的装饰器架构
  • Yoga Air 32,Yoga Air 32,Yoga AIO 9 32IRH8(F0HH,F0HJ)一体机电脑原厂Win11系统镜像
  • 服务攻防-Java组件安全FastJson高版本JNDI不出网C3P0编码绕WAF写入文件CI链