第一种属性驱动(一个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对象