一 静态参数封装
静态参数封装,对于每次其提交的参数都是一样的情况,可以使用静态参数来实现
静态参数封装只在其所需的其action中配置
例:
<action name="hello" class="com.yu.web.action.HelloAction" method="saveUser">
<param name="name">struts</param>
<param name="age">2</param>
</action>
其所配置的参数名称必须和其pojo类的属性相对应,应为参数传递是通过注入的方式提交的
public class HelloAction extends ActionSupport {
private String name;
private 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;
}
public String execute(){
return SUCCESS;
}
public String saveUser(){
System.out.println("name:"+name+"age:"+age);
return null;
}
}
静态参数分装是通过staticParams的拦截器来实现的
如果我们不配置其staticParams拦截器,那么就不能得到其参数
<action name="hello" class="com.yu.web.action.HelloAction" method="saveUser">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<!-- <interceptor-ref name="staticParams"/> -->
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="debugging"/>
<param name="name">struts</param>
<param name="age">2</param>
<!-- <result name="success" type="chain">
<param name="namespace">/struts2</param>
<param name="actionName">error</param>
</result> -->
</action>
从上面的结果可以看出,当我们注销掉staticParams拦截器后,其参数无法分装
注意:当我们没有配置拦截器时,其默认调用defaultStack的拦截器,如果我们写了一个拦截器,那么默认的拦截器就不起作用了
二 动态参数封装
2.1动作类是实体
注意:表单中的字段名必须和其实体的属性一致
这种方式由params拦截器来实现
2.2动作类与实体模型分开
写好实体类后,再其动作类中设置一个实体类的属性‘
public class HelloAction extends ActionSupport {
private User user;
public User getUser() {
System.out.println("getUser()");
return user;
}
public void setUser(User user) {
System.out.println("setUser()");
this.user = user;
}
public String execute(){
return SUCCESS;
}
public String saveUser(){
System.out.println("name:"+user.getName()+"age:"+user.getAge());
return null;
}
}
编写表单
<form action="${pageContext.request.contextPath}//struts/hello.action">
<input type="text" name="user.name"></input>
<input type="text" name="user.age"></input>
<input type="submit"></input>
</form>
注意其表单中name名称的编写
打印结果
从上面的结果看出,其getUser打印了两次,都有什么含义了
getUser() :判断对象是否为空,即是否存在实体类的对象
setUser() :如果为空,通过反射则创建一个实体类
getUser() :调用实体类对象
name:大大age:12 :结果显示
如果我们创建一个实体类对象,那么就不会执行setUser()
2.3模型驱动来实现
模型驱动实现的方式是通过实现ModelDriver<T>接口来实现的
public class HelloAction extends ActionSupport implements ModelDriven<User>{
private User user=new User();
public String execute(){
return SUCCESS;
}
//此方法在动作方法前执行
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
public String saveUser(){
System.out.println("name:"+user.getName()+"age:"+user.getAge());
return null;
}
}
注意:模型驱动类必须实例化实体类
表单中字段名只需和实体类的属性一致就可以
<form action="${pageContext.request.contextPath}//struts/hello.action">
<input type="text" name="name"></input>
<input type="text" name="age"></input>
<input type="submit"></input>
</form>
其实现由一个modelDriver的拦截器实现