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>