请求参数的注入
在Struts2框架中,表单的提交的数据会自动注入到与Action对象相对应的属性。它与Spring框架中的IoC的注入原理相同,通过Action对象为属性提供setter方法注入
要求:
jsp中表单的name属性与Action中对应的属性的setter方法对应。要注入属性值的Action对象,必须为该属性提供setXXX()方法,因为Struts2的内部实现是按照JavaBean规范中提供的setter方法,自动为属性注入值
所以一般在Action中注入的属性的属性名与表单对应控件的name值相等,且该属性提供getXXX()、setXXX()方法
域模型DomainModel
我们使用有相同点的属性都喜欢把它封装,这样比较结构化,简单明了。第一种方式注入请求参数在参数过多的情况下可能造成action中的代码过多
将一些属性信息封装成一个实体对象的属性。操作领域对象的方法,在Action对象中引用某一实体对象,并且http请求的参数值可以注入到实体对象的属性上,这种方式i就是struts2提供的DomainModel的方式
注意:使用域模型的时候,jsp中的表单空间的name属性应该与Action中的对象和bean中的属性对应,格式为 对象.属性 ,例如:user.name
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
public Class User{ private String name; private String password; private int age; public void setName(String name){this.name=name;} public String getName(){return name;} public void setPassword(String password){this.password=password;} public String getPassword(){return password;} public void setAge(int age){this.age=age;} public int getAge(){return age;} } public Class UserAction extends ActionSupport{ private User user; public void setUser(User user){this.user=user;} public User getUser(){return User;} public String execute() throws Exception{ return "success"; } } <body> <s:form action="userAction" method="post"> <s:textfield name="user.name" label="用户名"/> <s:password name="user.password" label="密码" /> <s:textfield name="user.age" label="年龄"/> <s:submit value="注册"/> </s:form> </body>
驱动模型ModelDriven
在域模型DomainModel中,虽然struts2的Action对象可以通过直接定义实例对象的引用来调用实体对象进行相关的操作,但要求的参数必须是指定参数对应的实体对象,例如上李忠需要指定参数名称为user.name这种形式,有点不方便
驱动模型不需要指定参数所属的对象引用。Struts2的API中,提供了一个名为ModelDriven的接口,Action对象可以通过实现此接口获取指定的实体对象,获取的方式是实现ModelDriven提供的getModel()方法进行获取,其语法格式为: T getModel();
注意:驱动模型必须实例化对象类型的那个成员变量,否则空指针错误
处理流程
Struts2实例化Action对象,判断Action对象是否实现ModelDriven接口,如果实例化了该接口,就会调用getModel()获得实体对象模型并将其返回。后面就可以直接使用该对象的属性了。
public Class User{ private String name; private String password; private int age; public void setName(String name){this.name=name;} public String getName(){return name;} public void setPassword(String password){this.password=password;} public String getPassword(){return password;} public void setAge(int age){this.age=age;} public int getAge(){return age;} } public Class UserAction extends ActionSupport implements ModelDriven{ private User user; @Override public User getModel(){ return this.user; } public String execute() throws Exception{ return "success"; } } <body> <s:form action="userAction" method="post"> <s:textfield name="name" label="用户名"/> <s:password name="password" label="密码" /> <s:textfield name="age" label="年龄"/> <s:submit value="注册"/> </s:form> </body>