- SpringMVC的響應數據
1. 返回值爲字符串:
* 無關鍵字:表示跳轉到對應的jsp頁面,通過視圖解析器查找相應資源
* 關鍵字:
forward:/WEB-INF/pages/success.jsp
redirect:/index.jsp
2. 返回值爲void:
表示默認跳轉到該RequestMapping中path屬性值的jsp頁面
* 參數列表傳入HttpServletRequest和HttpServletResponse對象,然後調用重定向或者轉發方法
request轉發需要手動寫全資源文件在本項目的路徑
response重定向構建路徑時需要加上request》getContextPath()前綴
3. 返回值爲ModelAndView對象:
ModelAndView對象是Spring提供的一個對象,可以用來調整具體的JSP視圖
* 在方法中創建一個ModelAndView對象
* 使用ModelAndView對象的addObject方法可以將屬性和值存入到request域中
* 使用ModelAndView對象的setViewName方法可以跳轉到指定頁面(通過視圖解析器來查找指定頁面)
- SpringMVC實現異步請求
1. 出現問題:
a. DispatcherServlet控制器攔截了所有請求,此時需要釋放關於靜態資源的請求
在/resource/springmvc.xml配置中前端控制器,相應靜態資源不攔截
<!-- 設置靜態資源不過濾 -->
<mvc:resources location="/css/" mapping="/css/**"/> <!-- 樣式 -->
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 圖片 -->
<mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
2. 加載jQuery文件
3. 導入jar包,用於解析json數據
ackson-databind.jar
jackson-core.jar
ackson-annotations.jar
4. 使用@RequestBody註解可以自動調用相應jar包將json字符串封裝到Bean對象中
5. 使用@ResopnseBody註解可以自動調用相應jar包將Bean對象轉化爲json格式字符串
6. 使用:
$(function(){
// 綁定點擊事件
$("#btn").click(function(){
$.ajax({
url:"user/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"addressName":"哈哈","addressNum":100}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.addressName);
}
});
});
});
//在方法中使用註解自動調用相應jar包來轉化
@RequestMapping("/testJson")
public @ResponseBody Address testJson(@RequestBody Address address) {
System.out.println(address);
//可以修改對象屬性
address.setAddressName("上海");
return address;
}
- SpringMVC實現文件管理
1. 前提:
a. enctype屬性:表單請求正文的類型
form表單的enctype取值必須是:multipart/form-data
默認值爲:application/x-www-form-urlencoded
b. method屬性:表單提交方式
必須爲post(可以上傳不限制大小的文件)
c. 提供一個文件選擇域:
<input type="file" />
2. 導入相關jar包
commons-fileupload.jar
commons-io.jar
3. 傳統方式實現文件上傳:
@Controller
@RequestMapping(value="/fileupload")
public String fileupload(HttpServletRequest request) throws Exception {
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
if(!file.exists()) {
file.mkdirs();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
List<FileItem> list = fileUpload.parseRequest(request);
for (FileItem fileItem : list) {
if(fileItem.isFormField()) {
}else {
String filename = fileItem.getName();
fileItem.write(new File(file, filename));
fileItem.delete();
}
}
return "success";
}
4. 基於SpringMVC框架實現文件上傳
* 配置好文件解析器後,不再需要自己去解析request域來獲取文件對象
* 文件解析器配置的id值必須爲multipartResolver
* 直接在對應的方法參數中傳入MultipartFile對象作爲參數,框架自動封裝文件對象到該變量中去
* 此時,要求表單中file類型的input標籤其name屬性值必須與MultipartFile類型變量名相同
/resource/springmvc.xml
<!-- 配置文件解析器對象,要求id名稱必須是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
/Upload.java
@RequestMapping(value="/fileupload2")
public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception {
System.out.println("SpringMVC方式的文件上傳...");
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
if(!file.exists()) {
file.mkdirs();
}
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
filename = uuid+"_"+filename;
upload.transferTo(new File(file,filename));
return "success";
}
- springmvc跨服務器方式文件上傳
1. 實際應用過程中,可能需要不同功能的服務器:
* 應用服務器:部署應用
* 數據庫服務器:運行數據庫
* 緩存和消息服務器:處理大併發訪問的緩存和消息
* 文件服務器:存儲用戶上傳的文件
2. 跨服務器文件上傳相關jar包:
jersey-client.jar
jersey-core.jar
3. 使用步驟:
* 跨服務器上傳不再需要創建本地文件夾,但是需要指明文件服務器的存儲路徑(url)
* 由應用服務器獲取到upload文件後,向文件服務器上傳
a. 創建客戶端對象
b. 和文件服務器建立連接
c. 上傳文件
@RequestMapping("/fileupload")
public String fileupload3(MultipartFile upload) throws Exception {
System.out.println("SpringMVC跨服務器方式的文件上傳...");
String path = "http://localhost:9090/fileService/uploads/";
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
filename = uuid+"_"+filename;
Client client = Client.create();
WebResource webResource = client.resource(path+filename);
webResource.put(upload.getBytes());
return "success";
}
- SpringMVC中的異常處理
1. 由Controller處理器將異常拋給前端控制器後,可以配置異常處理器組件處理異常,而不是拋給瀏覽器顯示
2. 異常處理步驟:
a. 編寫自定義異常類(用於顯示提示信息),繼承自Exception類
b. 在可能出現異常的代碼上包裹try/catch,在catch中throw new 自定義異常類()
c. 編寫異常處理器類,需要實現HandlerExceptionResolver接口,並實現抽象方法(處理異常業務)
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
CustomException customException = null;
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
customException = new CustomException("系統錯誤,請與系統管理 員聯繫!");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
d. 配置異常處理器
使用bean標籤將自定義異常處理類配置到springmvc.xml中
<bean id="xxx" class="自定義異常處理器類全路徑"></bean>
- SpringMVC中的攔截器
1. 攔截器與過濾器
過濾器是servlet規範中的一部分,任何java web工程都可以使用。
攔截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
過濾器在url-pattern中配置了("/*")之後,可以對所有要訪問的資源攔截。
攔截器它是隻會攔截訪問的Controller中的方法,如果訪問的是jsp,html,css,image或者js是不會進行攔截的。
它也是AOP思想的具體應用。
我們要想自定義攔截器, 要求必須實現:HandlerInterceptor接口。
2. HandlerInterceptor接口內部已經實現了其方法的默認形式
對其中的方法進行重寫可以自定義攔截器的功能
* preHandle方法是controller方法執行前攔截的方法
1. 可以使用request或者response跳轉到指定的頁面
2. return true放行,執行下一個攔截器,如果沒有攔截器,執行controller中的方法。
3. return false不放行,不會執行controller中的方法。
* postHandle是controller方法執行後執行的方法,在JSP視圖執行前。
1. 可以使用request或者response跳轉到指定的頁面
2. 如果指定了跳轉的頁面,那麼controller方法跳轉的頁面將不會顯示。
* afterCompletion方法是在JSP頁面執行後執行
1. request或者response不能再跳轉頁面了
3. 在spring.xml文檔中配置攔截器
/resource/sprinmvc.xml
<!-- 配置攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 哪些方法進行攔截 -->
<mvc:mapping path="/user/*"/>
<!--
或者配置哪些方法不進行攔截
<mvc:exclude-mapping path=""/>
-->
<!-- 註冊攔截器對象 -->
<bean class="cn.itcast.demo1.MyInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 哪些方法進行攔截 -->
<mvc:mapping path="/**"/>
<!-- 註冊攔截器對象 -->
<bean class="cn.itcast.demo1.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>