Struts2传值的那些事

第一种属性驱动(一个action和一个表单)

页面代码:input框中的name值只是填写单纯的属性名称
后台代码:注意点:要为类中的每个属性提供getXXX和setXXX方法。这样前台提交form表单时,我们就能在后台接收到相应的属性值。

在这里插入图片描述

这里先不设置set和get方法。虽然是错误的,但是仍然可以运行。下面是结果。原因是什么暂时不知道。有待补充。不过最好设置set和get方法。

package action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * @ Author     : Rain
 * @ Classname  : Test
 * @ Date       : 2019/4/3 18:40
 * @ Description: test'
 */

public class Test extends ActionSupport {

//    private String username;
//    private int age;
//
//    public String getUsername() {
//        return username;
//    }
//
//    public void setUsername(String username) {
//        this.username = username;
//    }
//
//    public int getAge() {
//        return age;
//    }
//
//    public void setAge(int age) {
//        this.age = age;
//    }

    @Override
    public String execute() {
        HttpServletRequest request = ServletActionContext.getRequest();
        String name = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println(name+"--"+age);
        return SUCCESS;
    }
}

这里是引用
在这里插入图片描述
后台显示的数据在这里插入图片描述

加上set和get方法后,username和age就不显示红色了。同时把request。。。什么之类的注释


public class Test extends ActionSupport {

    private String username;
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String execute() {
//        HttpServletRequest request = ServletActionContext.getRequest();
//        String name = request.getParameter("username");
//        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println(username+"--"+age);
        return SUCCESS;
    }
}

在这里插入图片描述

在这里插入图片描述
注意值栈内容和上下文
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二种对象驱动(bean+action+表单)

前端要改改。必须是user.name和user.age的形式。
还有回显的value值,也是user.username…
1.首先我们要新建实体类,目的是为了解耦,在action中将不是逻辑处理的代码抽离出来。
2.页面,input框中name属性的填写方式也变了,并不是单纯的属性名了,而是“对象.属性名”的方式
3.后台,新建一个属性为我们的实体对象,并提供getXXX和setXXX方法。这样提交表单时,我们就能在实体对象中取得前台传过来的属性值。

<s:form action="test" method="POST">
    <s:textfield name="user.username"></s:textfield>
    <s:textfield name="user.age"></s:textfield>
    <s:submit value="提交"></s:submit>
</s:form>
<s:debug/><br>回显的数据<br>
<s:property value="user.getUsername()"></s:property><br>
<s:property value="user.getAge()"></s:property>
<s:property value="user"></s:property>
<br>
<s:property value="#parameters"></s:property><br>


public class Test extends ActionSupport {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() {
        System.out.println(user.getUsername() + "--" + user.getAge());
        return SUCCESS;
    }
}

在这里插入图片描述
在这里插入图片描述

这里需要注意一下这个,Stack Context和Value Stack Contents
在这里插入图片描述
在这里插入图片描述

<s:property value="#parameters.user.age"></s:property>
<s:property value="#parameters.user.username"></s:property>不起作用了。

<s:property value="#parameters"></s:property>
可以得到
{user.age=111, user.username=admin}

在这里插入图片描述

第三种 模型驱动

1.我们同样需要新建实体对象
2.页面,input框中的name属性只是填写简单的属性值

3.后台,前两种方式Action只是继承自ActionSuppport,模型驱动就有些不同了,我们要实现ModelDriven接口,并且重写它的getModel方法,这样前台的属性值就会传到后台定义的实体属性User中去。

缺点:一次只能封装一个model对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40803626/article/details/89004992