spring - springMVC - 傳遞參數


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>

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM