为了减少Form类,DynaActionForm得到应用
配置如下:
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="name" type="java.lang.String" ></form-property>
<form-property name="age" type="java.lang.Integer"></form-property>
</form-bean>
<action path="/dynaAction" type="com.lwf.struts.action.DynaAction" name="dynaForm">
<forward name="success" path="/dynaResult.jsp"></forward>
</action>
自定义Action类
package com.lwf.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
public class DynaAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// DynaActionForm dynaForm = (DynaActionForm)form;
// String name = (String)dynaForm.get("name");
// Integer age = (Integer)dynaForm.get("age");
String name = (String)PropertyUtils.getSimpleProperty(form, "name");
Integer age = (Integer)PropertyUtils.getSimpleProperty(form, "age");
// request.setAttribute("name", name);
// request.setAttribute("age", age);
return mapping.findForward("success");
}
}
转发到结果文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
dyna result:
<br>
${name }
<br>
${age }
<br>
${dynaForm.map.name }
${dynaForm.map.age }
</body>
</html>
需要注意的地方:
根据struts源代码Form类的处理:
protected ActionForm processActionForm(HttpServletRequest request,
HttpServletResponse response, ActionMapping mapping) {
// Create (if necessary) a form bean to use
ActionForm instance =
RequestUtils.createActionForm(request, mapping, moduleConfig,
servlet);
if (instance == null) {
return (null);
}
// Store the new instance in the appropriate scope
if (log.isDebugEnabled()) {
log.debug(" Storing ActionForm bean instance in scope '"
+ mapping.getScope() + "' under attribute key '"
+ mapping.getAttribute() + "'");
}
if ("request".equals(mapping.getScope())) {
request.setAttribute(mapping.getAttribute(), instance);
} else {
HttpSession session = request.getSession();
session.setAttribute(mapping.getAttribute(), instance);
}
return (instance);
}
我们看到最后会把对应的form放到请求域中.
所以在上面的DynaAction类及dynaResult.jsp文件中,演示了几种方法设置和取form属性值.
DynaActionForm dynaForm = (DynaActionForm)form;
String name = (String)dynaForm.get("name");
Integer age = (Integer)dynaForm.get("age");
request.setAttribute("name", name);
request.setAttribute("age", age);
这时候我们在dynaResult.jsp中要取得name,age属性的值.就有两种方法.
一种就是因为我们设置了两个值进入请求域中,所以可以直接取
${name }
${age }
上面代码意思就相当于
request.getAttribute("name") ;
request.getAttribute("age") ;
另一种:因为我们说过ActionForm实例化并收集数据后,会自动将该form放到域中.
${dynaForm.map.name }
${dynaForm.map.age }
这里相当于:
dynaForm.getMap().getName();
dynaForm.getMap().getAge();
这里要理解DynaActionForm的实现,它实际上先取到表单上的值,然后把
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="name" type="java.lang.String" ></form-property>
<form-property name="age" type="java.lang.Integer"></form-property>
</form-bean>
这里面的name,age属性与对应的表单入进HashMap中,我们在DynaAction中使用
DynaActionForm dynaForm = (DynaActionForm)form;
String name = (String)dynaForm.get("name");
Integer age = (Integer)dynaForm.get("age");
实际上就是从map中拿出值.
在取值的时候可以用
String name = (String)PropertyUtils.getSimpleProperty(form, "name");
Integer age = (Integer)PropertyUtils.getSimpleProperty(form, "age");
来代替
DynaActionForm dynaForm = (DynaActionForm)form;
String name = (String)dynaForm.get("name");
Integer age = (Integer)dynaForm.get("age");
这两段代码是一样的意思,只不过一个是采用第三方类而以.
另外要注意的是当我们使用
String name = (String)PropertyUtils.getSimpleProperty(form, "name");
Integer age = (Integer)PropertyUtils.getSimpleProperty(form, "age");
时我们的dynaResult.jsp上面仍然使用:
${dynaForm.map.name }
${dynaForm.map.age }
来获取属性值 ..
这里面你可能会说DynaAction中都没有见到dynaForm,怎么能取出来呢..
这里dynaForm应理解为struts_config.xml中的formBean的name值.
也可以重新设置属性的值:
下面两段代码等价:
DynaActionForm dynaForm = (DynaActionForm)form;
dynaForm.set("name", "dddddddd");
与
PropertyUtils.setSimpleProperty(form, "name", "sssss");
都是对name属性的值进行设置