8

这只是为什么会发生奇怪的事情的问题。

我犯了一个错误,应该使用“cssClass”,但输入了“class”。但是“类”没有被定义为 textarea 标记的属性,所以我希望行为与 cssClass 值相同(未定义的属性应该按原样呈现,它确实呈现属性但具有奇怪的值和该值似乎不可更改。我提供的任何值都将被忽略,并默认为支持标签的类)。

例如,如果我定义一个“火鸡”值,我希望火鸡值以 html 呈现,正如我们在以下示例中看到的那样。

这是我在 JSP 上使用的:

<s:textarea turkey="" class="" name="qualLine.description" value="%{description}"/>

这是渲染的内容:

<textarea name="qualLine.description" cols="" rows="" id="cows" class="class java.util.HashMap" turkey="">test</textarea>

我的问题不是我应该怎么做,因为我应该使用 cssClass 而不是类,我的问题是:这是预期的吗?为什么?

4

3 回答 3

2

也许它与正在使用的 Freemarker TemplateModel 有关?

在解析动态属性dynamic-attributes.ftl的. 但是,当它不计算任何东西(null 或 void)时,它就会恢复为属性名称 - 类。textarea.ftlStrutsUtil.translateVariablesTestParseUtil.translateVariables

这个值,“class”,然后被评估为一个 Freemarker 表达式 - ${class}- 在 dynamic-attributes.ftl 中。

StrutsUtil 放置在 Freemarker 模板模型中,FreemarkerManager从中调用ContextUtil来检索 Struts2 对象的映射以放置到模板模型中。放置在 TemplateModel 中的这个映射是一个 HashMap(也许是罪魁祸首映射?)。

所以,这显然不是一个完整的答案,所以我不希望“答案”被接受,但它太多了,不能放在评论中,它可能有助于阐明一些观点。如果我在本周晚些时候有时间,我可能会下载 Struts2 源并使用它来找到真正的答案。但更有可能的是,我不会花时间!

不过,这肯定是个有趣的问题。

于 2012-09-17T02:33:06.493 回答
0

发生这种情况是因为每个 Java 对象都有一个方法getClass(),它在您的情况下返回对象的运行时类java.util.HashMap。这样,虽然class没有为 textarea 标签定义,但它是为TextareaTag类定义的,该类是实现 textarea 行为的类。这将发生在您的 jsps 中的每个标记上,因为它们最终都是用 Java 类实现的。

这就是为什么(我猜)Struts 团队使用适当的而不是cssClass仅仅使用class.

于 2012-08-31T11:25:37.913 回答
0

采用

cssClass="输入-sm"

代替

类=“输入-sm”

当你使用 struts 输入时

<s:textfield cssClass=input-sm id="a" key="" name="" placeholder="Required"/>
于 2013-12-03T20:23:32.650 回答