1.静态封装
Action动作类
public class PersonAction extends ActionSupport {
private String name = "zhangyan";
/*必须提供set和get属性*/
public String hello(){
System.out.println(name);
return super.SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
struts.xml
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="hello" extends="struts-default">
<action name="zhangyan" class="com.zy.action.PersonAction" method="hello">
<!-- param的name在action中必须要有响应的属性-->
<param name="name">张岩</param>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
2.动态封装
系统运行期间用户提交表单,ajax,url访问。
1.动作类充当模型对象
动作类和模型和为一体,我们可以在动作类中定义要接收的属性的值,对每个属性必须要提供set和get方法,动作类model中的属性的名字和表单中的name一定要一致,否则无法注入。
jsp页面:form.jsp
<form action="/strus2/aaa/zhang" method="post">
姓名:
<input type="text" name="name">
性别:
<input type="radio" name="gender" value="1" checked="checked">男
<input type="radio" name="gender" value="2" >女
年龄:
<input type="text" name="age">
地址:
<input type="text" name="address">
<input type="submit" value="提交">
</form>
这里我加了命名空间/aaa,注意必须有/ 。action也必须是/项目名
action页面
public class PersonAction extends ActionSupport {
private String name;
private int age;
private int gender;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*省略其他set get*/
public String hello(){
System.out.println(name);
System.out.println(age);
System.out.println(gender);
System.out.println(address);
return super.SUCCESS;
}
}
struts.xml
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="hello1" extends="struts-default" namespace="/aaa">
<action name="zhang" class="com.zy.action.PersonAction" method="hello">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
最后访问http://localhost:8080/strus2/form.jsp
2.动作类和模型对象分离封装参数(推荐使用)
动作类充当模型对象Action既是是C又是M,可读性差,重用性差,很难维护,不推荐使用第一种。
这种方式接受参数对提交的表单中的name有要求,name需要使用Action中的model属性的名字加点再加上要接收的属性名:如 person.name
<form action="/strus2/aaa/zhang" method="post">
姓名:
<input type="text" name="person.name">
性别:
<input type="radio" name="person.gender" value="1" checked="checked">男
<input type="radio" name="person.gender" value="2" >女
年龄:
<input type="text" name="person.age">
地址:
<input type="text" name="person.address">
<input type="submit" value="提交">
</form>
新建com.zy,model用来封装person
package com.zy.model;
public class Person {
private String name;
private int age;
private int gender;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*其他set get省略*/
/*提供toString*/
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", address=" + address + "]";
}
}
action动作了要定义person对象,提供set 和 get
public class PersonAction extends ActionSupport {
/*
* 定义model类对象用于接收参数
* 提供set get
* */
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String hello(){
System.out.println(person);
return super.SUCCESS;
}
}
3.模型驱动方式封装参数(推荐使用)
第二种方式对页面上的文本域的name有要求必须要用model的属性的名称.属性名,这样的话页面和Action动作类有侵入性,模型驱动方式解决了这个问题,我们需要实现一个ModelDriven接口指定要接收的model 的类型提供getModel的方法,Action类中的model对象必须要手动的创建,否则无法注入属性值。
action动作类
public class PersonAction extends ActionSupport implements ModelDriven<Person>{
/*
* 定义model类对象用于接收参数
* 提供set get ,必须手动创建person
* */
private Person person = new Person();
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String hello(){
System.out.println(person);
return super.SUCCESS;
}
@Override
public Person getModel() {
return person;
}
}
注意:重写方法返回person
form的name就不需要person.name,直接name就可以。
其他代码和2相同。