Struts2回忆:struts2接收表单域参数的三种方法

Struts2 支持3种方式接收表单域传递过来的数据

1.通过action对应的属性接收用户输入

(params拦截器负责帮我们把参数注入到栈顶对象对应的属性中 并压入值栈  所以 ,

    通俗点讲params拦截器的作用是: 接收表单参数  ,  表单回显

   此时 对应的action 必须提供 该属性的setter方法  

 

)

 代码如下所示:

 表单:

   <s:form action="Login"  method="post" namespace="/">
     <s:textfield name="username" label="用户名"></s:textfield>
     <br></br>
     <s:textfield name="password" label="密码"></s:textfield>
     <s:submit value="提交"></s:submit>
   </s:form>

 对应的action:

	
	private String username;
	private String password;
	
	//setter表单属性注入      getter表单属性回显
	
/*	public String getUsername() {
		return username;
	}*/

	public void setUsername(String username) {
		this.username = username;
	}

	/*public String getPassword() {
		return password;
	}*/

 使用ognl访问值栈中对应的属性:

  <!-- 使用ognl 访问值栈中的对应的属性 -->
  <h4>欢迎<s:property value="username"/>来到xxxx系统</h4>

 使用这种方式  如果表单中有 10...20 个需要提交的属性值  

 容易造成 action 中需要对应的属性值数量过于庞大

2.通过领域对象接收用户输入

表单代码如下:

 <s:form action="Login"  method="post" namespace="/">
     <s:textfield name="user.username" label="用户名"></s:textfield>
     <br></br>
     <s:textfield name="user.password" label="密码"></s:textfield>
     <s:submit value="提交"></s:submit>
   </s:form>

 对应的action代码如下:

	private User user;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}

 使用ognl进行访问:

  <!-- 使用ognl 访问值栈中的对应的属性 -->
  <h4>欢迎<s:property value="user.username"/>来到xxxx系统</h4>

 使用这种方式  也容易造成表单中 属性名过于冗长

3.使用modeldriven拦截器

表单如下:

  <s:form action="Login"  method="post" namespace="/">
     <s:textfield name="username" label="用户名"></s:textfield>
     <br></br>
     <s:textfield name="password" label="密码"></s:textfield>
     <s:submit value="提交"></s:submit>
   </s:form>

 对应action如下:

public class LoginAction extends ActionSupport implements ModelDriven<User>{

	private static final long serialVersionUID = 647270100576858812L;
	private User user = new  User();
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}

 使用ognl访问如下:

<!-- 使用ognl 访问值栈中的对应的属性 -->
  <h4>欢迎<s:property value="username"/>来到xxxx系统</h4>

 使用这个方式:

   即避免action中对应的属性过于繁多 ,又避免了表单域中属性名过于沉长。

   但是请注意:不是所有的情况下都是用modeldriven ,如果需要的参数特别少 就不需要

   如:搜索,只需要传一个值就行

modeldriven 实现步骤:

                          

                            1.在请求到达栈顶之前,经过了modeldriven拦截器 

                             modeldriven拦截器 会帮我们将model对象压入值栈 (注意此时的model对象任然是一个model 出来的空对象)

                                      也就是说此时表单域中的属性还没有注入到对应action对象的属性中,那谁帮我们完成的呢?

                                      是params 拦截器

                                      所以由defaultStack中的拦截器 向下执行可知:

                                      2 .params 拦截器 将表单域中的属性值注入栈顶对象(即目标action)对应的属性中

                                      3.一个action请求 拦截器共用一个值栈

  注意 :model 必须要new  必须是一个实例化的对象               

猜你喜欢

转载自982699697.iteye.com/blog/2308304