struts form 的DynaActionForm应用

为了减少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属性的值进行设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值