常用注解元素@Controller 标注在Bean的类定义处 @RequestMapping 真正让Bean具备 Spring MVC Controller 功能的是 @RequestMapping 这个注解 @RequestMapping 可以标注在类定义处,将 Controller 和特定请求关联起来; 还可以标注在方法签名处,以便进一步对请求进行分流 配套的属性有: value 需要跳转的地址 method 基于RestFul的跳转参数,有RequestMethod.get post put delete等 params 符合某个参数的时候才调用该方法 Headers 符合头信息的时候才调用 @SessionAttributes 将结果放入session内 @ModelAttribute 存储在响应内容ModelMap或者ModelAndView进行保存值传到前台,当如果你需要保存值比较少 的时候可以采用这种方式进行保存值并且保存到前台显示 在默认情况下,ModelMap 中的属性作用域是 request 级别,相当于HttpServletRequest中的request.setAttribute() 一样,在 JSP 视图页面中通过 request.getAttribute(“attribute name”) 或者通过 ${ attribute name } EL 表达式访问模型对象中的 属性对象 如果希望在ModelMap 的作用域范围为 session,可以有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现 如: @Controller @RequestMapping("/login.do") @SessionAttributes("currUser") public class BbtForumController {。。。。。} @ResponseBody 标注后 返回String对象的结果为response内容体,不标注的话 作为dispatcher url使用 @PathVariable 允许将请求路径的制定内容当做求情的参数使用 返回类型请求处理方法入参的可选类型 说明 void 此时逻辑视图名由请求处理方法对应的 URL 确定,如以下的方法: @RequestMapping("/welcome.do") public void welcomeHandler() { } 对应的逻辑视图名为“welcome” String 此时逻辑视图名为返回的字符,如以下的方法: @RequestMapping(method = RequestMethod.GET) public String setupForm(@RequestParam("ownerId") int ownerId, ModelMap model) { Owner owner = this.clinic.loadOwner(ownerId); model.addAttribute(owner); return "ownerForm"; } 对应的逻辑视图名为“ownerForm” ModelMap 和返回类型为 void 一样,逻辑视图名取决于对应请求的 URL, 如下面的例子: @RequestMapping("/vets.do") public ModelMap vetsHandler() { return new ModelMap(this.clinic.getVets()); } 对应的逻辑视图名为“vets”,返回的 ModelMap 将被作为请求对应的模型对象, 可以在 JSP 视图页面中访问到。 ModelAndView 返回方式1 使用无返回方法跳转,如果使用返回方法进行跳转的话,则会通过视图解析器进行以 prefix(前缀)+方法名+suffix(后缀)组成的页面文件名称. 2 使用一个返回的字符串方法作为跳转,使用字符串跳转的话好处就是在return的时候可 以自己指定返回的名字,JSP组成是prefix(前缀)+返回的字符串+suffix(后缀) 3 返回一个ModelAndView类型,使用setViewName方法则可以跳转到指定的页面. 路径匹配形式 1、单一Controller 对应 单一的请求路径 2、单一Controller 对应多个请求路径 3、单一Controller 对应多个请求路径,且路径内可以含有参数的形式 Demo code and UseCase@Controller @RequestMapping("/login.do") public class SinglePathWithController {} @Controller @SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"}) public class AdapterMultiPathController {} @Controller @RequestMapping(value = "/rest") public class RestWithController {} 无返回//无返回值 无参数返回的是根据 prefix前缀+@RequestMapping value +suffix 后缀组成 @RequestMapping("/springmvc/common") public voidnovoid(HttpServletRequest request) { request.setAttribute("message", "novoid方法被调用"); }
返回字符串1、 作为视图路径方式 //根据路径直接匹配 @RequestMapping("/springmvc/multiReqPath1.do") public String multiReqPath1(HttpServletRequest request){ request.setAttribute("message", "multiReqPath1方法被调用"); return "springmvc/common"; } @RequestMapping("/springmvc/multiReqPath2.do") public String multiReqPath2(HttpServletRequest request){ request.setAttribute("message", "multiReqPath2方法被调用"); return "/springmvc/common"; } //根据参数匹配 @RequestMapping(params = "m=method1",method = RequestMethod.GET) public String method1(){ return "login/success"; } //有参数 参数名和请求url内的变量名一致 @RequestMapping(params = "m=method2") public String method2(String name,String pwd){ return name; } //有参数 参数名和请求url内的变量名不一致 @RequestMapping(params = "m=method3",method = RequestMethod.GET) public String method3(@RequestParam("loginName")Stringname,@RequestParam("loginPwd")String pwd,HttpServletRequest request){ request.setAttribute("message",(name + " " + pwd)); return "login/"+name; }
2、 作为Response内容方式 //无参数 @ResponseBody @RequestMapping(params = "m=method4") public String method4(){ return "hello,guys"; } //处理方法入参如何绑定 URL 参数 @ResponseBody @RequestMapping(params = "m=method5",method = RequestMethod.GET) public String method5(String name,String pwd,int delay){ return "name:"+name+","+"pwd:"+pwd+","+"delay:"+delay; } @ResponseBody @RequestMapping(params = "m=method6",method = RequestMethod.GET) public String method6(@RequestParam("userName")String name,DnTest test){ return "DnTest:"+test.toString(); } URL 参数: userName参数将绑定到name上 其他与DnTest类内属性名称一致的参数将绑定到test的对应的属性上,如果参数不全 也不会报错 返回ModelAndView@RequestMapping("/springmvc/modelAndView") public ModelAndView modelAndView(){ ModelAndView mav = new ModelAndView(); mav.setViewName("/springmvc/common"); mav.addObject("message", "modelAndView 方法被调用"); return mav; } 返回ModelMap @RequestMapping("/springmvc/modelMap") public ModelMap modelMap(ModelMap modMap){ List<String> names = new ArrayList<String>(); names.add("Rick"); names.add("Austin"); modMap.put("names", names); modMap.put("message", "hello guys"); modMap.put("comment", "hello guys"); return modMap; } 返回ModelMap@RequestMapping("/springmvc/modelMap") public ModelMap modelAndView(ModelMap modMap){ List<String> names = new ArrayList<String>(); names.add("Rick"); names.add("Austin"); modMap.put("hello", "hello guys"); modMap.put("names", names); return modMap; } @SessionAttribute & ModMap//注解方式 @Controller @SessionAttributes(types = {UserBean.class,String.class},value={"currentUser","message"}) public class AdapterMultiPathController {} //方法体 @RequestMapping("/springmvc/modelMap2") public ModelMap modelMapWithSession(ModelMap modMap,HttpServletRequest request){ List<String> names = new ArrayList<String>(); names.add("Rick"); names.add("Austin"); modMap.put("names",names); modMap.put("message", "hello guys"); modMap.put("comment", "hello guys"); UserBean user = new UserBean(); user.setName("Rick"); user.setMobile("18938900256"); user.setTelephone(request.getParameter("userPhone")); user.setNumber(request.getParameter("userNumber")); modMap.put("currentUser", user); return modMap; } //初次请求 spring mvc & reverse ajax@ResponseBody @RequestMapping(params = "m=method7",method = RequestMethod.GET) public String method7(String name,String pwd,int delay,HttpServletRequest req){ req.startAsync(); Date startTime = new Date(); try { Thread.currentThread().sleep(delay); } catch (InterruptedException e) { e.printStackTrace(); } Date entTime = new Date(); return "name:"+name+","+"pwd:"+pwd+","+"delay:"+delay+",startTime:"+ DateUtils.formatDate(startTime, "yyyy-MM-dd HH:mm:ss:SSS")+",endTime:"+ DateUtils.formatDate(entTime, "yyyy-MM-dd HH:mm:ss:SSS"); } RestFull@Controller @RequestMapping(value = "/rest") public class RestWithController {} @ResponseBody @RequestMapping(value = "/{msg}", method = RequestMethod.GET) public String restString(@PathVariable String msg) { return msg; } @ResponseBody @RequestMapping(value = "/{path}/{value}", method = RequestMethod.GET) public String restXml(@PathVariable String path,@PathVariable String value) { return "path:"+path+",value:"+value; } @ResponseBody @RequestMapping(value = "/xml/{filename}", method = RequestMethod.GET) public String restFile(@PathVariable String filename) { if (filename!=null) { ProjectInits init = ProjectInits.getInstance(); String dir = init.get("resource.dir", "C:/Projects/VoyagerWeb/resources"); FileUtility fUtil = new FileUtility(); String content = fUtil.readFile(dir+"/"+filename+".xml"); return content; } else return "Invalid xml file name ["+filename+"]"; } 验证 是否支持Overload方式一//验证 是否支持Overload @ResponseBody @RequestMapping(value = "/validate/overload1", method = RequestMethod.GET) public String overloadMethod(String name){ return name; } @ResponseBody @RequestMapping(value = "/validate/overload2", method = RequestMethod.GET) public String overloadMethod(String name,DnTest test){ return "DnTest:"+test.toString(); } 方式二/验证 是否支持Overload @ResponseBody @RequestMapping(params = "m=method11") public String method11(String name){ return name; } @ResponseBody @RequestMapping(params = "m=method11") public String method11(int age,DnTest test){ return "DnTest:"+test.toString(); }
|