Для конкатенации двух строковых использований '+' новая строка должна быть выделена с пространством для обеих строк, и затем данными, скопированными с обеих строк. StringBuffer оптимизирован для конкатенации и выделяет больше места, чем необходимый первоначально. При конкатенации новой строки, в большинстве случаев, символы могут просто быть скопированы до конца существующего строкового буфера.
Для конкатенации двух строк, '+' оператор будет, вероятно, иметь меньше служебным, но поскольку Вы связываете больше строк, StringBuffer выйдет вперед, с помощью меньшего количества выделений памяти и меньшего количества копирования данных.
Шов поставляется с токеном s: компонент, и это то, что вы ищете: http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/controls.html#d0e28933
В a4j / RichFaces используйте очередь a4j: или назначьте очередь кнопке. Таким образом, несколько кликов будут поставлены в очередь, и только один будет фактически выполнен. Способ установить его глобально для вашего приложения, если вы используете RichFaces (мы сделали это вместо создания очереди повсюду), - это поместить в ваш web.xml следующее:
<context-param>
<param-name>org.richfaces.queue.global.enabled</param-name>
<param-value>true</param-value>
</context-param>
Чтобы избежать двойных отправок, вызванных нетерпеливым нажатием кнопки отправки, можно использовать фрагмент Javascript, который отключает кнопку отправки через несколько мс после onclick.
Пример:
<h:commandButton
id="foo"
value="submit"
action="#{bean.submit}"
onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);"
/>
Чтобы избежать двойного отправляет, нажав кнопку "Назад" и игнорируя предупреждение браузера о том, что вы рискуете повторно отправить данные, вам необходимо реализовать шаблон Post-Redirect-Get (PRG) .
В JSF это можно сделать в основном 2 способами. Либо используя
в
:
<navigation-case>
<from-action>#{bean.submit}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/page.jsf</to-view-id>
<redirect/>
</navigation-case>
, либо вызывая ExternalContext # redirect ()
в методе действия bean-компонента:
public void submit() {
doYourThing();
FacesContext.getCurrentInstance().getExternalContext().redirect("page.jsf");
}
Единственный недостаток состоит в том, что при перенаправлении неявно создается запрос новый , тем самым уничтожая исходный запрос, включая все его атрибуты (и, таким образом, также все управляемые компоненты с ограниченным объемом запроса и FacesMessages
). В некоторых случаях это не имеет значения, но в других случаях обязательно. Я не использую Seam, но, если я прав, они решили эту проблему с помощью так называемой области разговора и автоматического сохранения FacesMessages
через перенаправление. Вы могли бы воспользоваться этим.