SpringMVC高級開發(fā)功能實現(xiàn)過程解析
一. 全局的異常處理器

1、編寫一個自定義的異常類, 區(qū)分哪些異常是系統(tǒng)異常, 哪些異常是用戶不正當(dāng)操作的異常
//繼承Exception
public class UserException extends Exception{
private static final long serialVersionUID = -8469276157483476569L;
public UserException() {
super();
}
public UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(String message) {
super(message);
}
public UserException(Throwable cause) {
super(cause);
}
2、編寫一個全局異常處理器, 這個處理器必須實現(xiàn)HandlerExceptionResolver
//將異常處理類交給spring容器管理
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
// ex 接收是拋出的異常對象
// 分類處理, 自定義異常, 直接響應(yīng) 錯誤信息
// 系統(tǒng)異常, 響應(yīng)的: 系統(tǒng)錯誤, 請聯(lián)系管理員
ModelAndView modelAndView = new ModelAndView();if (ex instanceof UserException) {//用戶異常
modelAndView.addObject("error", ex.getMessage());
} else {//系統(tǒng)異常
modelAndView.addObject("error", "系統(tǒng)錯誤,聯(lián)系管理員!??!");
}
modelAndView.setViewName("error");
return modelAndView;
}
3、 在springMVC的配置文件中配置全局的異常處理器
①使用Component ②在springmvc配置文件中手動添加<bean/>
4、掃描這個exception包中的注解
二、響應(yīng)json支持

AJAX: 要求后臺響應(yīng)的是數(shù)據(jù), 后臺重定向,轉(zhuǎn)發(fā)到一個頁面, 把這個頁面當(dāng)成一個數(shù)據(jù),響應(yīng)給ajax,
后臺: java對象
前臺: ajax--> js對象, 使用json, 需要后臺把java對象轉(zhuǎn)換為json格式的字符串,
Servlet: 使用 json-lib, 手動調(diào)用JSONObject
SpringMVC轉(zhuǎn)換json, 使用: 1)jackson *** 2) fastjson
1、導(dǎo)入jackson的依賴: 注意添加完把<type>bundle</type>刪除,會附帶導(dǎo)入所需要的jar
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency>
Controller方法的返回值 java對象, 需要配合@ResponseBody, 把方法的返回值作為數(shù)據(jù)響應(yīng)給前端, ****
如果是一個java對象,而且導(dǎo)入json的相關(guān)依賴(jaskson/fastJson), 調(diào)用轉(zhuǎn)換器, 把java對象轉(zhuǎn)換為json格式字符串響應(yīng)給前端
把日期轉(zhuǎn)換為 指定格式的字符串
@DateTimeFormat(pattern = "yyyy-MM-dd") // SpringMVC的注解, 把前端的字符串轉(zhuǎn)換為Date
@JsonFormat(pattern = "yyyy-MM-dd") // jackson的注解, 把Date轉(zhuǎn)換為json指定格式的字符串@JsonFormat(pattern = "yyyy-MM-dd")
private Date brithday;[/code]
忽略某個屬性轉(zhuǎn)換為json
@JsonIgnoreprivate String password;
@RequestBody:主要用來接收前端傳遞給后端的json字符串中的數(shù)據(jù)的(請求體中的數(shù)據(jù)的),只能是post提交,get沒有請求體
注解用于讀取http請求的內(nèi)容(字符串),通過springmvc提供的HttpMessageConverter接口將讀到的內(nèi)容轉(zhuǎn)換為json、xml等格式的數(shù)據(jù)并綁定到controller方法的參數(shù)上。
//前端發(fā)送json, 響應(yīng)json
@RequestMapping("/queryUserByCondition.action")
@ResponseBody
public User queryUserByCondition( @RequestBody User user) throws Exception{
return user;
}
前端代碼
//請求的是json
function requestJson(){
//請求參數(shù)是json
// 默認情況下, data中json, 變成js對象, 變成key/value
//contentType:"application/json;charset=utf-8", 改為json 格式的傳輸
$.ajax({
url:"${pageContext.request.contextPath }/user/queryUserByCondition.action",
type:"post",
//data:"id=2&username=張三&sex=男&brithday=1999-12-21",
contentType:"application/json;charset=utf-8",
data:'{"id":3,"username":"李四","sex":"男","brithday":"2012-12-12"}',
success:function(rs){
alert(rs.username+"-->"+rs.sex); // json 字符串轉(zhuǎn)換為js對象
},
dataType:"json"
});
}
三、文件上傳
1、對頁面的要求:
form 的method:postform的enctype: 默認值: application/x-www-form-urlencoded 一定設(shè)置為: multipart/form-data使用<input type=”file”> 選擇文件
2、對頁面的要求:
導(dǎo)入文件上傳的依賴: commons-fileupload commons-io
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
3、在springMVC配置文件上傳的解析器
<!-- 文件上傳 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設(shè)置最大的上傳文件大小 :10M--> <property name="maxUploadSize" value="10485760"></property> </bean>
注意:bean的id一定為multipartResolver,否則獲取不到數(shù)據(jù)
4、文件代碼
@PostMapping("/addUser.action")
public String addUser(User user, MultipartFile photo,Model model) throws Exception{
if(photo == null) {
throw new UserException("請選擇圖片");
}else {
//保存文件
String savePath = "D:\\upload";
//File類
File pathFile = new File(savePath);
if(!pathFile.exists()) {
//創(chuàng)建文件夾
pathFile.mkdirs();
}
//文件名取名: 時間戳 UUID
//獲取上傳文件的后綴名
String uploadFileName = photo.getOriginalFilename();
String suffix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
String saveFilename = UUID.randomUUID().toString().replace("-", "").toUpperCase()+suffix;
//保存
photo.transferTo(new File(savePath,saveFilename));
//給user對象的photoPath屬性賦值
user.setPhotoPath(saveFilename);
//調(diào)用業(yè)務(wù)層,保存用戶
userService.saveUser(user);
model.addAttribute("msg", "保存成功");
}
return "msg";
}
<img src="/img/${user.photoPath }"/>
需要在tomcat中配置映射路徑

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決Intellij IDEA運行報Command line is too long的問題
這篇文章主要介紹了解決Intellij IDEA運行報Command line is too long的問題,本文通過兩種方案給大家詳細介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Java8的default和static關(guān)鍵字的使用講解
今天小編就為大家分享一篇關(guān)于Java8的default和static關(guān)鍵字的使用講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
MyBatis-Plus更新對象時將字段值更新為null的四種常見方法
MyBatis-Plus 是一個 MyBatis 的增強工具,在簡化開發(fā)、提高效率方面表現(xiàn)非常出色,而,在使用 MyBatis-Plus 更新對象時,默認情況下是不會將字段值更新為 null 的,如果你需要將某些字段的值更新為 null,有幾種方法可以實現(xiàn),本文將介紹幾種常見的方法2024-11-11

