1. 模型驅動:
模型驅動是使用javaBean對象來封裝請求參數,在整個MVC流程中可以直接使用這個對象。在發送請求後Struts將各個請求參數(javab的屬性)封裝到一個JavaBean對象中,Action接收這個實例對象並用該對象進行相關處理返回處理結果。
模型驅動的Action中定義javaBean並實例化,並且需要提供該JavaBean的getter和setter方法。Action需要實現ModelDriven接口。
2. Struts2模型驅動實現方式:
那麼Struts2是如何將請求參數封裝到model中的呢?我們可以解讀一下struts-default.xml配置文件,在struts-default.xml中有如下配置:
<interceptors>
……
<!--定義屬性驅動的攔截器—>
<interceptor name=”params” class=”com.opensymphony.xwork2.interceptor.ParametersInterceptor” />
<!--定義模型驅動的攔截器—>
<interceptor name=”model-driven” class=”com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor” />
……
<!--定義模型驅動的攔截器棧—>
<interceptor-stack name=”modelDrivenStack”>
<interceptor-ref name=”model-driven”/>
<interceptor-ref name=”basicStack”/>
</interceptor-stack>
……
<interceptor-stack name=”defaultStack”>
<interceptor-ref name=”model-driven”/>
<interceptor-ref name=”params”/>
</interceptor-stack>
</interceptors>
<!--定義Struts2默認的攔截器棧—>
<default-interceptor-ref name=”defaultStack” />
其中params攔截器負責提取請求的參數,如果是使用的屬性驅動模式,它還負責將請求參數傳給Action實例的屬性;而model-driven攔截器則負責把請求參數傳給模型的屬性。
3. 下面給出一個使用模型驅動的示例程序:
JavaBean類:
public class TestBean {
private int id;
private String name;
public TestBean(){};
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Action:
import com.core.bean.TestBean;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class TestAction extends ActionSupport implements ModelDriven<TestBean> {
private TestBean testBean=new TestBean();
public TestBean getTestBean() {
return testBean;
}
public void setTestBean(TestBean testBean) {
this.testBean = testBean;
}
@Override
public String execute() throws Exception {
return this.INPUT;
}
public TestBean getModel() {
return testBean;
}
}
採用模型驅動模式後,所有的處理結果都封裝在Model中,如果想要在JSP頁面上輸出屬性結果,可以使用<s:property value=”testBean.name”/>或<s:property value=”name”/>輸出結果。