struts:利用 Struts 实现动态控制表格大小(2)

  旦表格提供个简单Struts动作来处理结果:

package demo;
/**
* Copyright 2004, James M. Turner.
* All Rights Reserved
*
* A Struts action that sends the comments to the console
*/
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;
public ProcessFormAction extends Action {
  public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
                 HttpServletResponse response)
      throws ServletException, IOException {
    DynaValidatorForm df = (DynaValidatorForm) form;
    Person p = (Person) df.get("people");
    for ( i = 0; i < p.length; i) {
      .out.prln(p[i].getFirstName + " " + p[i].
getLastName + ":" + p[i].getComment);
    }
     mapping.findForward("success");
  }
}


  在实际应用中这就是数据写回到数据库地方在这种情况下他只将数据倒在控制台上所以我们可以看到他是正确收到假设我们为每个演员都填充了恰当我们在控制台上会看到下列内容:

Harrison Ford:Indiana Jones
Carrie Fisher:Postcards from the Edge
Mark Hamill:Wing Commander


  正如我在文章开头提到还有另个思路方法可以解决这个问题而且它不需要使用会话期范围内表格这个思路方法就是使用HashMaps 来存储行我们来看看使用HashMaps编写段代码:

  首先我们添加个新表格到struts-config.xml:

  现在我们不使用beans排列改为使用HashMap 来存储每个人数据另外我们需要个新HashMap 来存储注释原因我稍后再解释我们也需要个新动作来填充数据:

package demo;
/**
* Copyright 2004, James M. Turner.
* All Rights Reserved
*
* A Struts action that s up a DynaForm which is globally scoped
*/
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;
public SetupHashFormAction extends Action {
  public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
                 HttpServletResponse response)
      throws ServletException, IOException {
    DynaValidatorForm df = (DynaValidatorForm) form;
    HashMap hm = (HashMap) df.get("people");
    Person p = Person;
    p = Person;
    p.DateOfBirth("07/13/1942");
    p.LastName("Ford");
    p.FirstName("Harrison");
    p.Gender("M");
    hm.put("1", p);
    p = Person;
    p.DateOfBirth("10/21/1956");
    p.LastName("Fisher");
    p.FirstName("Carrie");
    p.Gender("F");
    hm.put("2", p);
    p = Person;
    p.DateOfBirth("09/25/1951");
    p.LastName("Hamill");
    p.FirstName("Mark");
    p.Gender("M");
    hm.put("3", p);
     mapping.findForward("success");
  }


  }

  基本上这段代码和前面代码相同除了我们将Person 对象存储到HashMap 中而不是排列中的外我们也不需要创建HashMap它可以作为表格部分来动态实现

  在JSP本身中相应窍门技巧部分为:

  Start Wars Actor Fact Page   

  记住:在化时填充HashMap 值只要表格显示就会消失表格是请求范围而不是会话期范围特别是对于我们来说这就意味着所有Person 对象都会消失所以如果我们粘贴文本域到Person bean 注释属性上在提交表格时我们将得到个空指针异常Person 对象不再位于HashMap 内(实际上我们得到个全新HashMap.)所以我们需要将注释存储在个单独并行HashMap 内它将注释当作简单串来存储

  在上述代码中还须注意几件事情首先现在正迭代HashMap条来自c:forEach 标记值实际上是用于堆栈条占位符同时具有两个属性key 属性值用来访问堆栈(在我们例子中如"1", "2", "3"等等)value 属性值存储在关键字的下所以在这种情况下我们必须使用value 属性来得到Person bean 实属性

  而且我们需要构造个用于文本框有效Struts属性域在html-el 标记库中使用JSTL 扩展就可以实现在这种情况下我们通过个由演员最后个名字、逗号和第个名字组成串来存储注释

  最后我们需要个新动作来处理结果:

package demo;
/**
* Copyright 2004, James M. Turner.
* All Rights Reserved
*
* A Struts action that sends the comments to the console
*/
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;
public ProcessHashFormAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
              HttpServletResponse response),
throws ServletException, IOException {
DynaValidatorForm df = (DynaValidatorForm) form;
HashMap hm = (HashMap) df.get("comments");
Iterator it = hm.keySet.iterator;
while (it.hasNext) {
String key = (String) it.next;
String comment = (String) hm.get(key);
    .out.prln(key + ":" + comment);
}
mapping.findForward("success");
}
}




  同样这里最大差别是数据都是作为HashMaps 来存储代码获取关键字(lastname,firstname)然后显示关键字和在控制台



Tags:  struts标签 struts2.0 struts2 struts

延伸阅读

最新评论

发表评论