strtuts中 ActionForm的属性attribute深入解析

来源:互联网 发布:免费的程序化软件 编辑:程序博客网 时间:2024/06/05 15:14


第一种:从过程查看:

新建一个listener实现上面两个listener接口,如:

package blog;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import org.apache.struts.action.ActionForm;

public class AttributeListener implements ServletRequestAttributeListener,
        HttpSessionAttributeListener {

    public AddStudentAction() {
        System.out.println("in AddStudentAction constructor 测试Action的实例个数");
    }


    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        String name = srae.getName();
        if (srae.getValue() instanceof ActionForm) {
            System.out.println("in request  " + name + "  attribute add");
        }

    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        String name = srae.getName();
        if (srae.getValue() instanceof ActionForm) {
            System.out.println("in request  " + name + "  attribute remove");
        }

    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        String name = srae.getName();
        if (srae.getValue() instanceof ActionForm) {
            System.out.println("in request  " + name + "  attribute replace");
        }

    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        String name = event.getName();
        if (event.getValue() instanceof ActionForm) {
            System.out.println("in session  " + name + "  attribute add");
        }

    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        String name = event.getName();
        if (event.getValue() instanceof ActionForm) {
            System.out.println("in session  " + name + "  attribute remove");
        }

    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        String name = event.getName();
        if (event.getValue() instanceof ActionForm) {
            System.out.println("in session  " + name + "  attribute replace");
        }
    }

}


然后在web.xml中加入如下配置:

<listener>
       <listener-class>cn.itcast.AttributeListener</listener-class>
</listener>


这样就可以监听属性的添加、替换及删除了。


第二种:从结果查看,比较action的execute方法中传入的actionform与根据页面得到的actionform:

package blog;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class AddStudentAction extends Action {
   
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        AddStudentForm studentForm = (AddStudentForm) form;
        
        AddStudentForm studentFormScope = null;
        
        if(mapping.getScope().equals("request")){

            studentFormScope =(AddStudentForm) request.getAttribute("addStudentForm");

        }else if(mapping.getScope().equals("session")){

            studentFormScope =

                 (AddStudentForm) request.getSession().getAttribute("addStudentForm");
        }
        
        if (studentForm == studentFormScope) {

            System.out.println("studentForm == studentFormScope");
        }
    
}


ActionForm中各方法的调用次序:

首先是构造方法的调用,用来实例化;

然后是reset方法的调用,目的是为了将ActionForm的属性设置为缺省值(default value);

其次是各个属性的set方法(setter),给属性进行赋值;

最后是校验方法validate方法,用来校验数据的合法性,如密码的长度等。


构造方法调用之后,控制器就会把ActionForm加入到session或request当中。



@Override
    public ActionErrors validate(ActionMapping mapping,
            HttpServletRequest request) {
        System.out.println("in AddStudentForm validate");
        ActionErrors errors = new ActionErrors();        
        ActionMessage message = new ActionMessage("error", "出错了");
        errors.add("error", message);
        return errors;//null 等同于super.validate(mapping, request)
    }

在struts-config.xml中对应于validate方法有关的validate属性和input属性的值如下:

<action path="/addStudent" name="addStudentForm" type="cn.itcast.AddStudentAction"
            attribute="addStudentForm" validate="true" input="/ErrorInput.jsp"
>




原创粉丝点击