內容:
1.值傳遞
2.編碼過濾器
3.類型轉換器的配置
4.SpringMVC的轉發與重定向
5.處理器經常使用返回類型
6.SpringMVC引入靜態資源文件(js,css)等
7.SpringMVC中經常使用註解
8.文件上傳
1.值傳遞
1.含有自定義屬性的自定義類型
實體:
public class Person {
private String address;
private User user;
}複製代碼
Jsp頁面:
<form action="saveUser" method="post">
編號:<input type="text" name="user.uid">
姓名:<input type="text" name="user.uname">
生日:<input type="text" name="birthday">
<input type="submit" value="提交">
生日:<input type="text" name="birthday">
</form>
複製代碼
後臺:
@RequestMapping("saveUser")//1. 含有自定義屬性的自定義類型
public String saveUser(Model m, Person p){
m.addAttribute("msg",p);
return "index";
}
複製代碼
附加:
<!-- 定義視圖解析器的先後綴-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--因爲我配置了這個先後綴,
因此其餘代碼默認都視爲
例如 return "main"至關與 return "main.jsp"-->
複製代碼
2.含有自定義屬性List集合的自定義類型:
實體:
public class Person {
private String address;
private List users;
}複製代碼
Jsp頁面:
<form action="saveUserByList" method="post">
編號:<input type="text" name="users[0].uid"/>
姓名:<input type="text" name="users[0].uname"/>
地址:<input type="text" name="address"/>
<hr>
<hr>
編號:<input type="text" name="users[1].uid"/>
姓名:<input type="text" name="users[1].uname"/>
地址:<input type="text" name="address"/>
<input type="submit" value="提交">
</form>
複製代碼
後臺:
@RequestMapping("saveUserByList")//2. 含有自定義屬性List集合的自定義類型
public String saveUserByList(Model m,Person p){
m.addAttribute("msg",p);
return "index";
}
複製代碼
3.含有自定義屬性Set集合的自定義類型
實體:
public class Person {
private String address;
private Set<User> userSet=new HashSet<>();
}
無參構造:
public Person() {
userSet.add(new User());
userSet.add(new User());
}
複製代碼
Jsp頁面:
<form action="saveUserBySet" method="post">
編號:<input type="text" name="userSet[0].uid"/><br>
姓名:<input type="text" name="userSet[0].uname"/><br>
<hr>
<hr>
編號:<input type="text" name="userSet[1].uid"/><br>
姓名:<input type="text" name="userSet[1].uname"/><br>
地址:<input type="text" name="address"/><br>
<input type="submit" value="提交">
</form>
複製代碼
後臺:
@RequestMapping("saveUserBySet")//3. 含有自定義屬性Set集合的自定義類型
public String saveUserBySet(Model m,Person p){
m.addAttribute("msg",p);
return "index";
}
複製代碼
4.含有自定義屬性Map集合的自定義類型:
實體:
public class Person {
private String address;
private User user;
private Map<String,User> userMap;
}
複製代碼
Jsp頁面:
<form action="saveUserByMap" method="post">
編號:<input type="text" name="userMap['a'].uid"/><br>
姓名:<input type="text" name="userMap['a'].uname"/><br>
<hr>
<hr>
編號:<input type="text" name="userMap['1'].uid"/><br>
姓名:<input type="text" name="userMap['1'].uname"/><br>
地址:<input type="text" name="address"/><br>
<input type="submit" value="提交">
</form>
複製代碼
後臺:
@RequestMapping("saveUserByMap")//4. 含有自定義屬性Map集合的自定義類型
public String saveUserByMap(Model m,Person p){
m.addAttribute("msg",p);
return "index";
}
複製代碼
2.編碼過濾器
在Web.xml中配置以下:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
複製代碼
3.類型轉換器的配置
注:參數適配器錯誤
1.註解方式配置轉換器:
直接在屬性上加上註解:
public class User {
private String uname;
private String password;
//DateTimeFormat:日期格式化註解,
//在Spring MVC框架中,時間類型的數據沒法自動綁定
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}
複製代碼
2.自定義轉換器
1.建立轉換器類:
public class DateConvertor implements Converter<String, Date> {
@Override
public Date convert(String s) {
//建立時間格式化對象
SimpleDateFormat sif = new SimpleDateFormat("yyyy-MM-dd");
Date date=null;
try {
date = sif.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
複製代碼
2.在SpringMVC的配置文件中實例化轉換器服務:
<!-- 建立自定義轉換器對象-->
<bean id="dac" class="com.springmvc.utils.DateConvertor"/>
<!-- 實例化轉換器服務,把自定義轉換器對象注入converters中-->
<bean id="myConverter" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" ref="dac"/>
</bean>複製代碼
3.在註解驅動中加載類型轉換器服務:
<!-- 開啓MVC註解驅動--> <mvc:annotation-driven conversion-service="myConverter"/>
4.SpringMVC中的轉發與重定向
1.默認以轉發的方式跳轉到相應的頁面和請求
2.重定向到指定的頁面或者請求:
例如:
return "redirect:頁面"(後綴不能省略)
return "redirect:請求名"(支持相對路徑和絕對路徑)
@RequestMapping("res1")
public String demo01(){
return "redirect:main.jsp";
/*重定向到某一個頁面時,後綴不能夠省略,省略是重定向到某一個請求。*/
}
複製代碼
3.重定向傳值:
1.redirect:請求名?變量=值&變量=值...
@RequestMapping("res2")
public String demo02(int uid){
return "redirect:res3?uid="+uid;
}
@RequestMapping("res3")
public String demo03(int uid){
System.out.println(uid);
return null;
}
複製代碼
2.經過model傳值:底層傳值方式和上面第一種同樣,相似get傳值
@RequestMapping("res4")
public String demo04(Model m,int uid){
m.addAttribute("uid",uid);
return "redirect:res3";
}
複製代碼
3.Flash傳值:
特色:
1.post傳值方式,不會將值顯示到瀏覽器上
2.傳遞的值會自動綁定到重定向的model裏
3.能夠傳遞自定義類型的變量
@RequestMapping("res5")
public String demo05(int uid, RedirectAttributes ra){
ra.addFlashAttribute("uid",uid);//傳遞自定義類型
ra.addFlashAttribute("user",new User(1,"lll"));
return "redirect:res6";
}
複製代碼
注:若是須要在重定向的model裏獲取值,能夠將其轉換爲map集合,具體代碼以下:
@RequestMapping("res6")
public String demo06(Model m){
Map<String, Object> map = m.asMap();
for (String s : map.keySet()) {
System.out.println("取值:"+map.get(s));
}
return "main";
}
複製代碼
5.處理器經常使用返回類型
1.String
默認將String做爲試圖名:
@RequestMapping("r1")//將String做爲視圖名
public String r1(){
return "main";
}
複製代碼
在異步請求中,將String字符串直接做爲Http響應內容返回:
@RequestMapping("r2")
@ResponseBody
public String r2(){
return "aaa";
}
複製代碼
2.返回void類型
1.默認將(前綴+請求名+後綴)做爲默認視圖:
@RequestMapping("r3")//因爲我定義了視圖解析器的先後綴,這裏跳轉到r3.jsp
public void r3(){
}
複製代碼
2.也能夠不跳轉頁面直接在當前頁面返回字符串:
@RequestMapping("r4")//也能夠不跳轉頁面直接在當前頁面返回字符串。
public void r4(HttpServletResponse response) throws IOException {
response.getWriter().write("succ");
}
複製代碼
3.Model,Map:默認將(前綴+請求名+後綴)做爲視圖:
@RequestMapping("r5")
public Model r5(Model m){
m.addAttribute("msg","kkk");
return m;
}
@RequestMapping("r6")
public Map r5(Map<String,Object> m){
m.put("msg","kkk");
return m;
}
複製代碼
4.ModelAndView:
@RequestMapping("r7")
public ModelAndView r7(){
ModelAndView mv = new ModelAndView();
mv.setViewName("main");//設置轉發的頁面
mv.addObject("msg","ModelAndView");//設置響應信息
return mv;
}
複製代碼
5.自定義類型或者自定義類型的集合:以json格式返回
1.導入依賴包:
jackson-annotations-2.7.9.jar
jackson-core-2.7.9.jar
jackson-databind-2.7.9.jar
2.添加註解:@ResponseBody
@RequestMapping("r8")
@ResponseBody
public User r8(){
User user = new User("哈哈哈", 1, new Date());
return user;
}
複製代碼
注:做用:@ResponseBody註解用於將Controller的方法返回的對象,經過springmvc提供的HttpMessageConverter接口轉換爲指定格式的數據如:json,xml等,經過Response響應給客戶端。
這裏導入了新版本依賴包,會自動的轉換。
6.SpringMVC引入靜態資源文件(js,css)等
兩種方式:
1.在SpringMVC配置文件中添加以下內容:
<mvc:resources mapping="/js/**" location="/js/"/>
<!--mapping:不攔截的文件
location:不攔截的文件夾-->
複製代碼
2.由默認原始servlet來處理靜態資源文件:
<mvc:default-servlet-handler/>
7.SpringMVC中經常使用註解:
1.@RequestParam
1.爲處理器的參數指定默認值:
public String an2(@RequestParam(defaultValue = "0") int uid)
複製代碼
2.解決處理器的參數名和請求路徑的變量名不一致:
public String an1(@RequestParam(value = "id") int uid) //此時請求參數名爲:"id"
3.能夠將瀏覽器請求路徑上多個同名的變量賦值到一個集合中:請求名?uid=1&uid=3..
@RequestMapping("an3")
public String an3(@RequestParam("uid") List<Integer> list){
System.out.println("uid"+list);
return "index";
}
複製代碼
2.@PathVariable:獲取請求路徑中的變量值(路徑變量)
頁面請求:請求名/值,例如:
<a href="an4/3"></a>
後臺接收:
@RequestMapping("an4/{uid}")
public String an4(@PathVariable("uid") int uid){
System.out.println(uid);
return "index";
}
複製代碼
3.@SessionAttributes:將request域對象中的變量同時放到session中。
@SessionAttributes({"uid"})
public class ResController {
@RequestMapping("an5")
public String an5(Model m,int uid){
m.addAttribute("uid",uid);//request中的域對象:"uid"
return "index";
}
}
複製代碼
4.@ModelAttritube:能夠做用在方法上或者參數上
4.1.做用在參數上:將變量綁定到Model裏,等價於m.addAttribute("id",id)
注意:
語法:非自定義類型:@ModelAttritube("變量名 a") 變量名 a
自定義類型:@ModelAttritube("任意定義") 變量名 a,括號也能夠省略不寫,
默認將變量名爲自定義類型首字母小寫
@RequestMapping("an6")
public String an6(@ModelAttribute("user") User user){
return "index";
}
複製代碼
4.2 做用在方法上:全部處理器在執行前都會執行該方法
注意:該方法能夠有返回值,同時在當前請求中能夠得到該返回值。
默認返回值對應的變量名爲該類型首字母小寫做爲變量名,
也能夠本身手動指定變量名,例如:
@ModelAttribute("msg")//變量名爲:msg
測試:
public String an7(@ModelAttribute("uid") int uid){
System.out.println("處理器在執行其餘方法以前執行該方法");
return "index111";
}
複製代碼
8.文件上傳
單文件上傳:
步驟:
1.添加文件上傳依賴包:
commons-fileupload-1.2.2.jar
commons-io-2.4.jar
2.Jsp頁面文件上傳表單:
<form action="upfile" method="post" enctype="multipart/form-data">
<input type="file" name="attac" >
<input type="submit" value="上傳">
</form>
複製代碼
3.在SpringMVC的配置文件中實例化文件解析器:
<!-- 實例化文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--設置文件上傳的最大大小-->
<property name="maxUploadSize" value="60000000"/>
</bean>
複製代碼
4.定義接收文件的處理器方法:
@RequestMapping("upfile")//注意MultipartFile attac與請求參數名一致。
public String upfile(Model m, MultipartFile attac, HttpSession session) {
//1.指定上傳的文件的位置,2.將接受到的文件保存在指定的位置
String path = "E:/files/";//
System.out.println(path);
File temp = new File(path, attac.getOriginalFilename());
try {
attac.transferTo(temp);
m.addAttribute("msg", "上傳成功");
} catch (IOException e) {
e.printStackTrace();
m.addAttribute("msg", "上傳失敗");
}
return "index";
}
複製代碼
多文件上傳:
1.jsp頁面表單屬性爲file中,添加屬性multiple="multiple"
<form action="upfile" method="post" enctype="multipart/form-data">
<input type="file" name="attac" multiple="multiple">
<input type="submit" value="上傳">
</form>
複製代碼
2.定義後臺處理器方法,能夠經過集合或者數組獲取多個文件,代碼以下
@RequestMapping("upfile")
public String upfile(Model m, MultipartFile[] attac, HttpSession session) {
//1.指定上傳的文件的位置,2.將接受到的文件保存在指定的位置
String path="E:/files/";//
System.out.println(path);
for (MultipartFile perf : attac) {
File temp=new File(path,perf.getOriginalFilename());
try {
perf.transferTo(temp);
m.addAttribute("msg", "上傳成功");
} catch (IOException e) {
e.printStackTrace();
m.addAttribute("msg", "上傳失敗");
}
}
return "index";
}
複製代碼
有錯誤還請指出,一塊兒學習,努力!