RequestMapping
@RequestMapping能够控制请求路径和请求方式!
一个控制器写多个业务方法
到目前为止,我们都是一个控制器写一个业务方法,这肯定是不合理的。我们在Struts2中一个Action就对应多个业务方法了。那么我们在SpringMVC中又怎么写呢???
其实我们可以推理出来,@RequestMapping就是用于配置哪个请求对应哪个业务方法的!
public @interface RequestMapping { String[] value() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; }
当我们请求hello.action的时候,处理的业务方法是hello()…..当我们请求bye.action的时候,处理的业务方法是bye()
@Controller public class HelloAction { /** * * @RequestMapping 表示只要是/hello.action的请求,就交由该方法处理。当然了.action可以去掉 * @param model 它和ModelAndView类似,它这个Model就是把数据封装到request对象中,我们就可以获取出来 * @return 返回跳转的页面【真实路径,就不用配置视图解析器了】 * @throws Exception */ @RequestMapping(value="/hello.action") public String hello(Model model) throws Exception{ System.out.println("HelloAction::hello()"); model.addAttribute("message","你好"); return "/index.jsp"; } @RequestMapping(value = "/bye.action") public String bye(Model model) throws Exception { model.addAttribute("message","再见"); return "/index.jsp"; } }
分模块开发
当然了,我们在Struts2常常使用namespace来进行分模块开发,在SpringMVC中我们也可以这样干,并且我们又是使用的是@RequestMapping这个注解!
只要把@RequestMapping这个注解写到类上面去,就代表了分模块。
@Controller //我们知道,如果是value属性上的注解,我们可以把value省略掉的 @RequestMapping("/zhongfucheng") public class HelloAction { /** * @param model 它和ModelAndView类似,它这个Model就是把数据封装到request对象中,我们就可以获取出来 * @return 返回跳转的页面【真实路径,就不用配置视图解析器了】 * @throws Exception * @RequestMapping 表示只要是/hello.action的请求,就交由该方法处理。当然了.action可以去掉 */ @RequestMapping(value = "/hello.action") public String hello(Model model) throws Exception { System.out.println("HelloAction::hello()"); model.addAttribute("message", "你好"); return "/index.jsp"; } @RequestMapping(value = "/bye.action") public String bye(Model model) throws Exception { model.addAttribute("message", "再见"); return "/index.jsp"; } }
那么我们想要HelloAction该控制器处理我们的请求,访问的地址要么是:http://localhost:8080/zhongfucheng/hello.action
,或者要么是http://localhost:8080/zhongfucheng/bye.action
限定某个业务控制方法,只允许GET或POST请求方式访问
我们如果想要限定某个业务控制方法,只允许GET或POST请求方式访问。还是通过@RequestMapping来实现。只要设定它的method属性就行了!
@RequestMapping(value = "/bye.action",method = RequestMethod.POST) public String bye(Model model) throws Exception { model.addAttribute("message", "再见"); return "/index.jsp"; }
当我把业务方法的请求设置为POST以后,我想要通过GET方式来访问该业务方法。就行不通了!
业务方法写入传统web参数
我们的业务方法除了可以写Model这个参数以外,如果有需要我们还可以写request,response等传统Servlet的参数。这是一样可以使用的….
但是呢,我们并不建议使用传统的web参数,因为会耦合
@RequestMapping(method=RequestMethod.POST,value="/register") public String registerMethod(HttpServletRequest request,HttpServletResponse response) throws Exception{ //获取用户名和薪水 String username = request.getParameter("username"); String salary = request.getParameter("salary"); System.out.println("用户注册-->" + username + ":" + salary); //绑定到session域对象中 request.getSession().setAttribute("username",username); request.getSession().setAttribute("salary",salary); //重定向/jsp/success.jsp页面 //response.sendRedirect(request.getContextPath()+"/jsp/success.jsp"); //转发/jsp/ok.jsp页面 request.getRequestDispatcher("/jsp/ok.jsp").forward(request,response); //转发(提倡) return "/jsp/success.jsp"; }
小细节:如果我们的返回值是返回一个真实路径,而我们在程序中又使用了转发或重定向。。。那么具体跳转的位置就是按我们程序中跳转的路径为准!
业务方法收集参数
我们在Struts2中收集web端带过来的参数是在控制器中定义成员变量,该成员变量的名字与web端带过来的名称是要一致的…并且,给出该成员变量的set方法,那么Struts2的拦截器就会帮我们自动把web端带过来的参数赋值给我们的成员变量….
那么在SpringMVC中是怎么收集参数的呢????我们SpringMVC是不可能跟Struts2一样定义成员变量的,因为SpringMVC是单例的,而Struts2是多例的。因此SpringMVC是这样干的:
- 业务方法写上参数
- 参数的名称要和web端带过来的数据名称要一致
接收普通参数
如果是普通参数的话,我们直接在方法上写上与web端带过来名称相同的参数就行了!
<form action="${pageContext.request.contextPath}/hello.action" method="post"> <table align="center"> <tr> <td>用户名:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>编号</td> <td><input type="text" name="id"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="提交"> </td> </tr> </table> </form>
@RequestMapping(value = "/hello.action") public String hello(Model model, String username, int id) throws Exception { System.out.println("用户名是:" + username); System.out.println("编号是:" + id); model.addAttribute("message", "你好"); return "/index.jsp"; }
效果: