數據回顯就是當用戶數據提交失敗時,自動填充好已經輸入的數據,一般來說,如果是使用Ajax來做數據提交,基本上是沒有數據回顯這個需求的,但是如果通過表單做數據提交,那么數據回顯就非常必要了。
簡單數據類型數據回顯
簡單數據類型,實際上框架在這里沒有提供任何形式的支持,就是我們自己手動配置。加入提交的 Student 數據不符合要求,那么重新回到添加 Student 頁面,并且預設之前已經填好的數據。
首先我們先來改造一下 student.jsp 頁面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< form action = "/addstudent" method = "post" > < table > < tr > < td >學生編號:</ td > < td >< input type = "text" name = "id" value = "${id}" ></ td > </ tr > < tr > < td >學生姓名:</ td > < td >< input type = "text" name = "name" value = "${name}" ></ td > </ tr > < tr > < td >學生郵箱:</ td > < td >< input type = "text" name = "email" value = "${email}" ></ td > </ tr > < tr > < td >學生年齡:</ td > < td >< input type = "text" name = "age" value = "${age}" ></ td > </ tr > < tr > < td colspan = "2" > < input type = "submit" value = "提交" > </ td > </ tr > </ table > </ form > |
在接收數據時,使用簡單數據類型去接收:
1
2
3
4
5
6
7
8
|
@RequestMapping ( "/addstudent" ) public String addStudent2(Integer id, String name, String email, Integer age, Model model) { model.addAttribute( "id" , id); model.addAttribute( "name" , name); model.addAttribute( "email" , email); model.addAttribute( "age" , age); return "student" ; } |
這種方式,相當于框架沒有做任何工作,就是我們手動做數據回顯的。此時訪問頁面,服務端會再次定位到該頁面,而且數據已經預填好。
實體類數據回顯
簡單數據類型的回顯,實際上非常麻煩,因為需要開發者在服務端一個一個手動設置。如果使用對象的話,就沒有這么麻煩了,因為 SpringMVC 在頁面跳轉時,會自動將對象填充進返回的數據中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< form action = "/addstudent" method = "post" > < table > < tr > < td >學生編號:</ td > < td >< input type = "text" name = "id" value = "${student.id}" ></ td > </ tr > < tr > < td >學生姓名:</ td > < td >< input type = "text" name = "name" value = "${student.name}" ></ td > </ tr > < tr > < td >學生郵箱:</ td > < td >< input type = "text" name = "email" value = "${student.email}" ></ td > </ tr > < tr > < td >學生年齡:</ td > < td >< input type = "text" name = "age" value = "${student.age}" ></ td > </ tr > < tr > < td colspan = "2" > < input type = "submit" value = "提交" > </ td > </ tr > </ table > </ form > |
注意,在預填數據中,多了一個 student. 前綴。這 student 就是服務端接收數據的變量名,服務端的變量名和這里的 student 要保持一直。服務端定義如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
@RequestMapping ( "/addstudent" ) public String addStudent( @Validated (ValidationGroup2. class ) Student student, BindingResult result) { if (result != null ) { //校驗未通過,獲取所有的異常信息并展示出來 List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError allError : allErrors) { System.out.println(allError.getObjectName()+ ":" +allError.getDefaultMessage()); } return "student" ; } return "hello" ; } |
注意,服務端什么都不用做,就說要返回的頁面就行了,student 這個變量會被自動填充到返回的 Model
中。變量名就是填充時候的 key。如果想自定義這個 key,可以在參數中寫出來 Model,然后手動加入 Student 對象,就像簡單數據類型回顯那樣。
另一種定義回顯變量別名的方式,就是使用 @ModelAttribute 注解。
ModelAttribute
@ModelAttribute 這個注解,主要有兩方面的功能:
- 在數據回顯時,給變量定義別名
- 定義全局數據
定義別名
在數據回顯時,給變量定義別名,非常容易,直接加這個注解即可
1
2
3
4
5
6
7
8
9
10
11
12
|
@RequestMapping ( "/addstudent" ) public String addStudent( @ModelAttribute ( "s" ) @Validated (ValidationGroup2. class ) Student student, BindingResult result) { if (result != null ) { //校驗未通過,獲取所有的異常信息并展示出來 List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError allError : allErrors) { System.out.println(allError.getObjectName()+ ":" +allError.getDefaultMessage()); } return "student" ; } return "hello" ; } |
這樣定義完成后,在前端再次訪問回顯的變量時,變量名稱就不是 student 了,而是 s:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< form action = "/addstudent" method = "post" > < table > < tr > < td >學生編號:</ td > < td >< input type = "text" name = "id" value = "${s.id}" ></ td > </ tr > < tr > < td >學生姓名:</ td > < td >< input type = "text" name = "name" value = "${s.name}" ></ td > </ tr > < tr > < td >學生郵箱:</ td > < td >< input type = "text" name = "email" value = "${s.email}" ></ td > </ tr > < tr > < td >學生年齡:</ td > < td >< input type = "text" name = "age" value = "${s.age}" ></ td > </ tr > < tr > < td colspan = "2" > < input type = "submit" value = "提交" > </ td > </ tr > </ table > </ form > |
定義全局數據
假設有一個 Controller 中有很多方法,每個方法都會返回數據給前端,但是每個方法返回給前端的數據又不太一樣,雖然不太一樣,但是沒有方法的返回值又有一些公共的部分。可以將這些公共的部分提取出來單獨封裝成一個方法,用 @ModelAttribute 注解來標記。
例如在一個 Controller 中 ,添加如下代碼:
1
2
3
4
5
6
7
|
@ModelAttribute ( "info" ) public Map<String,Object> info() { Map<String, Object> map = new HashMap<>(); map.put( "username" , "javaboy" ); map.put( "address" , "www.javaboy.org" ); return map; } |
當用戶訪問當前 Controller 中的任意一個方法,在返回數據時,都會將添加了 @ModelAttribute 注解的方法的返回值,一起返回給前端。@ModelAttribute 注解中的 info 表示返回數據的 key。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/qiuwenli/p/13424005.html