环境搭建好后就是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 只需要以形参的实行引入即可
文中的日志可以不管,是随手加上去的,没有实际意义