2011-03-13 134 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