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 只需要以形参的实行引入即可

文中的日志可以不管,是随手加上去的,没有实际意义

相关推荐