Не понимаю передачу параметров в seam
-
05-07-2019 - |
Вопрос
Когда я отлаживаю свое приложение seam, до меня доходит, что я на самом деле не понимаю, как работает передача параметров.Следующая терминология действительно сбивает меня с толку.Поэтому я задаю этот очень общий вопрос в надежде получить хорошее объяснение того, что с чем работает и для чего предназначены определенные вещи.
Прежде всего, чтобы перейти с одной страницы на следующую, вы можете использовать h: CommandButton или s:button.Я понимаю, что s: button не отправляет форму, но это не помогает мне понять разницу.Если вы не отправляете форму, переходя с одной страницы на другую, тогда что вы делаете?
Мое приложение включает в себя ввод информации в форму, нажатие кнопки, а затем переход на новую страницу, которая отображает результаты после выполнения запроса.Кажется, я видел, как это действие выполнялось с помощью кнопки s:, так как же это, если это не "отправка формы"?Я чувствую, что мне здесь не хватает чего-то фундаментального.
Что касается самих параметров...из того, что я видел, вы можете передавать параметры, используя один из 3 методов:
- ф: параметр.Похоже, это чаще встречается в комбинации с s: button, чем h: commandbutton.Почему это?
- Кроме того, вы можете "передать" (или что-то еще) параметры, используя свой файл page.xml.Параметр, похоже, должен отображаться как в источнике page.xml, так и в цели page.xml чтобы он отображался в URL.
- Наконец, есть возможность добавить аннотацию @RequestParameter к вашему вспомогательному компоненту.Я полагаю, это также используется, когда вы устанавливаете f: param в своем представлении.Означает ли это, что тот, что в page.xml, упускается из виду?Я замечаю, что в примере регистрации распределения seam пользовательский компонент заполняется без передачи каких-либо параметров через page.xml для f: param .Как это возможно?
Я уверен, что этот вопрос свидетельствует о большом невежестве.
Надеюсь, кто-нибудь из вас, красноречивых людей, "поймет", о чем я спрашиваю, и объяснит мне этот процесс.
Заранее благодарю.
TDR
Решение
Если вы не отправляете форму, переходя с одной страницы на другую, тогда что вы делаете?
Переход на другую страницу без отправки каких-либо полей формы.
Мое приложение включает в себя ввод информации в форму, нажатие кнопки, а затем переход на новую страницу, которая отображает результаты после выполнения запроса.Это кажется, я видел, как это действие выполняется место с помощью кнопки s:
субъекты: кнопка не отправит форму, поэтому значения на вашей странице не будут применены к модели.Для этого вы должны использовать CommandButton / Ссылку.Действие, которое вы, возможно, видели, заключается в передаче уже заполненного значения на другую страницу.
f: параметр
Чаще используется с s:button/link поскольку они часто используются для навигации.Вы можете использовать f:param для передачи уже заполненного значения на другую страницу.h:commandButton/Link используется для отправки форм, поэтому значения находятся в полях формы.Конечно, ничто не мешает вам использовать f:param для этого, чтобы.
page.xml
параметры, используемые здесь, предназначены для применения параметров запроса к модели и наоборот.
@Параметр запроса
Может использоваться в сочетании со всем вышеперечисленным, но немного бессмысленно при использовании с page.xml параметрами, поскольку они могут использоваться для выполнения одной и той же работы
Пример
Если вы начнете с этой страницы:
http://mydomain.com/myapp/home.seam?name=damo
И home.page.xml имеет:
<param name="name" value="#{person.name}"/>
Затем, когда страница будет загружена person.setName("damo")
будет вызван, так как в URL есть соответствующий параметр запроса.
Вы можете сохранить значение параметра в ссылке на следующую страницу:
<s:link value="Go to Page 2" view="/page2.xhtml">
<f:param name="name" value="#{person.name}"/>
</s:link>
Когда вы нажимаете на ссылку и переходите к http://mydomain.com/myapp/page2.seam И page2.page.xml имеет:
<param name="name" value="#{someOtherBean.name}"/>
Тогда someOtherBean.setName("damo")
будет вызван.
На странице 2 может быть кнопка s:, подобная этой:
<s:button value="Say Hello" action="#{someOtherBean.sayHello}">
<f:param name="subject" value="#{someOtherBean.name}"/>
</s:button>
И этот метод мог бы быть:
@Name("someOtherBean")
public class SomeOtherBean {
@RequestParameter("subject") //same value as the 'name' in f:param
private String subject;
public void sayHello() {
System.out.println("Hello "+subject);
}
}
Надеюсь, это поможет!
Другие советы
На этот вопрос уже есть отличный ответ.Я просто пытаюсь добавить немного дополнительной информации.
Если вы не отправляете форму, переходя с одной страницы на другую, тогда что вы делаете?
- Уже исключено в ответе @Damo
- Выполните проверку на стороне клиента или запустите javascript перед переходом на следующую страницу с помощью
onclick
атрибут кнопки. - Вызовите метод в bean, используя
action
атрибут.
Мое приложение включает в себя ввод информации в форму, нажатие кнопки, а затем переход на новую страницу, которая отображает результаты после выполнения запроса.Кажется, я видел, как это действие выполнялось с помощью кнопки s:
- Как упоминалось в ответе @Damo
<s:button>
/<s:link>
не отправляет форму, поэтому вы можете выполнить свой запрос на второй странице, но, конечно, без ранее введенных данных. - Но если вы использовали
<a4j:support>
/<a4j:ajax>
используя теги с полями ввода на вашей первой странице, вы можете получить доступ к этим данным на вашей второй странице, если вы находитесь в длительном диалоге или если ваш компонент находится в области сеанса.Если вы видите данные формы на своей второй странице, это может быть причиной.
Существует возможность добавления аннотации @RequestParameter к вашему вспомогательному компоненту.Я полагаю, это также используется, когда вы устанавливаете f: param в своем представлении.Означает ли это, что тот, что в page.xml, упускается из виду?
Да, значение, установленное с помощью page.xml
будет переопределен.Посмотрите на следующий пример.
Предположим, что ваш page.xml
имеет следующую строку.
<param name="name" value="#{myBean.name}"/>
и ваш боб имеет getter
и setter
методы для name
свойство, и вы определяете переменную name
как показано ниже.
@RequestParameter
String name;
Теперь, если вы вызовете страницу следующим образом.
http://...../app_name/home.seam?name=william
в setName
будет называться и название property
установлено значение "уильям".
Теперь предположим , что вы определяете свою переменную следующим образом .
@RequestParameter("userName")
String name;
И назовите страницу вот так.
http://...../app_name/home.seam?name=william&userName=tony
Затем все еще setName
вызывается метод, и name
для свойства установлено значение "william".Но затем это значение переопределяется значением "tony".