我在Java Tapestry中有一个打印3个文本块的页面,我们称之为BlockOfTextOne,BlockOfTextTwo,BlockOfTextThree。对于每个文本块,如果内容超过170个字符,我想截断内容并添加“阅读更多”链接。
我正在使用Java的方便BreakIterator
类来返回文本块的第一部分,在最接近170个字符的句子边界处剪切,然后从该边界返回文本块的第二部分
我有这个用于BlockOfTextOne。我想建议让我的文本截断函数可以为每个BlockOfTextN重用,这样我就不需要重复代码了。我还要感谢其他代码改进的建议,到目前为止我所做的更多是实验的结果,而不是专业知识。
这是我到目前为止所拥有的:
在TML文件中,我检查字符串是否超过允许的长度。如果是,请运行truncate function并打印readmore按钮。否则,只需打印字符串:
<t:if test="isQuestionTooLong()">
${getBeginningOfBlockOfTextOne()}
<button type="button" class="readmore">Read More</button>
<div>${getTheRestOfBlockOfTextOne()}</div>
<p:else>
${case.blockoftextwholestring}
</p:else>
</t:if>
在.java文件中,我得到了文本块的第一位:
public String getBeginningOfBlockOfTextOne() {
int summaryLength = blockoftextwholestring.length();
BreakIterator bi = BreakIterator.getSentenceInstance();
bi.setText(blockoftextwholestring);
int first_after = bi.following(MAX_LENGTH_TEXT_QUESTION);
String firstBit = blockoftextwholestring.substring(0, first_after);
return (firstBit);
}
然后我得到文本块的第二位,复制大部分代码,基本上只改变传递给substring的参数:
public String getTheRestOfBlockOfTextOne(){
BreakIterator bi = BreakIterator.getSentenceInstance();
bi.setText(blockoftextwholestring);
int first_after = bi.following(MAX_LENGTH_TEXT_QUESTION);
String secondBit = blockoftextwholestring.substring(first_after, summaryLength);
return (secondBit);
}
我知道我可以将它们分解为可重复使用的组件,但不知道最好的方法。我还希望能够为BlockOfTextTwo和BlockOfTextThree重用这两个。有什么建议吗?
答案 0 :(得分:0)
为每个要显示的字符串都有一个@Property,并在@SetupRender方法中初始化它们。如果需要,@ SetupRender方法可以调用私有帮助器方法。
或者,只需要为要在页面上显示的每个字符串设置getter,然后将其委托给私有帮助器方法。
BTW:${getFoo()}
最好写成${foo}
答案 1 :(得分:0)
这看起来像应该作为一个组件实现的东西。当你有冗余代码时,它应该是一个服务(在页面和组件之间共享)或一个组件(如果它是面向UI的)。
在Tapestry中,组件非常便宜和简单,您应该始终考虑创建新组件。就像你可以将一个大的复杂方法重构为几个小方法一样(即使新方法只在一个地方调用),你应该考虑将一个非常大的页面分成许多组件。