https://www.cnblogs.com/clamp7724/p/11693572.html
在這個例子的基礎上修改
1.前台向后台傳參
1.1:超鏈接傳遞參數
在index.jsp頁面添加超鏈接
<a href="hello/helloparams?name='yzha'&password='123456'">Hello params</a>
<!--據說有的瀏覽器hello/helloparams不行,谷歌是可以的,別的不知道...-->
修改controller --- HelloWorldController
package hello_word; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.lang.annotation.Annotation; @Controller //注解表示這是一個controller //@RequestMapping(path = "/hello") 這里也可以加RequestMapping注解,如果加在類上則表示一級路徑,那樣跳轉路徑就變成了hello/helloworld,
@RequestMapping(path = "/hello") //RequestMapping中有 // path:路徑,在注釋在類上方表示1級路徑,在方法上方表示二級路徑 // value:(和path作用一樣), // method:method的參數是一個enum類對象(枚舉),使用時用類名RequestMethod + .屬性,可以規定接受請求的種類: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; // params: 用於指定限制請求參數的條件。它支持簡單的表達式。要求請求參數的key和value必須和配置的一模一樣。 // 例如: params = {"accountName"},表示請求參數必須有accountName params = {"moeny!100"},表示請求參數中money不能是100。 //也就是請求地址必須傳參: /helloworld?accountName = 'aaa' //headers:一個字符串數組,表示包含的請求頭,比如GET,HOST,connection,Accept這一類的,前台給后台發的請求 public class HelloWorldController { @RequestMapping(path = "/helloworld") //說明地址以/helloworld結尾的請求,由這個方法處理 public String helloWorldPath(){ System.out.println("hello world"); return "success"; //表示跳轉的頁面為 success.jsp } @RequestMapping(path = "/helloparams", params = {"name","password"}) //表示有兩個參數 public String helloParams(String name, String password){ System.out.println("name = " + name); System.out.println("password = " + password); return "success"; //表示跳轉的頁面為 success.jsp } }
其實主要就是添加了新的controller方法來處理index.jsp新加的的請求
@RequestMapping(path = "/helloparams", params = {"name","password"}) //表示有兩個參數 public String helloParams(String name, String password){//springmvc 中使用方法參數的方式接收參數,可以接受基本類型,string,甚至是對象(javaBean) System.out.println("name = " + name); System.out.println("password = " + password); return "success"; //表示跳轉的頁面為 success.jsp }
點下面的鏈接,后台輸出了前台傳遞過來的信息(為了清楚可以在啟動服務后先clean一下后台的output)
2. form表單傳遞對象參數 (工作中一般是用這個)
為了正式點先修改一下左邊的列表,在hello_world文件夾下建2個package,一個叫controller存放各種controller,一個叫domain,用來存放存放數據的class類
把之前的HelloWorldController放到Controller package中,在domain package里創建新的class,起名Account,用來接收前台傳遞過來的對象(兩個屬性name,password要和前台表單中name一致,添加對應的get,set方法)
這里我重寫了toString方法,用來顯示結果。 toString是java中object類自帶的方法,System.out.print(object對象)的時候,默認調用的就是這個方法。
創建get,set,toString 如果是idea,可以在代碼空白處 右鍵 - Generate,里面有方法根據屬性自動生成
Account類的代碼:
package hello_word.domain; public class Account { String name; String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Account{" + "name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
修改index.jsp,添加form表單
<form action="/hello/helloobject" method = post> <!--action是提交路徑,method是提交方式,form里面的元素的name屬性要和controller中接收的對象類里的屬性名一致,這樣spring低層的反射才可以找到對應的set方法--> <input type="text" name = 'name'> <input type="text" name = 'password'> <input type ="submit" value = "提交"> </form>
修改controller --- HelloWorldController
添加一個新的方法處理這個form請求。
@RequestMapping(path = "/helloobject") public String helloParams(Account account){//表示有一個Account對象作為參數,因為兩個類不在同一個package里需要import這個class System.out.println(account);//因為重寫了Account的toString方法,這里可以直接用print顯示內容 return "success"; //表示跳轉的頁面為 success.jsp }
1.3. 傳遞的引用類型中有引用類型屬性(Account中有其他class類的屬性,比如 user 信息)
創建user類,用來存用戶的信息,創建方式和account一樣,這里age是int屬性,spring底層(大部分情況下)可以將傳回的String字符串自動轉化成對應屬性類型。如果情況很特殊可能需要自己寫set方法處理。
package hello_word.domain; public class User { String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
修改account類,加入user屬性,重新生成get,set,toString方法
package hello_word.domain; public class Account { String name; String password; User user; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "Account{" + "name='" + name + '\'' + ", password='" + password + '\'' + ", user=" + user + '}'; } }
修改index中的表單: 類中類的情況,可以用 屬性.屬性的屬性 來傳遞參數。 Account中user屬性的name屬性,就用了user.name
<form action="/hello/helloobject" method = post> <!--action是提交路徑,method是提交方式,form里面的元素的name屬性要和controller中接收的對象類里的屬性名一致--> 賬號信息:<br/> 用戶名:<input type="text" name = 'name'><br/> 密碼:<input type="text" name = 'password'><br/> 用戶信息:<br/> 用戶姓名:<input type="text" name = 'user.name'><br/> 用戶年齡:<input type="text" name = 'user.age'><br/> <input type ="submit" value = "提交"> </form>