Struts2与s:动作标签

时间:2010-04-13 08:33:13

标签: struts2

这是一个执行以下操作的小型测试应用程序

  1. 要求用户输入他的名字并提交 - (index.jsp)
  2. 作为index.jsp的结果是welcome.jsp页面,要求用户选择他/她的血型
  3. index.jsp

        <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>   
    <%@ taglib prefix="s" uri="/struts-tags" %>   
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
    <html>   
      <head>   </head>   
       <body>   
        <form action="MyName">   
        <s:textfield name="UserName" label="Enter Your Name"/>   
        <s:submit/>   
        </form><br>   
      </body>   
    </html>    
    

    struts.xml

    <?xml version="1.0" encoding="UTF-8" ?>   
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">   
    <struts>   
    <package name="module1" namespace="" extends="struts-default">   
    <action name="MyName" class="module1.User">   
        <result>/Welcome.jsp</result>   
    </action>   
    <action name="Blood_Group" class="module1.SelectBloodGroup" method="bloodGroupList"/>   
    </package>   
    
    </struts>
    

    SelectBloodGroup.java

    package module1;   
    
    import java.util.ArrayList;   
    import com.opensymphony.xwork2.ActionSupport;   
    public class SelectBloodGroup extends ActionSupport{   
        private ArrayList<BloodGroup> bglist;   
    
        public String bloodGroupList(){   
            bglist = new ArrayList<BloodGroup>();   
            bglist.add(new BloodGroup("1","A+"));   
            bglist.add(new BloodGroup("2","B+"));   
            bglist.add(new BloodGroup("3","AB+"));   
            bglist.add(new BloodGroup("4","O+"));   
            bglist.add(new BloodGroup("5","A-"));   
            bglist.add(new BloodGroup("6","B-"));   
            bglist.add(new BloodGroup("7","AB-"));   
            bglist.add(new BloodGroup("8","O-"));   
            return "SUCCESS";   
        }   
    
        public ArrayList<BloodGroup> getBglist(){   
            return bglist;   
        }   
    
    }   
    class BloodGroup{   
        private String id;   
        private String bg;   
    
        BloodGroup(String id,String bg){   
            this.id=id;   
            this.bg=bg;   
        }   
    
    } 
    

    welcome.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>   
    <%@ taglib prefix="s" uri="/struts-tags" %>   
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
    <html>   
      <head>   
    
      </head>   
    
      <body>   
        <s:action name="Blood_Group" executeResult="false"/>    
    
        //***************here is the problem***************   
        <s:select list="bglist" listKey="id" listValue="bg"/>   
       //***********************************************   
    
      </body>   
    </html>   
    

    Struts无法将bglist标识为集合或数组或列表或迭代器。我应该分配什么来列出s中的属性:选择TAG IN THE FILE welcome.jsp

    代码有什么问题请详细告诉我。如果你能给我发正确的版本。为什么<s:action>标签不起作用?

    这是我得到的错误

      

    2010年4月13日下午1:49:19   org.apache.catalina.core.ApplicationDispatcher   调用SEVERE:Servlet.service()   servlet jsp抛出异常标记   'select',字段'list':请求的   列表键'bglist'不可能   解决了   收集/阵列/图/枚举/迭代   类型。例如:人或人。{name}    - [未知位置]

2 个答案:

答案 0 :(得分:0)

看来你误解了基本的struts2流程。

页面welcome.jsp是动作“MyName”(错误名称,BTW)的结果页面(视图)。这意味着,当生成welcome.jsp页面时,操作“MyName”(类module1.User)刚刚被“执行”,它就是那个对象(类module1.User的一个实例)。显示结果时显示“范围”(值堆栈)。 因此,welcome.jsp正在寻找module1.User类中的“bglist”列表。

您需要重新考虑动作映射。

(你的混淆可能与你的陈述有关“因为index.jsp是welcome.jsp页面的结果”......你必须认为jsp页面是ACTIONS的结果,而不是其他jsps的结果)

答案 1 :(得分:0)

bglist 是在Action SelectBloodGroup 中声明和定义的,它永远不会进入上下文。 您的应用程序的流程是 Index.jsp(submit) - &gt; module1.User(Action) - &gt; welcome.jsp ,所以 bglist 从未实例化,也没有调用您的类 SelectBloodGroup

如果你想在动作中使用初始化你的bglist然后把它放在module1.User中,或者你也可以在jsp中给出list的值,如果这些值是硬编码的(似乎是)或最佳练习你可以将资源包用于静态值(比硬编码更好)。

要在jsp选择列表中提供硬编码值,您可以使用以下代码:

<select name="bgList" id="bgListId">
    <option value="1">Bpositive</option>
    <option value="someValue">someLabel</option>
</select>

请在声明变量时尝试使用camelCase模式。 希望这会有所帮助。