2010-04-13 40 views
0

這裏是一個小的測試應用程序,做以下的事情Struts2的與S:動作標籤

  1. 要求用戶輸入他的名字,並提交 - (的index.jsp)
  2. 作爲的index.jsp的結果是,要求用戶選擇他/她的血型

的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的welcome.jsp頁面

<?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中的屬性:選擇文件中的標籤welcome.jsp

代碼有什麼問題請詳細告訴我。如果你可以寄給我正確的版本。爲什麼<s:action>標籤不起作用?

這是我收到

2010年4月13日下午1時49分十九秒 org.apache.catalina.core.ApplicationDispatcher 援引嚴重的錯誤:Servlet.service()用於 servlet和jsp拋出異常標記 'select',field'list':請求的 列表鍵'bglist'不能爲 解析爲 collection/array/map/enumeration/iterator 類型。例如:人或人。{name} - [unknown location]

回答

0

看來你是誤解了基本的struts2流程。

頁面welcome.jsp是動作「MyName」(壞名稱,BTW)的結果頁面(視圖)。這意味着,當生成welcome.jsp頁面時,動作「MyName」(類module1.User)剛剛被「執行」,並且它是該對象(類module1.User的一個實例)當顯示結果時顯示「範圍」(價值堆棧)。 因此,welcome.jsp正在尋找module1.User類中的「bglist」列表。

您需要重新考慮動作映射。

(你的困惑可以與你的發言「爲的index.jsp的結果是welcome.jsp頁面」 ......你一定以爲JSP頁面的行動結果,而不是其他的JSP)

0

bglist在Action中被聲明和定義SelectBloodGroup從未進入上下文。 您的應用程序的流程是Index.jsp(提交) - > module1.User(Action) - > welcome。jsp,所以bglist永遠不會被實例化,也不會被你的類SelectBloodGroup被調用。

如果你想在Action中使用初始化你的bglist,那麼將它放在module1.User中,或者如果這些值將被硬編碼(看來是)或者爲了最佳實踐,你也可以在jsp中給出列表的值你可以使用靜態值的資源包(比硬編碼更好)。

在JSP選擇列表給硬編碼的值,可以使用下面的代碼:

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

請儘量使用駝峯模式,同時聲明變量。 希望這有助於。