现在的位置: 首页 > 综合 > 正文

Struts2 的三种接受参数的方式

2018年01月31日 ⁄ 综合 ⁄ 共 2073字 ⁄ 字号 评论关闭

struts2接收前台传来的参数有3种方法

1、第一种:action 设置 相应的变量

  

  在相应的action中设置与将要传进来的参数名相同的变量 

    eg: 前台传给后台两个参数 name=chance & age = 1,那么后台的action中 要设定这样的变量:private String name; private int age;同时,必须设置set,和 get方法

  那么在访问action过程中,struts会自动的为action中的这两个变量设置前台传来的值

  (深度解析:

    实际上,当前台想后台的一个action发出请求的时候,struts会相应的new出来一个action对象,并调用action中的setXXX方法,注意其实action中设置的变量名 可以不和前台传来参数名向同,但setXXX,这个XXX必须与前台的参数名相同

    就这样 struts通过这个set方法将前台传来的值赋给了 action中的变量

  )

2、第二中:DomainModule

  domainmodule 中文解释:域模型,domainmodul接收参数的方式就是,在action中设一个module对象(即实体对象,还不明白就看下面的举例)

  例如,一个bbs系统,实现用户注册模块,那么后台module中 我们就会相应的建立一个 User类,这个user类就是我们前面说过的module,

  分析下为什么要用DomainModule来接收参数,我们从前台向后台的action中传递参数,action做的处理无非是紧接着再把这个参数传递给对应的module,那么假如我们的module有100个变量(呵呵,我说的是假如),那么我们用第一种方法接收参数时就要在action中设置100个变量,但如果我们用domainmodule的话就简单的多,说了这么多,还没讲到怎么用呵呵,切入正题:

  eg:有一个用户登录系统,前台需要向后台传递一个user的name 和 password 两个属性,

    那么我们可以这么处理,首先在相应的action 设一个private User user; 变量(假如我们已经有了User这个Module了),好那么前台传递参数的时候可以这么来写,

    action?user.name=chance&user.password=123

  注意:我们依然需要继续给user设置 set get方法

  另外需要注意的是,在action中设置的变量 无论是基本类型,还是引用类型,我们只需要声明,但不需要定义(简单的说,就是我们不需要去 new 一个变量)

  new的过程 由struts来帮我们完成

  下面我们在来考虑一个问题,还拿上面的用户登录系统来举例,通常用户登录的时候 除了用户名,密码,还会填写一个 确认密码(其实这个工作完全可以交给客户端的js来处理,这里只是为了说明问题),但是在 User Module抽象封装的过程它是不会有 confimPassword这一项的,这样我们就不能用domainModule来解决这个问题,怎么办?

  解决方法就是引入 DTO(又交 do,或vo)data transform object,它的工作就两点:接收一下,传递一下;

  接收一下:前台传过来的user对象,我们不直接传递给usermodule 而是传递给 dto对象,例如userDto(它里面会有一个confimPassword变量)

  传递一下:dto接收来参数后 进过一番数据处理,确认密码输入正确那么就会 把 必要的参数变量传递给 usermodule 

  搞定!

第三种方式比较特殊,它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动

(ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口,使用它

的getModel()方法来通知Struts2要注入的属性类型,并且声明属性时一定要实例化,但不需get,

set方法(这是与第二种方式的区别)。

package com.lsc.alan.action;

import com.lsc.alan.vo.User;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 使用模型驱动来接受用户输入,需要实现ModelDriven接口
 * @author Alan
 * 时间:2009年7月10日
 */
public class LoginAction3 implements ModelDriven<User>{
	/** 领域模型User对象 **/
	private User user = new User();
	
	public User getModel() {
		return user;
	}
	public String execute(){
		if (user.getUsername().equals("Alan") && user.getPassword().equals("Alan")){
			return "success";
		} else {
			return "failure";
		}
	}
}

 

抱歉!评论已关闭.