@RequestMaapping的功能就是将请求和处理请求和处理请求的控制器关联起来,建立映射关系,当DispathcerServlet接收到请求,会从Controller中找对应的方法来处理该请求。
eg:
- @Controller
- @RequestMapping("/test")
- public class TestRequestMappingController {
- @RequestMapping("/hello")
- public String hello(){
- return "success";
- }
- }
当浏览器中的请求是url/test,此时服务器端通过dispatcherservlet处理之后从此项目的配置文件中寻找控制器中与之对应的路径。
可以放在类上也可以放在方法上:
放在类上声明就是请求路径的初始信息
放在方法上声明就是请求路径的具体信息
比如上面的例子,当想要实现hello页面的时候,具体的路径应为:url/test/hello,而不是url/hello。
<a th:href="@{/test/hello}">测试RequestMappinga><br/>
该注解中还有几个属性,这里只说说:value、method
其就是通过value属性的值匹配请求地址中的url。相当于
- @RequestMapping(
- value = {"/testRequestMapping", "/test"}
- )
与请求中的请求方式进行匹配,当满足时才可以调用对应的方法。
- @RequestMapping( value = {"/testRequestMapping", "/test"},
- method = {RequestMethod.GET, RequestMethod.POST} )
原始方式:/deleteUser?id=1rest方式: /user/delete/1
<a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testResta><br>
- @RequestMapping("/testRest/{id}/{username}")
- public String testRest(@PathVariable("id") String id,
- @PathVariable("username") String username)
- { System.out.println("id:"+id+",username:"+username); return "success"; }
当我们想要从一个页面上直接访问到一个特定的信息中可以用此方法。
比如QQ空间这类项目,在我们的空间中想要访问到指定好友的空间,就需要点击一些图片类的超链接,然而超链接中就有这些数据,我们只需要想办法接收即可。
- <form th:action="@{/param/servletAPI}" method="get">
- 用户名:<input type="text" name="username"><br/>
- 密码:<input type="password" name="password"><br/>
- <input type="submit" value="登录"><br/>
- form>
- @RequestMapping("/param/servletAPI")
- public String getParamByServletAPI(HttpServletRequest request){
- String username = request.getParameter("username");
- String password = request.getParameter("password");
- System.out.println("username:"+username+",password:"+password);
- return "success";
- }
- @RequestMapping("/param")
- public String getParam(@RequestParam(value = "userName",required = false,defaultValue = "hello") String username, String password){
- System.out.println("username:"+username+",password:"+password);
- return "success";
- }
最简单的时候,我们都不需要设置@RequestParam这个注释来处理。只将控制器方法中的i形参和发送过来数据的name一致就能匹配上。
@RequestParam是为了处理方法中的形参和name值不一致的时候,我们手动设置。
value:请求中的name,具体指要将哪个值赋予方法中的形参。
Required:指是否需要有值,当为true的时候,若没有值传过来就会报错。
dafalueValue:是指当没有对应的值在请求中时我们赋予的默认参数,不管required的值时啥。只要没有值,就默认赋值。
这个很简单,只需要请求中的参数和参数名一一匹配即可。
- @RequestMapping("/param/pojo")
- public String getParamByPojo(User user){
- System.out.println(user);
- return "success";
- }
需要有一个认知:最初只有serlvet的时候,我们都是通过Servlet的API:charactersetEncoding这段代码,放在代码的最初,来设置字符类型。但在SpringMVC下,我们的dispatcherServlet会处理所有的请求然后在通过配置文件扫描到我们对应的控制器中,然后匹配对应的方法。所以请求信息中有参数的时候,如果我们在方法里设置字符类型,已经不起作用了(因为已经接收到了,就差赋值给形参这一步了)。所以我们需要在web.xml配置文件中早早的设置这个字符类型。
通过过滤器的方式来设置的:
- <filter>
- <filter-name>CharacterEncodingFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
-
- <init-param>
- <param-name>forceEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>CharacterEncodingFilterfilter-name>
- <url-pattern>/url-pattern>
- filter-mapping>
现在只需要处理三个域类型即可,把page删了。
- @RequestMapping("/testServletAPI")
- public String testServletAPI(HttpServletRequest request)
- { request.setAttribute("testScope", "hello,servletAPI");
- return "success"; }
- @RequestMapping("/test/mav")
- public ModelAndView testMAV(){
-
- /*
- * modelAndView 包含model和view功能
- * model:向请求域中共享数据
- * view:设置逻辑视图实现页面跳转
- * */
- ModelAndView mav = new ModelAndView();
- //向请求域中共享数据
- mav.addObject("testRequestScope","hello.modelandView");
- //设置逻辑视图
- mav.setViewName("success");
- return mav;
- }
- @RequestMapping("/test/model")
- public String testModel(Model model){
- model.addAttribute("testRequestScope","hello,model");
- return "success";
- }
这两个一样,都是通过ServletAPI中的方法即可(老师讲说这个最简便)
- @RequestMapping("/testSession")
- public String testSession(HttpSession session)
- { session.setAttribute("testSessionScope", "hello,session");
- return "success"; }
-
-
-
- @RequestMapping("/testApplication")
- public String testApplication(HttpSession session)
- {
- ServletContext application = session.getServletContext(); application.setAttribute("testApplicationScope", "hello,application");
- return "success"; }