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>

 

 

 

 

 

 

 

posted @ 2019-10-19 11:58  不咬人的兔子  阅读(1849)  评论(0编辑  收藏  举报