SpringMVC 二 :controller
环境搭建好后就是Controller的编写了
1 可以通过继承AbstractController,实现protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp)方法,访问这个Controller,默认访问这个方法【此方法就相当Strust2的execute()方法】
在[servlet-name]-servlet.xml中注册这个bean,<bean name="xxx.xxx" class = "这个类的全限定名" />
通过url xxx.xxx访问这个controller
2 @Controller注解,实际开发中基本上也都是这种方式
2.1 基本形式
@RequestMapping(value="/findUser",method=RequestMethod.GET) public String findUser(@RequestParam String username){ System.out.println("username is "+username); return "example"; //视图名称 }
@RequestParam注解:url中?后面必须带username,否则会报错404,如果不加这个注解也可以起到同样 的作用,容错性要高。
return 返回的就是视图名称 ,会根据[dispatcherservlet-name]-servlet.xml中resolver跳转到对应的视图。
2.2 返回ModelAndView
@RequestMapping(value="/findUser",method = RequestMethod.POST) public ModelAndView findUser(User user){ ModelAndView mv = new ModelAndView("user"); //返回ModelAndView形式,试图名称在这里写 mv.addObject("user", user); //通过"user"取值 mv.addObject(user);//通过user类型取值 return mv; //返回ModelAndView }
在user.jsp中可以取到user对象
2.3 关于Bean中有Date类型的属性: 通过@InitBinder
@RequestMapping("/todate") public ModelAndView toDate(Date date){ ModelAndView mv = new ModelAndView("user"); mv.addObject("today", "2016-04-19"); mv.addObject(date); return mv; } //由于请求过来的url中的参数都是String类型,所以当Bean中有Date的时候会自动将String转换为Date @InitBinder public void initBinder(ServletRequestDataBinder binder){ binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); }
3 controller返回数据给JSP
3.1 通过Map向页面传递参数
@RequestMapping(value="/show",method=RequestMethod.GET) public String showUser(Map<String,Object> map){ User user = new User("tomcat","tomcat",11); map.put("user", user); return "show"; } @RequestMapping("/getuser") public void getPerson(String username,PrintWriter pw){ pw.write("hello : "+username); }
和普通方式一样, 第二个方法和Map方式返回数据无关,顺手贴上去
3.2 file upload:
jsp页面:
<form action="user/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> type和name都必须是file <input type="submit" value="submit"> </form>
controller中:
@RequestMapping("/upload") public ModelAndView uploadFile(HttpServletRequest req,ModelAndView mv) throws Exception{ logger.info(">>>>>>>>>上传文件开始........."); MultipartHttpServletRequest mulReq = (MultipartHttpServletRequest)req; MultipartFile file = mulReq.getFile("file");//jsp中name="file" String originalFilename = file.getOriginalFilename(); String newFileName = originalFilename.substring(0,originalFilename.lastIndexOf('.')); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); FileOutputStream fos = new FileOutputStream("D:/app/"+newFileName+"_"+sdf.format(new Date())); //文件存储位置 fos.write(file.getBytes()); fos.flush(); fos.close(); logger.error(">>>>>>>>>上传文件出错......."); return mv; }
4 通过Model 将数据返回给jsp
@RequestMapping(value="/list",method=RequestMethod.GET) public String listUser(Model model){ logger.info(">>>>>>>>>进入userList方法......"); model.addAttribute("users", users); return "user/list"; }
jsp中
<c:forEach items="${users }" var="user"> <a href="${pageContext.request.contextPath }/user/${user.value.username }">${user.value.username }</a>---${user.value.pwd }---${user.value.age }<br> </c:forEach>
5 springmvc的restful形式 @PathVariable注解
@RequestMapping(value="/{username}",method=RequestMethod.GET) public String showUser(@PathVariable String username,Model model){ logger.info(">>>>>>>>>进入showUser方法......"); model.addAttribute("user", users.get(username)); logger.error(">>>>>>>>>查询用户失败........."); return "user/show"; }
要在controller中的获取request、response、sesison 只需要以形参的实行引入即可
文中的日志可以不管,是随手加上去的,没有实际意义
相关推荐
@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象进行绑定。加上@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据。