06.封装struts2参数

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相同。

猜你喜欢

转载自blog.csdn.net/weixin_44199723/article/details/85676786
今日推荐