Не понимаю параметры передачи в шов - PullRequest
13 голосов
/ 21 октября 2009

Когда я отлаживаю свое приложение для шва, до меня доходит, что я не совсем понимаю, как работает передача параметров. Следующая терминология действительно запутала меня. Поэтому я задаю этот очень общий вопрос в надежде получить хорошее объяснение того, для чего и для чего нужны определенные вещи.

Прежде всего, чтобы перейти с одной страницы на другую, вы можете использовать h: commandButton или s: button. Я понимаю, что кнопка s: button не отправляет форму, но это не помогает мне понять разницу. Если вы не отправляете форму, переходя с одной страницы на другую, то что вы делаете?

Мое приложение включает ввод информации в форму, нажатие кнопки, а затем переход на новую страницу, на которой отображаются результаты после выполнения запроса. Кажется, я видел, что это действие происходило с s: button, так как, если это не «отправка формы»? Я чувствую, что упускаю что-то фундаментальное здесь.

Что касается самих параметров ... из того, что я видел, вы можете передавать параметры одним из трех способов:

  1. е: пары. Похоже, это чаще происходит в комбинации с s: button, чем h: commandbutton. Почему это так?
  2. Кроме того, вы можете "передавать" (или что-то) параметры, используя ваш файл page.xml. Кажется, что этот параметр должен присутствовать как в исходном page.xml, так и в целевом page.xml, чтобы он отображался в URL.
  3. Наконец, есть возможность добавить аннотацию @RequestParameter к вашему компоненту поддержки. Я так понимаю, это также используется, когда вы устанавливаете f: param в вашем представлении. Означает ли это, что в файле page.xml игнорируется? Я заметил, что в примере регистрации распределения шва пользовательский бин заполняется без каких-либо параметров, передаваемых через page.xml для f: param. Как это возможно?

Я уверен, что этот вопрос показывает большое невежество.

Надеюсь, один из вас, красноречивый человек, "поймет" то, что я прошу, и объяснит мне этот процесс.

Заранее спасибо.

TDR

Ответы [ 2 ]

27 голосов
/ 22 октября 2009

Если вы не отправляете форму переходя от одной страницы к другой, затем что ты делаешь?

Переход на другую страницу без отправки полей формы.

Мое приложение включает в себя ввод информации в форме, нажав кнопку, а затем перейти на новую страницу, которая отображает результаты после выполнения запроса. Это Кажется, я видел, как это занятие место с s: кнопка

s: кнопка не отправит форму, поэтому значения на вашей странице не будут применены к модели. Вы должны использовать команду Button / Link для этого. Активность, которую вы, возможно, видели, передает уже заполненное значение на другую страницу.

е: * 1013 пар * Чаще всего используется с кнопкой s: button / link, так как они часто используются для навигации. Вы можете использовать f: param для передачи уже заполненного значения на другую страницу. h: commandButton / Link используется для отправки форм, поэтому значения находятся в полях формы. Конечно, ничто не мешает вам использовать f: param для этого. page.xml

параметры, используемые здесь, предназначены для применения параметров запроса к модели и наоборот.

@ RequestParameter

Может использоваться вместе со всем вышеперечисленным, но немного бесполезно при использовании с параметрами 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").

Page2 может иметь такую ​​кнопку 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);
  }
}

Надеюсь, это поможет!

2 голосов
/ 25 ноября 2012

На этот вопрос уже есть отличный ответ. Я просто пытаюсь добавить дополнительную информацию.

Если вы не отправляете форму, переходя с одной страницы на другую, то что вы делаете?

  1. Уже объяснено в ответе @ Damo
  2. Выполните проверку на стороне клиента или запустите javascript перед переходом на следующую страницу, используя атрибут onclick кнопки.
  3. Вызов метода в бине с использованием атрибута action.

Мое приложение включает ввод информации в форму, нажатие кнопки и переход на новую страницу, на которой отображаются результаты после выполнения запроса. Кажется, я видел, что это действие происходит с s: button

  1. Как уже упоминалось в ответе @ Damo <s:button> / <s:link> не отправляет форму, поэтому вы можете выполнить запрос на второй странице, но обязательно без ранее введенных данных.
  2. Но если вы использовали теги <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 установлено значение "william".

Теперь предположим, что вы определили свою переменную следующим образом.

@RequestParameter("userName")
String name;

И назовите страницу вот так.

http://...../app_name/home.seam?name=william&userName=tony

Затем вызывается метод setName, а для свойства name устанавливается значение "william". Но тогда это значение переопределяется значением "tony".

...