SpringMVC學習[02]:【值傳遞、編碼過濾器、類型轉換器的配置、SpringMVC的轉發與重定向、SpringMVC中經常使用註解、文件上傳】

內容:
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";
}
複製代碼


有錯誤還請指出,一塊兒學習,努力!
相關文章
相關標籤/搜索