6.Spring 中异常处理
6.1 配置Spring框架提供异常处理对象 SimpleMappingExceptionResolver
处理所有的异常 ,其中error1是检查异常,error运行时异常。
配置文件
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">error1</prop>
<prop key="java.lang.RuntimeException">error</prop>
</props>
</property>
</bean>
控制器中人为制造两个异常。运行时异常和检查异常
@RequestMapping("/toLogin.do")
public String toLogin() throws Exception {
if (1==1) {
throw new RuntimeException();
//throw new Exception();
}
return "login";
}
6.2 自定义异常处理器 ---- 实现 HandlerExceptionResolver 即可
一定要注意这点你写抓取异常的顺序应该是从子到父,不然会让后面具体的异常抓不到。
<!-- 配置自定义的异常处理器 -->
<bean class="com.xdl.resolver.XdlMyExceptionResolver">
</bean>
@Controller
public class XdlMyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,Exception e) {
ModelAndView mav = new ModelAndView();
if (e instanceof RuntimeException) {
mav.setViewName("error");
} else {
mav.setViewName("error1");
}
return mav;
}
}
6.3 局部异常处理
@ExceptionHandler 加在某个控制器方法上,则这个控制器出现异常时会自动调用这个带有@ExceptionHandler的
方法 注意这个方法必须有异常参数。
在XdlLoginControler这个控制器中添加局部异常处理并指定发生异常时跳转到指定的错误页面tedingcuowu.jsp
@ExceptionHandler
public String suibian(Exception e) {
return "tedingcuowu";
}
需要写一个特定的错误页面。
7.文件上传(Spring 中的文件上传必须理解)
7.1 做一个文件上传页面 <form action="upload.do" method="post" enctype="multipart/form-data" type="file">死的
文件上传页面 upload.jsp
<form action="upload.do" method="post" enctype="multipart/form-data" type="file">
<input type="text" name="acc_no"><br>
<input type="file" name="mf">
<input type="submit" value="提交">
</form>
文件上传后显示的页面 show.jsp
<h1>上传过来的图片。。。</h1>
<img src="${imgPath}" style="width: 500px" >
7.2 写一个文件上传的控制器
(1)配置一个文件解析器。格式是死的,牢记bean的id号不写别的文件解析器依赖于第三方jar包jd包中。
<!-- 配置一个文件解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
(2)写一个文件上传的控制器。控制器参数是MutilpartFile 类型
@Controller
public class XdlUploadFileController {
@RequestMapping("/toUpload.do")
public String toUpload() {
return "upload";
}
@RequestMapping("/upload.do")
public String upload(String acc_no,MultipartFile mf,
HttpServletRequest request) {
System.out.println(acc_no+":"+mf.getName()+":"+mf.getOriginalFilename()
+":"+mf.getSize());
//获取磁盘真实路径 是webapps下的images
String realPath = request.getServletContext().getRealPath("imges");
//构建文件名
String oriName = mf.getOriginalFilename();
//文件名字后缀
String suffix = oriName.substring(oriName.indexOf("."));
String fileName = acc_no+System.currentTimeMillis()+suffix;
request.setAttribute("imgPath", "imges/"+fileName);
String filePath = realPath+"/"+fileName;
File file = new File(filePath);
try {
mf.transferTo(file);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "show";
}
}
配置文件上传过程中出现的文件上传大小的异常!!!文件解析器中加入两个控制异常的setter注入语句。
<property name="maxUploadSize" value="10240"></property> 控制其上传文件的大小
<property name="resolveLazily" value="true"></property> 推迟异常可以被控制器里的局部异常处理而不被全局异常处理。
<!-- 配置一个文件解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10240"></property>
<property name="resolveLazily" value="true"></property>
</bean>
在文件上传控制器中加入一个处理局部异常的方法
XdlUpLoadFileController.java中加入局部异常处理
@ExceptionHandler
public String cuowuchuli(Exception e) {
return "fileerror";
}
8.Spring 控制器中返回JSON 字符串
搭建完成了基于标注的Spring MVC
8.1 建立一个控制器方法 方法的返回值 就是你要把什么类型的转化成JSON
8.2 使用@ResponseBody 它负责把数据转换成JSON 并且告诉控制器
这个JSON结果不走ViewResolver 而是直接返回。注意这个标注底层实现依赖于JSON转换jar包。
XdlLoginController控制器中添加两个返回其他类型的方法
@ResponseBody
@RequestMapping("/login3.do")
public XdlBankAccount login3() {
Random random = new Random();
XdlBankAccount account = new XdlBankAccount(random.nextInt(100),
"acc"+random.nextInt(1000),"1"+random.nextInt(1000),random.nextInt()*1.5);
return account;
}
@ResponseBody
@RequestMapping("/login2.do")
public Boolean login2() {
long time = System.currentTimeMillis();
if (time%2==0) {
return false;
}else{
return true;
}
}
test.jsp用来测试login3.do获取到的XdlBankAccount类型中的acc_no字段
发送ajax请求进行弹窗口
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript">
function sendAJAX() {
$.ajax({
url:"login3.do",
type:"post",
success:function(data){
alert(data.acc_no);
},
dataType:"json"
});
}
</script>
</head>
<body>
<input type="button" value="发送ajax请求" onclick="sendAJAX()">
</body>