第一种:从过程查看:
新建一个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"
>