Springmvc学习第二天

一 高级参数绑定

    基本的springmvc配置,这里就不细说了。

    (a)数组类型参数绑定

        测试代码

public class AdvancedArgsController {

@RequestMapping(value="/array",method=RequestMethod.GET)
public String index() {
return "array";
}

@RequestMapping(value="/array",method=RequestMethod.POST)
public String array(String[] hobby,Model model) {
model.addAttribute("hobby", hobby);
return "array";
}

     jsp页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>hobby</title>
</head>
<body>
<h1>兴趣爱好调查</h1>
<form action="${pageContext.request.contextPath}/array" method="post">
<h2><input type="checkbox" name="hobby" value="葡萄牙"/>葡萄牙</h2>
<h2><input type="checkbox" name="hobby" value="西班牙"/>西班牙</h2>
<h2><input type="checkbox" name="hobby" value="法国"/>法国</h2>
<h2><input type="submit" value="确认"/></h2>
</form>
<h1>调查结果如下:</h1>
<c:forEach items="${hobby}" var="h">
<h2>${h}</h2>
</c:forEach>
</body>
</html>

   开启服务器测试

这里注意点:1 中文乱码问题:springmvc有自带的CharacterEncodingFilter,只需要在web.xml文件中配置一下即可,配置方法和servlet相似;2 @RequestMapping(Method=method=RequestMethod.GET),这个只接受get请求,同样postz只接受post请求。官方文档spring4.3之后还提供了@PostMapping和@GetMapping,我用过映射不上去,这里咱不研究,有老哥知道需要什么特殊配置吗

    (b)list类型参数绑定

踩过的坑:(1)接收List类型的数据必须是pojo的属性,如果方法的形参为ArrayList类型无法正确接收到数据;(2)list类型,参数名最好和提交的input选项名一直,可以直接映射上(具体见代码)


@Controller
public class AdvancedArgsController {

@RequestMapping(value="/list",method=RequestMethod.GET)
public String index() {
return "array";
}

@RequestMapping(value="/array",method=RequestMethod.POST)
public String array(String[] hobby,Model model) {
model.addAttribute("hobby", hobby);
return "array";
}

@RequestMapping(value="/list",method=RequestMethod.POST)
public String list(TestObject hobby,Model model) {
model.addAttribute("hobby", hobby.getHobby());
return "array";
}
}

二 Controller方法的返回值问题

    之前用的只是String类型,返回(普通)字符串,这是代表逻辑视图名,经过视图解析器解析为物理试图地址(特别好用)

再介绍几种返回值类型:返回void,redirect重定向,forword转发,下面尝试一下:

@Controller
@RequestMapping("/args")
public class MethodArgsController {
@RequestMapping("/servlet")
public void servlet(HttpServletResponse resq) {
try {
resq.getWriter().write("response!!!!!!");
resq.flushBuffer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

/@Controller
public class AdvancedArgsController {


@RequestMapping(value = "/array", method = RequestMethod.GET)
public String index() {
return "array";
}

// 重定向一个页面
@RequestMapping(value = "/redirect", method = RequestMethod.POST)
public String redirect(TestObject hobby, Model model) {
model.addAttribute("hobby", hobby.getHobby());
return "redirect:array";
}


// 转发
@RequestMapping(value = "/forward", method = RequestMethod.POST)
public String forward(TestObject hobby, Model model) {
model.addAttribute("hobby", hobby.getHobby());
return "forward:hobby";
}


直接返回ModelAndView,这样返回的内容就会被直接写死!!!

//返回
@RequestMapping("/mv")
public ModelAndView mandv() {
ModelAndView mv = new ModelAndView();
mv.setViewName("hobby");
mv.addObject("hobby", new String[] {"德国","法国"});
return mv;
}

三 异常处理器

    正常我们在写代码的时候,出现异常要么是try catch,要么就是向上抛异常(最终还是要try catch),这样很多异常就有很多个try catch,会造成代码重复。springmvc提供了一个HandlerExceptionResolver,异常处理器解析器。之前学spring aop的时候,学过一个环绕增强,可以包裹异常,这里这个异常处理器解析器更牛逼!!!这里可以参考一下他的源代码。

    我们先编写一个全局异常处理器解析器类,代码如下:

public class GlobleHandlerExceptionResolver implements HandlerExceptionResolver{


@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mv = new ModelAndView();
//正常这里是记录发生异常的日志,我是直接打印到控制台
ex.printStackTrace();
//自定义错误,这样界面就可以设计成我们想要的样子
mv.setViewName("error");
mv.addObject("error", ex.getMessage());
return mv;
}


}

然后在springmvc.xml中配置全局异常处理器解析器

        <!-- 全局异常处理器解析器 -->

<bean class="com.springmvc.controller.GlobleHandlerExceptionResolver"></bean>

配好过后自定义一个异常controller进行测试


四 图片上传(详情请见下一章)

    之前学习Servlet的时候,图片文件上传使用fileupload,和io流,springmvc有上传解析器。




猜你喜欢

转载自blog.csdn.net/weixin_42010394/article/details/80765121