SpringMVC基本操作(2)
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)