2011-03-13 93 views
1

我不確定我是否正確地標記了此問題。但是我想要做的是映射一個Javabean來形成我擁有的輸入。除了Bean包含一個我想映射到的複雜類型屬性(以及我想映射到它的一個屬性是特定的)。讓我用代碼解釋。我有一個遊戲類:JavaBeans與複雜類型一起使用

public class Game 
{ 
private GameStatistics gameStats; 
public GameStatistics getGameStats() { 

    if(gameStats == null){ 
    gameStats = new GameStatistics(); 
    } 
    return gameStats; 
} 

public void setGameStats(GameStatistics value) { 
    gameStats = value; 
} 
} 

,我有一個GameStatistics類:

private int amountOfNumbersToMemorise; 
public int getAmountOfNumbersToMemorise() { 
    return amountOfNumbersToMemorise; 
} 

public void setAmountOfNumbersToMemorise(String value) { 
    amountOfNumbersToMemorise = Integer.parseInt(value); 
} 

然後在我的JSP我有類似:

<jsp:useBean id='game' scope='session' class='Classes.Game' /> 

<form method="Post" action="numberDisplay.jsp"> 
     Enter your username: <input name="username" type="text" /> <br /> 
     How many numbers to remember: <input name="gameStats.amountOfNumbersToMemorise" type="text"/> <br /> 
     <input type="Submit" value="Show me the numbers!" /> 
    </form> 

上面的頁面轉到另一頁:

<jsp:useBean id='game' scope='session' class='Classes.Game' /> 
<jsp:setProperty name="game" property="*"/> 
//more code here 
    <ul> 
     <% for(int x=0; x < game.getNumbersToMemorise().size(); x++) 
      {%> 
      <li><%=game.getNumbersToMemorise().get(x) %> </li> 
     <% } %></ul> 
// more code 

有一些特性我還沒有包括在內,因爲它們並不重要,但我似乎無法進入第二輸入框屬性的複合型數字地圖。

我不能使用MVC,因爲這是一個任務,我們必須這樣做,這樣:(

這是否有道理?我敢對Java(我是一個C#的人),所以任何幫助將不勝感激,謝謝:)

+0

你在做什麼映射? – objects 2011-03-13 22:06:03

+0

你正在做這個突擊隊(即原始的servlet API),還是使用更高級別的框架(例如spring,struts等)? – skaffman 2011-03-13 22:06:48

+0

你是什麼意思的映射?你是否試圖讓變量在你的表單中「打印」,或者一旦表單被提交,你試圖檢索變量並將它們綁定到對象圖表上? – CarlosZ 2011-03-13 22:07:03

回答

2

如果你僅限於jsp:useBean/jsp:setProperty,那麼你需要自己事先並創建兩個豆將子bean設置爲父bean的屬性。以下代碼片段中的最後一行基本上是game.setGameStatistics(gameStatistics)

<jsp:useBean id="game" class="com.example.Game" scope="session" /> 
<jsp:setProperty name="game" property="*" /> 
<jsp:useBean id="gameStatistics" class="com.example.GameStatistics" scope="request" /> 
<jsp:setProperty name="gameStatistics" property="*" /> 
<jsp:setProperty name="game" property="gameStatistics" value="${gameStatistics}" /> 

還要確保輸入的字段名稱完全相符的bean的屬性名稱。因此,不要使用

<input name="gameStats.amountOfNumbersToMemorise"> 

只是

<input name="amountOfNumbersToMemorise"> 

,並確保雙方豆不共享相同的屬性名。


我然而熱烈推薦給看看一個基於Java的MVC框架,例如JSF或者Spring MVC該做這一切透明,而不需要與傳統jsp:useBeanjsp:setProperty標籤擺弄。

+0

我想使用MVC(我已經在C#中多次使用過這個模式),但它是用於分配的,我們必須這樣做:(MVC分配下一步:D – Sara 2011-03-13 22:12:00

+0

是的,我從ASP中識別出這種方法。 .NET MVC在Java中,Spring MVC確實是一件很簡單的事情,JSF在UI組件方面領先一步,但我想指出的是,使用* scriptlets *(那些在JSP中的東西'<% %>')從十年前就不鼓勵了。更多的,看看[這個問題](http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files)。例如,而不是'for'循環,你想用JSTL''標籤代替 – BalusC 2011-03-13 22:19:18

+0

非常好,我來看看,我確實在想Java中是否有foreach概念:)非常感謝你幫助我! – Sara 2011-03-13 22:44:28

0

使用這樣的事情:

<input name="dontworryaboutinputname" type="text" value="${gameStats.amountOfNumbersToMemorise}"/>

+0

OP希望**設置**輸入值,而不是**重新顯示**提交的值。 – BalusC 2011-03-13 22:14:23