参数封装分类静态参数封装和动态参数封装,下面分别来讲
静态参数分装:
静态分装,主要是使用配置文件和注入的方式来进行封装
<action name="action1" class="com.itheima.web.action.Demo1Action" method="addUser">
<!-- 当我们不写任何拦截器时,默认的拦截器栈defaultStack它来为我们工作。
但是,只要写了任何一个拦截器,默认的就全都不起作用了 -->
<!-- 使用注入的方式,给动作类的中的参数赋值 -->
<param name="username">张三</param>
<param name="age">18</param>
</action>
在Demo1Action中定义两个变量username,age用来进行注入,关键是需要继承ActionSupport
import com.opensymphony.xwork2.ActionSupport;
public class Demo1Action extends ActionSupport {
private String username;
private int age;
public String addUser(){
System.out.println(username+","+age);
return null;//不返回任何结果视图 NONE常量
}
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;
}
}
动态注入:
动态注入有三种方式:
一:动态参数封装,这个的实现是struts2中的params拦截器完成的
<action name="action2" class="com.itheima.web.action.Demo2Action" method="addUser"></action>
action与静态的一样,同时注意继承actionSupport
import com.opensymphony.xwork2.ActionSupport;
/**
* 动态参数封装,第一种情况:
* 数据模型与动作类写在一起
*/
public class Demo2Action extends ActionSupport {
private String username;
private int age;
public String addUser(){
System.out.println(username+","+age);
return null;//不返回任何结果视图 NONE常量
}
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;
}
}
二、动态参数封装的第二种形式:数据模型与动作类分开写,使用注入的方式。首先我们看怎么做。
首先需要定义个javabean如下:
package com.zeroyoung.domain;
/**
* Created by yanglin on 2016/11/2.
*/
public class User {
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;
}
}
在动作类当中定一个 user对象,
import com.itheima.domain.User;
import com.opensymphony.xwork2.ActionSupport;
/**
* 动态参数封装,第二种情况:
* 数据模型与动作类分开写
*/
public class Demo3Action extends ActionSupport {
//定义数据模型对象
private User user ;
public String addUser(){
System.out.println(user.getUsername()+","+user.getAge());
return null;//不返回任何结果视图 NONE常量
}
public User getUser() {
System.out.println("getUser");
return user;
}
public void setUser(User user) {
System.out.println("setUser");
this.user = user;
}
}
配置文件:
<action name="action2" class="com.zeroyoung.web.action.Demo2Action" method="addUser"></action>
参数传入到方法当中的时候由于方法当中并没有定义username,和age。所有无法进行注入,需要在传入参数的key上面写明如下:
<body>
<form action="${pageContext.request.contextPath}/action2.action" method="post">
<%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>
用户名:<input type="text" name="user.username" /><br/>
年龄:<input type="text" name="user.age"/><br/>
<input type="submit" value="提交" />
</form>
</body>
执行过程:首先当浏览器请求到大了Demo3Action 会调用getuser方法得到user对象,然后查看user对象是否为空,若为空,则会创建一个user对象,然后调用setUser,然后再次调用getuser方法得到对象然后设置参数
三、动态参数封装的第三种形式,使用驱动模型:
表单的写法与第一种一样,同时数据和模型分开
<action name="action3" class="com.zeroyoung.web.action.Demo3Action" method="addUser"></action>
动作方法,需要继承actionsupport,实现ModelDriven接口如下:
package com.zeroyoung.web.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.zeroyoung.domain.User;
/**
* 动态参数封装,第三种情况:模型驱动
* 要想使用模型驱动,必须数据模型与动作类分开写
* 实现模型驱动的步骤:
* 1.实现一个ModelDriven的接口
* 2.实现接口中的抽象方法getModel()
* 3.在使用模型驱动的时候,数据模型必须由我们自己来实例化
*
* 是由一个ModelDriven的拦截器为我们做的
*
* 实际开发中采用的方式
*
*/
public class Demo3Action extends ActionSupport implements ModelDriven<User> {
//需要自己创建一个对象,ModelDriven不会帮助创建
private User user = new User();
public User getModel() {
return user;
}
public String addUser(){
System.out.println(user.getUsername()+","+user.getAge());
return null;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}