標籤:form 下拉式清單 split 列表 actor stream 自訂 就會 http
1.)使用 POJO 對象綁定請求參數值
?Spring MVC 會按請求參數名和 POJO 屬性名稱進行自動匹 配,自動為該對象填充屬性值。支援級聯屬性。 如:dept.deptId、dept.address.tel 等
2.)處理模型資料
Spring MVC 提供了以下幾種途徑輸出模型資料:
–ModelAndView: 處理方法傳回值類型為 ModelAndView時, 方法體即可通過該對象添加模型資料
–Map 及 Model、ModelMap: 入參為 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 時,處理
方法返回時,Map 中的資料會自動添加到模型中。
無論我們的傳回值是String類型還是ModelAndView類型,SpringMVC架構執行目標Handler方法之後都會將傳回值解析為ModelAndView;
我們放入到Map或者Model、ModelMap中的資料都會放入ModelAndView對象中,作為MOdel使用!
3.)關於重新導向
一般情況下,控制器方法返回字串類型的值會被當成邏輯視圖名處理
如果返回的字串中帶 forward: 或 redirect: 首碼 時,SpringMVC 會對他們進行特殊處理:將 forward: 和 redirect: 當成指示符,其後的字串作為 URL 來處理
–redirect:/success.jsp:會完成一個到 success.jsp 的重新導向的操作
–forward:/success.jsp:會完成一個到 success.jsp 的轉寄操作
可以在spingmvc設定檔中配置 <mvc:view-controller path="/j1sp" view-name="success"/>標籤,就可以讓我們的請求不經過Controller,直接進入另一個目標頁面!
<!-- 但是此時原來訪問正常的@RequestMapping URL現在卻不能正常訪問了,如果想正常訪問,需要加入<mvc:annotation-driven>該標籤-->
<mvc:annotation-driven></mvc:annotation-driven>
–@SessionAttributes: 將模型中的某個屬性暫存到HttpSession 中,以便多個請求之間可以共用這個屬性
– @ModelAttribute: 方法入參標註該註解後, 入參的對象 就會放到資料模型中
4.)@ModelAttribute註解用於修飾方法,這個@ModelAttribute註解修飾的方法在我們每次請求目標方法之前都會被執行一次!
5.)SpringMVC確定目標方法POJO類型入參的過程:
1.確定一個key:
1).若目標方法的POJO類型的參數木有使用@ModelAttribute作為修飾,則key為POJO類名第一個字母的小寫。
2).若使用@ModelAttribute修飾,則key為@ModelAttribute註解的value屬性值.
2.在implicitModel中尋找key對應的對象,若存在,則作為入參傳入。
1).若在@ModelAttribute標記的方法中在Map儲存過,且key和1確定的key一致,則會擷取到!
3.在implicitModel中不存在key對應的對象,則檢查當前的Handler是否使用@SessionAttribute註解修飾,若使用了該主機,且@SessionAttributes註解的value屬性值中包含了key,則會從HttpSession中來擷取key所對應的value值,若存在則直接傳入到目標方法的入參中,若不存在則將拋出異常。
4.若Handler沒有標識@SessionAttributes註解或者@SessionAttributes註解的value值中不包含key,則會通過反射來建立POJO類型的參數,傳入為目標方法的參數。
5.SpringMVC會把key和POJO對象儲存到implicitModel中,進而會儲存到request域中!
注意:[email protected]標記的方法,會在每個目標方法執行之前被SpringMVC調用!
[email protected]註解可以來修飾目標方法POJO類型的入參,其value屬性值有如下作用:
1).SpringMVC會使用value屬性值在implicitModel中尋找對應的對象,若存在則會直接傳入到目標方法的入參中
2)SpringMVC會以value為key,POJO類型的對象為value,存入到request域中。
6.)@SessionAttributes註解只能標記在類上,可以使得多次請求共用某部一部分資料!
value:指定放入session域中鍵
types:指定放入Session域中的對象的位元組碼!
7.)當出現遍曆的情況我們就是用JSTL標籤,
當我們使用下拉式功能表及選項按鈕、多選按鈕的時候我們就使用springmvc提供的表單標籤,
在表單標籤中的path屬性值相當於我們原生HTML中的name屬性值!
8.)對於靜態資源檔案如【js/css/圖片】的訪問我們需要在spingmvc設定檔中配置一個標籤,如下所示:
<!-- 1.可以映射靜態資源的訪問請求 -->
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
9.)
10.)EmployeeCRUD:
SpringMVC處理靜態資源【匯入js檔案】:
1.為什麼出現這樣的問題:
優雅的REST風格的資源URL不希望帶.html或.do等尾碼,若將DispatcherServlet請求映射配置為/,
則SpringMVC將捕獲WEB容器的所有請求,包括靜態資源的請求,SpringMVC會將他們當成一個普通請求處理,因此找不到對應處理器將導致錯誤。
2.解決:在SpringMVC的設定檔中配置<mvc:default-servlet-handler>
11).當需要表單回顯或者使用下拉式清單的時候,就使用form表單標籤,而如果使用遍曆的標籤就使用JSTL標籤【導包】!
12.)視圖和視圖解析器【參見Springmvc如何解析視圖流程圖片】
?請求處理方法執行完成後,最終返回一個 ModelAndView 對象。對於那些返回 String,View 或 ModeMap 等類型的處理方法,SpringMVC 也會在內部將它們裝配成一個 ModelAndView 對象,它包含了邏輯名和模型對象的視圖
Spring MVC 藉助視圖解析器(ViewResolver)得到最終 的視圖對象(View),最終的視圖可以是 JSP ,也可能是Excel、JFreeChart等各種表現形式的視圖
視圖
視圖的作用是渲染模型資料,將模型裡的資料以某種形式呈現給客戶。
視圖對象由視圖解析器負責執行個體化。由於視圖是無狀態的,所以他們不會有安全執行緒的問題。
自訂視圖
1.自訂視圖,實現view介面或者繼承AbstractView抽象類別,並加入到IOC容器中。
2.在springmvc設定檔中配置BeanNameViewResolver視圖解析器。
13.) 資料格式化標籤:
1.在SpringMVC設定檔中配置<mvc:annotation-driven/>
2.在目標POJO對象的屬性上加上@NumberFormat 或者 @DateTimeFormat 註解!
@DateTimeFormat
–pattern 屬性:類型為字串。指定解析/格式化欄位資料的模式, 如:”yyyy-MM-dd hh:mm:ss”
@NumberFormat
–pattern:類型為 String,自訂樣式, 如patter="#,###";
14.)資料類型轉換以及資料格式化標籤:
資料類型轉換【瞭解】
1. 自訂類型轉換器實現Converter<S,T>介面並加入到SpringMVC的IOC容器中,
@Component
public class EmployeeConverter implements Converter<String, Employee>{
@Override
public Employee convert(String source) {
System.out.println(source);
if(source != null){
String[] vals = source.split("-");
if(vals != null && vals.length ==5){
String name = vals[0];
String email = vals[1];
Integer gender = Integer.parseInt(vals[2]);
Department department = new Department();
department.setId(Integer.parseInt(vals[3]));
Employee employee = new Employee(null, name, email, gender, department);
return employee;
}
}
return null;
}
}
2.配置自訂轉換器到FormattingConversionServiceFactoryBean工廠中!
<!-- 將ConversionService再作為annotation-driven的一個屬性存在! -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置ConversionService -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter"/>
</set>
</property>
</bean>
15.)SpringMVC如何處理JSON資料?
1.加入json的3個jar包
jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar
2. 編寫目標方法,使其返回 JSON 對應的對象或集合
3. 在方法上添加 @ResponseBody 註解
6.)檔案上傳
Spring MVC 上下文中預設沒有為檔案上傳提供了直接的支援,因 此預設情況下不能處理檔案的上傳工作,如果想使用 Spring 的檔案上傳功能,需現在上下文中配置 CommonsMultipartResovler:
1.加入jar包:
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
2.在SpringMVC設定檔中配置CommonsMultipartResovler
<!-- 配置CommonsMultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<!-- 以位元組為單位 -->
<property name="maxUploadSize" value="1024000"></property>
</bean>
2.表單:POST請求,file類型,enctype="multipart/form-data"
檔案上傳
@RequestMapping(value="testUpload",method=RequestMethod.POST)
public String testUpload(HttpServletRequest request,@RequestParam(value="desc",required=false) String desc,@RequestParam("photo") CommonsMultipartFile file) throws Exception{
ServletContext servletContext = request.getServletContext();
String realPath = servletContext.getRealPath("/upload");
File file1 = new File(realPath);
if(!file1.exists()){
file1.mkdir();
}
OutputStream out;
InputStream in;
//uuid_name.jpg
String prefix = UUID.randomUUID().toString();
prefix = prefix.replace("-","");
String fileName = prefix+"_"+file.getOriginalFilename();
System.out.println(fileName);
out = new FileOutputStream(new File(realPath+"\\"+fileName));
in = file.getInputStream();
IOUtils.copy(in, out);
out.close();
in.close();
return "success";
}
SpringMVC基本操作(2)