一直在用Struts2实现MVC,因为相比于Struts1中大量使用request.getparameter在页面上获取值,struts2则提供了属性驱动和模型驱动处理了这一问题。通过这两个驱动,我们在action中定义getter方法,表单元素中的name值只需和action中的变量名一直即可。
在jsp中代码:一、属性驱动(property-driven) 对于属性驱动,我们在action中定义与表单元素对应的所有属性并提供getter和setter方法。示例如下:
在action代码:
public class StudentAction extends ActionSupport { private String sname; //姓名 private int age; //年龄 private float score; //分数 public String getSname() { return sname; } public void setSname(String pname) { this.sname = sname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } @Override public String execute() throws Exception { return SUCCESS; } }
<form action="/struts2/load.action" method="post"> <table align="center"> <tr> <td>姓名:</td> <td><input type="text" name="sname" id="sname"/></td> </tr> <tr> <td>年龄:</td> <td><input type="text" name="age" id="age"/></td> </tr> <tr> <td>分数</td> <td><input type="text" name="score" id="score"/></td> </tr> <tr> <td colspan="2"><input type="submit" value="submit"/></td> </tr> </table> </form>
二、模型驱动(morden-driven)对于模型驱动,首先需要一个封装所有属性的javabean,其次所属的action需要实现modeldriven接口,并需要getModel()方法,最后还需要在Struts.xml文件中配置该action的modeldriven拦截器,jsp页面不用改变
- 创建Javabean,以student为例
<span style="font-family: Arial, Helvetica, sans-serif;"> private String sname; //姓名</span>
private int age; //年龄 private float score; //分数 public String getSname() { return sname; } public void setSname(String pname) { this.sname = sname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } }
- 创建action,实现modeldriven接口
public class StudentAction extends ActionSupport implements ModelDriven<Student>{ private Student student=new Student(); public Student getStudent() { return student; } @Override public Student getModel() { return student; } @Override public String execute() throws Exception { return SUCCESS; } }
</pre><pre>
- 在struts.xml文件中配置拦截器
<action name="load"class="org.test.action.LoadAction"> <result name="success">/load.jsp</result> <interceptor-ref name="model-driven"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
总结:Struts2的这两种驱动模式为我们对视图层和模型层的数据交互提供了一大便利,若有兴趣的话,不妨研究下源码实现机制,大家可以一起交流下!