在系列(2)中我们展示了一个简单的get请求,并返回了一个简单的helloworld页面。本篇我们来学习如何来配置一个action的url映射规则。
在系列(2)中我们在HelloWorldController上配置了一个@RequestMapping(value = "/helloworld")这表示对该controller的所有action请求必须是以"/helloworld”开始。
1.URL路径映射
1.1.对一个action配置多个URL映射:
我们把上一篇中的HelloWorldController的index() action方法的@RequestMapping更改为@RequestMapping(value={"/index", "/hello"}, method = {RequestMethod.GET}),这表示对该action配置了/index和/hello两个映射。运行测试,如下:
可以看到/helloworld/hello请求也成功匹配。
1.2.URL请求参数映射:
这在查询的时候经常用到,比如我们根据id或编号来获取某一条记录。
在HelloWorldController添加一个getDetail的action,代码如下:
@RequestMapping(value="/detail/{id}", method = {RequestMethod.GET}) public ModelAndView getDetail(@PathVariable(value="id") Integer id){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("id", id); modelAndView.setViewName("detail"); return modelAndView; }
其中value="/detail/{id}",中的{id}为占位符表示可以映射请求为/detail/xxxx 的URL如:/detail/123等。
方法的参数@PathVariable(value="id") Integer id 用于将URL中占位符所对应变量映射到参数id上,@PathVariable(value="id") 中value的值要和占位符/{id}大括号中的值一致。
在views中添加detail.jsp视图,用于将获取到的id值展示出来。视图内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> ${id} </body> </html>
运行测试,请求URL地址 http://localhost:8080/SpringMVCLesson/helloworld/detail/123 ,结果如下:
可以看到已经正确的显示了我们请求的id。
1.3.URL通配符映射:
我们还可以通过通配符对URL映射进行配置,通配符有“?”和“*”两个字符。其中“?”表示1个字符,“*”表示匹配多个字符,“**”表示匹配0个或多个路径。
例如:
“/helloworld/index?”可以匹配“/helloworld/indexA”、“/helloworld/indexB”,但不能匹配“/helloworld/index”也不能匹配“/helloworld/indexAA”;
“/helloworld/index*”可以匹配“/helloworld/index”、“/helloworld/indexA”、“/helloworld/indexAA”但不能匹配“/helloworld/index/A”;
“/helloworld/index/*”可以匹配“/helloworld/index/”、“/helloworld/index/A”、“/helloworld/index/AA”、“/helloworld/index/AB”但不能匹配 “/helloworld/index”、“/helloworld/index/A/B”;
“/helloworld/index/**”可以匹配“/helloworld/index/”下的多有子路径,比如:“/helloworld/index/A/B/C/D”;
如果现在有“/helloworld/index”和“/helloworld/*”,如果请求地址为“/helloworld/index”那么将如何匹配?Spring MVC会按照最长匹配优先原则(即和映射配置中哪个匹配的最多)来匹配,所以会匹配“/helloworld/index”,下面来做测试:
在HelloWorldController添加一个urlTest的action,内容如下:
@RequestMapping(value="/*", method = {RequestMethod.GET}) public ModelAndView urlTest(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("urltest"); return modelAndView; }
在views文件夹中新加一个视图urltest.jsp,为了和index.jsp做区别urltest.jsp的内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> urlTest! </body> </html>
请求http://localhost:8080/SpringMVCLesson/helloworld/index查看结果:
可以看出映射的是index对应的action。
请求http://localhost:8080/SpringMVCLesson/helloworld/AAA查看结果:
可以看出映射的是urlTest对应的action。
1.4.URL正则表达式映射:
Spring MVC还支持正则表达式方式的映射配置,我们通过一个测试来展示:
在HelloWorldController添加一个regUrlTest的action,内容如下:
@RequestMapping(value="/reg/{name:\\w+}-{age:\\d+}", method = {RequestMethod.GET}) public ModelAndView regUrlTest(@PathVariable(value="name") String name, @PathVariable(value="age") Integer age){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("name", name); modelAndView.addObject("age", age); modelAndView.setViewName("regurltest"); return modelAndView; }
在views文件夹中新加一个视图regurltest.jsp内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> ${name}-${age} </body> </html>
请求http://localhost:8080/SpringMVCLesson/helloworld/reg/Hanmeimei-18查看结果:
请求http://localhost:8080/SpringMVCLesson/helloworld/reg/Hanmeimei-Lilei查看结果(会发现找不到对应的action返回404):
2.限制action所接受的请求方式(get或post):
之前我们在HelloWorldController的index() action方法上配置的为@RequestMapping(value="/*", method = {RequestMethod.GET})我们把它改为@RequestMapping(value="/*", method = {RequestMethod.POST})再次请求http://localhost:8080/SpringMVCLesson/helloworld/index试一下:
这里可以看到结果映射到了urlTest这个action,这是因为我们在urlTest上配置的为@RequestMapping(value="/*", method = {RequestMethod.GET}),当index这个action映射不在符合时便映射到了urlTest。
我们也可以这样配置@RequestMapping(value="/*", method = {RequestMethod.GET, RequestMethod.POST})表示该action可以接受get或post请求,不过更简单的是不对method做配置则默认支持所有请求方式。
3.限制action所接受请求的参数:
我们可以为某个action指定映射的请求中必须包含某参数,或必须不包含某参数,或者某参数必须等于某个值,或者某参数必须不等于某个值这些限制。
3.1.指定映射请求必须包含某参数:
在HelloWorldController添加一个paramsTest的action,内容如下:
@RequestMapping(value="/paramstest", params="example", method = {RequestMethod.GET}) public ModelAndView paramsTest(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("paramstest"); return modelAndView; }
在views文件夹中新加一个视图paramstest.jsp内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Insert title here</title> </head> <body> paramstest! </body> </html>
请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest查看结果:
这里可以看到没有找到paramsTest这个action结果还是映射到了urlTest这个action。
请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example查看结果:
这次可以看到请求映射到了paramsTest这个action。
3.2.指定映射请求必须不包含某参数:
把刚才添加的paramsTest的@RequestMapping(value="/paramstest", params="example", method = {RequestMethod.GET}) 改为@RequestMapping(value="/paramstest", params="!example", method = {RequestMethod.GET})
重新请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example查看结果:
可以看到又没有找到paramsTest这个action而映射到了urlTest这个action。
3.3.指定映射请求中或者某参数必须等于某个值:
把刚才添加的paramsTest的@RequestMapping(value="/paramstest", params="example", method = {RequestMethod.GET}) 改为@RequestMapping(value="/paramstest", params="example=AAA", method = {RequestMethod.GET})
请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=BBB查看结果:
可以看到没有找到paramsTest这个action而映射到了urlTest这个action。
请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=AAA查看结果:
这次可以看到请求映射到了paramsTest这个action。
3.4.指定映射请求中或者某参数必须不等于某个值:
把刚才添加的paramsTest的@RequestMapping(value="/paramstest", params="example", method = {RequestMethod.GET}) 改为@RequestMapping(value="/paramstest", params="example!=AAA", method = {RequestMethod.GET})
请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=BBB查看结果:
可以看到请求映射到了paramsTest这个action。
请求http://localhost:8080/SpringMVCLesson/helloworld/paramstest?example=AAA查看结果:
可以看到没有找到paramsTest这个action而映射到了urlTest这个action。
注:当我们为params指定多个参数时如:params={"example1", "example2"},表示的是and关系,即两个参数限制必须同时满足。
4.限制action所接受请求头参数:
同限制action所接受的请求参数一样,我们也可以为某个action指定映射的请求头中必须包含某参数,或必须不包含某参数,或者某参数必须等于某个值,或者某参数必须不等于某个值这些限制。
4.1.指定映射请求头必须包含某参数:
@RequestMapping(value="/headerTest", headers = "example")。与限制请求参数是一样的,可以参考上面的例子进行测试。
4.2.指定映射请求头必须不包含某参数:
@RequestMapping(value="/headerTest", headers = "!example")。与限制请求参数是一样的,可以参考上面的例子进行测试。
4.3.指定映射请求头中或者某参数必须等于某个值:
@RequestMapping(value="/headerTest", headers = "Accept=text/html")。与限制请求参数是一样的,可以参考上面的例子进行测试。
4.4.指定映射请求头中或者某参数必须不等于某个值:
@RequestMapping(value="/headerTest", headers = "Accept!=text/html")。与限制请求参数是一样的,可以参考上面的例子进行测试。
注:当我们为headers指定多个参数时如:headers={"example1", "example2"},表示的是and关系,即两个参数限制必须同时满足。
代码下载:http://pan.baidu.com/s/1i3j1Ttj
相关推荐
它的URL映射规则是SpringMVC处理HTTP请求的核心机制,使得开发者能够灵活地将URL与控制器方法关联起来,实现请求的分发。 首先,理解SpringMVC的请求处理流程至关重要。当一个HTTP请求到达服务器时,...
- **SpringMVC**:方法级别的拦截,每个请求映射到一个方法。 - **Struts2**:类级别的拦截,一个类对应一个请求上下文。 - 结果:SpringMVC 更易于实现 RESTful 风格的 URL,而 Struts2 在这一点上略显笨拙。 2...
四、请求映射到Action方法: 使用@RequestMapping注解,可以将HTTP请求映射到特定的Controller类的方法。 五、拦截器的使用: 通过实现HandlerInterceptor接口,创建拦截器来执行预处理和后处理操作,例如日志记录...
2. **请求分发**:DispatcherServlet 负责根据配置规则将请求分发到相应的 Controller。 3. **处理请求**:Controller 接收请求并调用 Service 层处理业务逻辑。 4. **视图渲染**:Controller 返回视图名称,...
在这个“springMVC 简单操作,并且配置action”的项目中,我们将探讨如何不依赖Struts或Hibernate等其他框架,仅使用Spring MVC来实现网站的基本功能。 首先,我们从配置开始。在Spring MVC中,`web.xml`是应用的...
总结起来,`@RequestMapping`是Spring MVC中实现请求映射的关键工具,它允许开发者灵活地根据URL、请求方法、参数和头信息来映射处理逻辑。而`HiddenHttpMethodFilter`则解决了在非RESTful环境中模拟其他HTTP方法的...
在SpringMVC中,我们通常使用`@Controller`注解来标识一个类作为处理HTTP请求的控制器,而`@RequestMapping`或`@PostMapping`等注解用于映射具体的HTTP请求到方法。在描述中提到的"action的注解配置",可能是指定义...
`springMVC-servlet.xml` 是 SpringMVC 的核心配置文件,其中定义了处理器映射、视图解析器等。比如: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
例如,`HandlerMapping`用于映射请求到控制器,`HandlerAdapter`用于调用控制器,`HandlerExceptionResolver`用于处理异常,`ViewResolver`则用于解析视图。这种基于组件和接口的设计让整个架构更为灵活和易于扩展。...
- **HandlerMapping**:处理器映射器,负责将URL请求映射到相应的处理器。 - **HandlerAdapter**:处理器适配器,执行处理器并返回ModelAndView。 - **Handler**:程序员开发的控制器,遵循HandlerAdapter的规则...
- **请求处理**:当客户端发送请求时,`DispatcherServlet`根据配置文件中的映射规则将请求分发给相应的控制器进行处理。 - **业务逻辑处理**:控制器调用业务逻辑层(Service层)的方法来处理请求,并将处理结果...
`@Controller`注解标记的类表示控制器,`@RequestMapping`用来映射URL请求。源码中可能包含了配置文件(如`spring-servlet.xml`)以及各种Controller类,展示了如何处理请求、模型绑定、视图解析等。 4. **学习资源...
- **Struts2**则主要通过URL来映射Action,虽然简单易用但在处理复杂的请求时可能会显得力不从心。 综上所述,SpringMVC以其强大的功能和灵活的设计理念,在Web开发领域占据了重要的位置。无论是从技术角度还是实际...
映射器负责将请求URL映射到具体的处理方法。 **4.2 适配器(HandlerAdapter)** 适配器负责调用具体的处理方法,并将返回结果传递给视图解析器。 **4.3 视图解析器(ViewResolver)** 视图解析器负责解析逻辑...
- **作用**:根据URL确定调用哪个具体的处理器(Handler),即控制请求的URL到具体处理器的映射。 - **实现方式**:可以通过XML配置或者注解的方式进行配置。 3. **处理器适配器(HandlerAdapter)** - **作用**...
### SpringMVC基础知识详解 ...通过对SpringMVC的学习,开发者不仅能够快速构建出高效稳定的Web应用程序,还能深入了解MVC架构的优势所在。随着技术的发展,SpringMVC也在不断地更新和完善,为开发者提供更多便利。
- 通过url-pattern配置DispatcherServlet拦截的URL模式,例如拦截以.action结尾或所有访问。 #### 配置解析 - **DispatcherServlet配置**:定义了DispatcherServlet的servlet-name和servlet-class,以及初始化参数...
3. **处理器映射**:`HandlerMapping`接口负责根据请求的URL找到合适的处理器(即Controller)。 4. **处理器适配器处理**:`HandlerAdapter`负责调用已经找到的处理器。 5. **参数绑定**:SpringMVC会自动将请求...
### SpringMVC基础知识与应用详解 #### SpringMVC概述 SpringMVC是Spring框架的一个重要组成部分,它提供了基于MVC(Model...接下来,可以继续深入学习SpringMVC中的其他高级特性,如请求映射、数据绑定、异常处理等。
Spring MVC通过使用@RequestMapping注解(或者是基于方法的URL映射),可以将客户端的请求映射到控制器中的具体处理方法上。通过这种方式可以灵活地定义处理请求的方式和路径。 八、拦截器的使用 拦截器是一个特殊...