SpringMVC高級(jí)開發(fā)功能實(shí)現(xiàn)過程解析
一. 全局的異常處理器
1、編寫一個(gè)自定義的異常類, 區(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、編寫一個(gè)全局異常處理器, 這個(gè)處理器必須實(shí)現(xiàn)HandlerExceptionResolver
//將異常處理類交給spring容器管理 @Component public class MyExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // ex 接收是拋出的異常對(duì)象 // 分類處理, 自定義異常, 直接響應(yīng) 錯(cuò)誤信息 // 系統(tǒng)異常, 響應(yīng)的: 系統(tǒng)錯(cuò)誤, 請(qǐng)聯(lián)系管理員 ModelAndView modelAndView = new ModelAndView();if (ex instanceof UserException) {//用戶異常 modelAndView.addObject("error", ex.getMessage()); } else {//系統(tǒng)異常 modelAndView.addObject("error", "系統(tǒng)錯(cuò)誤,聯(lián)系管理員?。?!"); } modelAndView.setViewName("error"); return modelAndView; }
3、 在springMVC的配置文件中配置全局的異常處理器
①使用Component ②在springmvc配置文件中手動(dòng)添加<bean/>
4、掃描這個(gè)exception包中的注解
二、響應(yīng)json支持
AJAX: 要求后臺(tái)響應(yīng)的是數(shù)據(jù), 后臺(tái)重定向,轉(zhuǎn)發(fā)到一個(gè)頁面, 把這個(gè)頁面當(dāng)成一個(gè)數(shù)據(jù),響應(yīng)給ajax,
后臺(tái): java對(duì)象
前臺(tái): ajax--> js對(duì)象, 使用json, 需要后臺(tái)把java對(duì)象轉(zhuǎn)換為json格式的字符串,
Servlet: 使用 json-lib, 手動(dòng)調(diào)用JSONObject
SpringMVC轉(zhuǎn)換json, 使用: 1)jackson *** 2) fastjson
1、導(dǎo)入jackson的依賴: 注意添加完把<type>bundle</type>刪除,會(huì)附帶導(dǎo)入所需要的jar
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency>
Controller方法的返回值 java對(duì)象, 需要配合@ResponseBody, 把方法的返回值作為數(shù)據(jù)響應(yīng)給前端, ****
如果是一個(gè)java對(duì)象,而且導(dǎo)入json的相關(guān)依賴(jaskson/fastJson), 調(diào)用轉(zhuǎn)換器, 把java對(duì)象轉(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]
忽略某個(gè)屬性轉(zhuǎn)換為json
@JsonIgnoreprivate String password;
@RequestBody:主要用來接收前端傳遞給后端的json字符串中的數(shù)據(jù)的(請(qǐng)求體中的數(shù)據(jù)的),只能是post提交,get沒有請(qǐng)求體
注解用于讀取http請(qǐng)求的內(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; }
前端代碼
//請(qǐng)求的是json function requestJson(){ //請(qǐng)求參數(shù)是json // 默認(rèn)情況下, data中json, 變成js對(duì)象, 變成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對(duì)象 }, dataType:"json" }); }
三、文件上傳
1、對(duì)頁面的要求:
form 的method:postform的enctype: 默認(rèn)值: application/x-www-form-urlencoded 一定設(shè)置為: multipart/form-data使用<input type=”file”> 選擇文件
2、對(duì)頁面的要求:
導(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("請(qǐng)選擇圖片"); }else { //保存文件 String savePath = "D:\\upload"; //File類 File pathFile = new File(savePath); if(!pathFile.exists()) { //創(chuàng)建文件夾 pathFile.mkdirs(); } //文件名取名: 時(shí)間戳 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對(duì)象的photoPath屬性賦值 user.setPhotoPath(saveFilename); //調(diào)用業(yè)務(wù)層,保存用戶 userService.saveUser(user); model.addAttribute("msg", "保存成功"); } return "msg"; }
<img src="/img/${user.photoPath }"/>
需要在tomcat中配置映射路徑
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- layui的數(shù)據(jù)表格+springmvc實(shí)現(xiàn)搜索功能的例子
- SpringMVC+EasyUI實(shí)現(xiàn)頁面左側(cè)導(dǎo)航菜單功能
- 利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能
- SpringMVC整合websocket實(shí)現(xiàn)消息推送及觸發(fā)功能
- SpringMVC+Ajax實(shí)現(xiàn)文件批量上傳和下載功能實(shí)例代碼
- SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解
- SpringMVC多個(gè)文件上傳及上傳后立即顯示圖片功能
- Spring MVC+MyBatis+MySQL實(shí)現(xiàn)分頁功能實(shí)例
相關(guān)文章
Json字符串轉(zhuǎn)Java對(duì)象和List代碼實(shí)例
這篇文章主要介紹了Json字符串轉(zhuǎn)Java對(duì)象和List代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析(最新推薦)
Spring?Boot?對(duì)于?Spring?Security?提供了自動(dòng)化配置方案,可以使用更少的配置來使用?Spring?Security,這篇文章主要介紹了SpringBoot整合Spring?Security過濾器鏈加載執(zhí)行流程源碼分析,需要的朋友可以參考下2023-02-02SpringBoot生成PDF的五種實(shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了SpringBoot生成PDF的五種實(shí)現(xiàn)方法,在開發(fā)中經(jīng)常會(huì)遇到需要進(jìn)行對(duì)一些數(shù)據(jù)進(jìn)行動(dòng)態(tài)導(dǎo)出PDF文件,然后讓用戶自己選擇是否需要打印出來,這篇文章我們來介紹五種實(shí)現(xiàn)方法,需要的朋友可以參考下2024-10-10dom4j創(chuàng)建和解析xml文檔的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猟om4j創(chuàng)建和解析xml文檔的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06C++/java 繼承類的多態(tài)詳解及實(shí)例代碼
這篇文章主要介紹了C++/java 繼承類的多態(tài)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Java編程實(shí)現(xiàn)比對(duì)兩個(gè)文本文件并標(biāo)記相同與不同之處的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)比對(duì)兩個(gè)文本文件并標(biāo)記相同與不同之處的方法,涉及java針對(duì)文本文件的讀取、遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10關(guān)于Java中XML Namespace 命名空間問題
這篇文章主要介紹了Java中XML Namespace 命名空間,XML命名空間是由國際化資源標(biāo)識(shí)符 (IRI) 標(biāo)識(shí)的 XML 元素和屬性集合,該集合通常稱作 XML“詞匯”,對(duì)XML Namespace 命名空間相關(guān)知識(shí)感興趣的朋友一起看看吧2021-08-08java高并發(fā)ScheduledThreadPoolExecutor與Timer區(qū)別
這篇文章主要為大家介紹了java高并發(fā)ScheduledThreadPoolExecutor與Timer區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10