2011-01-25 9 views
0

Я видел некоторые варианты этого вопроса в stackoverflow, но у меня есть конкретный прецедент, в котором я буду использовать входные данные.Изменения на стороне сервера на стороне сервера на стороне сервера

Проще всего я могу это понять: 1. На веб-сайте у меня есть форма с двумя полями ввода. Когда A заполняется «XYZ» B, необходимо отключить, во всех остальных случаях он должен быть включен. 2. Эта «страница» также может быть сохранена клиентом в БД.

Итак, мне нужно иметь возможность отображать второе отключенное поле как на клиентской выкладке (простой, простой Javascript), так и при загрузке этой «формы» (простой, в JSP манипулировать атрибутом поля, когда страница загружается).

Но ... В итоге у меня была точная логика, закодированная на двух местах. Теперь рассмотрим, что это требуется для сотен полей и десятков логических условий, несколько сложнее, чем комбинация из 5 полей вместе, набор конкретных значений, чтобы сделать то или это и т. Д. И т. Д.

Нижняя линия, что подход, который вы рассмотрели бы для повторного использования (насколько это возможно) ориентированных на пользовательский интерфейс изменений валидации/изменения состояния поля между стороной сервера и клиентской стороной (cosider, что я не хочу использовать вызов AJAX с каждым пользователем, вводящим в поле.).

Благодаря

ответ

0

компонент на основе MVC рамки, как JSF (JavaServer Faces) позволяет определить, что в одном месте. Вот пример использования конкретного случая использования:

<h:form> 
    <h:panelGroup id="inputA"> 
     <h:inputText value="#{bean.inputA}"> 
      <f:ajax event="blur" render="inputB" /> 
     </h:inputText> 
    </h:panelGroup> 
    <h:panelGroup id="inputB"> 
     <h:inputText value="#{bean.inputB}" disabled="#{bean.inputA != 'XYZ'}" /> 
    </h:panelGroup> 
</h:form> 

Это в основном все. Только код javabean опущен, но здесь это не так важно. Правда, здесь используется ajax, но это частично дешево, и в принципе нет другого способа сохранить одно и то же состояние как на стороне сервера, так и на стороне клиента.

Приведенный выше пример XHTML (Facelets) генерирует соответствующий код HTML/JS, который будет выполнять работу как на стороне сервера, так и на стороне клиента. Единственным недостатком может быть кривая обучения и множество изменений в существующих страницах.

+0

Спасибо, если это intrests меня, что бы другие альтернативы, аналогичные JSF? –

+0

Другие компоненты, основанные на Java, - это Play! и Wicket. Я думаю, что Wicket является наименее разрушительным, когда дело касается изменения существующих HTML-страниц. Но я не уверен, что он поддерживает async (ajax) так же хорошо, как JSF. Я их никогда не использовал. – BalusC

0

Мой ответ будет таким же, как у BalusC.

Но сначала уточнение терминологии. Если все, что вы делаете, это включение/выключение поля HTML, мы обычно говорим, что это проверка на стороне клиента, независимо от того, выполняется ли это в Javascript или JSP. Да, в случае JSP логика отключения/включения полей выполняется на сервере, но поскольку все, что он делает, это настройка поля для отображения клиента, оно, как правило, относится к общему описанию «проверки на стороне клиента»,

Альтернатива (ну, собственно, «в дополнение к») для проверки на стороне клиента заключается в проверке полей формы, когда они получают POSTed на сервер. Это проверяет, что клиент действительно выполнил ваши правила проверки (например, они могут отключить javascript, или они могут использовать инструмент, например firebug, для повторного включения отключенного поля и т. Д.)

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

Теперь вернемся к вашему вопросу. Я бы сделал все это в javascript и проигнорировал логику JSP. Все, что вам нужно сделать, это взять кусок javascript, который срабатывает, когда они выходят из «А», и запускать его при загрузке страницы.

В JQuery, вы могли бы сделать что-то вроде (непроверенных)

var check_field = function(f) 
{ 
    if(!f) f=$(this); 
    if(f.val()=='XYZ') $("#field_B").attr('disabled', true); 
    else    $("#field_B").attr('disabled', false); 
}; 
$(function() 
{ 
    var a = $("#field_A"); 
    check_field(a); 
    a.blur(check_field); 
}); 
+0

Спасибо, это подход, который не будет работать с сотнями задействованных полей, клиенту придется подождать, чтобы загрузить страницу. Спасибо за терминологию, сделанную точку. Следует отметить, однако, что это самый простой пример, в реальном мире это намного больше, чем это, но это, по сути, набор выходов, связанных с полями (например, клиентская сторона, как вы упомянули). –

+0

Думаю, вы переоцениваете, сколько времени потребуется для выполнения. У меня большие пользовательские интерфейсы, которые делают подобные вещи, и действительно нет заметного повышения производительности. Вы используете пару строк javascript для сотен полей. Это действительно неважно. Но если вы решили это по-другому, тогда это тоже хорошо. – Tim