2013-07-03 2 views
2

Я попытался найти сайт, но не смог найти ответ на мой вопрос.Struts2: поля автопопуляции на основе выпадающего значения без JavaScript

Я занимаюсь разработкой веб-приложения java Struts2. Есть 3 поля формы на странице JSP следующим образом: (используются Struts2 теги)

<s:form action="action1"> 

other fields 
...... 
<s:select name="test1" list="{'A','B','C'}"></s:select> 
<s:textfield name="test2"></s:textfield> 
<s:textfield name="test3"></s:textfield> 
..... 
other fields 
<s:submit value="submit1"><s/submit> 
</s:form> 

при выборе значения в test1 поле, test2 и test3 бы необходимо заселена из базы данных на основе по значению , выбранному в test1.

В соответствии с процессом, который мне нужно реализовать, мне нужно выполнить некоторые вычисления на основе ввода из jsp1 (см. Выше) и представить результат на jsp2, который должен иметь совершенно другой контент из jsp1. Моя проблема ограничена вводом данных в jsp1.

Что было бы лучшим способом сделать это без javascript? предположим, что javascript отключен в браузерах, получающих доступ к приложению .

спасибо,

+0

почему у вас есть 2 'textfield' с тем же имя? – Jaiwo99

+0

должен проверить test2 и test3 только показывая или может быть отредактирован? – Jaiwo99

+0

* Без * JavaScript? Вы хотите динамически модифицировать что-то в DOM без JavaScript? Удачи. –

ответ

1

EDIT

Кажется, что есть немного путаницы здесь, давайте попробуем сделать это ясно:

Есть три основных способа инициирования связи с сервером из браузера:

  1. отправить HTML
  2. представить JS
  3. AJAX представить

Вы могут или может не забота о предоставлении поддержки пользователей, просматривающих с JavaScript инвалидов;

  • Если вам НЕ ПОЖАЛУЙСТА, то вы можете действовать по своему усмотрению;
  • , если вы не все равно, то у вас есть два пути перед вами:
    • делают уникальную версию страницы, которая работает как с и без JS (с помощью ТОЛЬКО вариант «1», «Submit HTML ");
    • сделать страницы работающими двумя возможными способами, взаимоисключающими: при обработке страницы вы обнаружите, включен ли javascript: если да, вы отправляетесь с JS (submit или AJAX), если нет, вы отступаете к не- Решение JS («отправить HTML»).

Оба эти два решения работает и без JS, но последний, как правило, предпочтительнее, поскольку вы можете создать хороший, красивый, опыт ориентированных на пользователя WebApp для 99% пользователей, используя JavaScript и, в конечном итоге, AJAX, и создайте резервное решение для 1% пользователей, которое, даже если сайт не будет приятным, как в версии JS, и даже если у него не будет ВСЕ функции JS версии, он все равно будет использоваться, и основные функциональные возможности будут доступны.

Как я уже сказал в приведенном выше комментарии, нет необходимости, чтобы резервная версия WebApp была такой же приятной, такой же быстрой, как и у пользователей в качестве версии JS: она должна просто ... работать.

Например, этот JSP будет работать в обоих случаях: он будет выполнять JavaScript Submit после выбора элемента из параметра «Выбрать, если JS», и он будет делать передачу после нажатия кнопки «Отправить», если JS отключен.

С отключенным JS onchange будет проигнорирован и обработан <noscript>.
С включенным JS, обмен будет обработан, а <noscript> проигнорирован.

<s:form action="myAction"> 
    <s:select onchange="javascript:document.forms[0].submit();" 
       name="test1" value="test1" list="{'A','B','C'}" /> 
    <s:textfield name="test2" value="test2" /> 

    <noscript> 
     <span> 
      Since you have JS disabled, 
      you need to manually press to the GO button, 
      but you still can make it work ;) 
     </span> 
     <s:submit value="go" /> 
    </noscript> 

</s:form> 

в вашем действии

public class MyAction extends ActionSupport{ 

    private String test1=""; 
    private String test2; 
    /* Getters and Setters */  

    public String execute(){ 
     if (test1.length()>0) 
      assignValues(); 
     return SUCCESS; 
    } 

    private void assignValues(){ 
     if (test1.equals("A")){ 
      test2 = "A was chosen, do something"; 
     } else if (test1.equals("B")){ 
      test2 = "B was chosen, do something else"; 
     } else if (test1.equals("C")){ 
      test2 = "C was chosen, what's next?"; 
     } 
    } 
} 

Другие сомнения вы выражающие в комментариях предполагают, что вы можете сделать шаг назад на мгновение и прочитать некоторые Struts2 учебник, чтобы быть уверенным в получении максимума от рамки.

Если у вас есть другие поля в той же Форме, на которые вы не хотите влиять, просто объявите переменную в действии (с помощью Getter и Setter) для каждого из них: они будут сохранены в перезагрузите страницу, потому что они будут отправлены (потому что они в форме) вместе с submit, они будут введены через Setter, они будут прочитаны через Getter и введены на новой странице путем сопоставления их имени и переменная действия.

В противном случае вы можете использовать AJAX, но я бы начал с этого.

И нет, вы не можете вложить формы.

+0

Andrea, вы имеете в виду, что я кодирую другую форму в моей внешней форме и заполняю test2 и test3, нажимая на кнопку? – user2545863

+0

У меня есть другие поля в том же виде и не хочу, чтобы их беспокоили. – user2545863

+0

Что должен отображать мой результат в этом случае (MyAction) – user2545863

0

Благодаря Andrea Ligios у меня есть нижеследующее решение моей проблемы.

jsp1 была изменена, как показано ниже

<s:form action="action2"> 

other fields 
...... 
<s:select name="test1" list="{'Select','A','B','C'}" 
    onchange="javascript:document.forms[0].submit();"></s:select> 
<noscript><s:submit value="populate test2 and test3"></s:submit></noscript> 
<s:textfield name="test2"></s:textfield> 
<s:textfield name="test3"></s:textfield> 
..... 
other fields 
<s:submit value="submit1" action="action1"><s/submit> 
</s:form> 

struts.xml имеет следующие отображения

..... 
<action name="action2" class="MyAction" method="populate"> 
    <result name="success">/jsp1.jsp</result> 
</action> 
<action name="action1" class="MyAction"> 
    <result name="success">/jsp2.jsp</result> 
</action> 
..... 

MyAction имеет следующий код

public class MyAction extends ActionSupport{ 

    //all field declarations 

    //Getters and Setters 

    public String execute(){ 

    //do processing for jsp2 based on values from jsp1 

    return SUCCESS; 
    } 

    public String populate(){ 

    //populate test2 and test3 from database based on value of test1 

    return SUCCESS; 
    } 
}