Имена параметров JSP в HttpServletRequest - PullRequest
0 голосов
/ 24 марта 2011

Фон

Использование Eclipse Helios, Apache Tomcat, JSP и JBoss RichFaces.

Входные параметры кодируются следующим образом:

<h:inputHidden name="system_REPORT_RESOURCE" value="city" />
<h:inputHidden name="system_REPORT_FILENAME" value="city" />
<h:inputHidden name="report_REPORT_TITLE" value="City Listing" />
... and others ...

Проблема

Следующий код отображает значения ключей:

@SuppressWarnings( "unchecked" )
protected void setInputParameters() {
  HttpServletRequest request = getServletRequest();
  Enumeration<String> keys = request.getParameterNames();

  while( keys.hasMoreElements() ) {
    String key = keys.nextElement();

    for( String value : request.getParameterValues( key ) ) {
      System.out.println( "KEY: " + key + " VALUE: " + value );
    }
  }
}

Каркас изменяет имена ключей:

KEY: j_id2:report_city VALUE: ab
KEY: j_id2:system_REPORT_RESOURCE VALUE: city
KEY: j_id2:j_id11 VALUE: Report
KEY: j_id2:report_REPORT_TITLE VALUE: City Listing
KEY: j_id2:report_int_max_longitude VALUE: 
KEY: j_id2:report_int_min_latitude VALUE: 
KEY: javax.faces.ViewState VALUE: j_id28
KEY: j_id2:system_REPORT_FILENAME VALUE: city
KEY: j_id2 VALUE: j_id2

Обновление

Изменение тега <h:form>включение атрибута id="form" приводит к:

KEY: form:system_REPORT_FILENAME VALUE: city
KEY: form VALUE: form
KEY: form:report_city VALUE: ab
KEY: form:report_int_max_longitude VALUE: 
KEY: form:report_REPORT_TITLE VALUE: Canadian City List
KEY: form:system_REPORT_RESOURCE VALUE: city
KEY: form:report_int_min_latitude VALUE: 
KEY: form:j_id10 VALUE: Report
KEY: javax.faces.ViewState VALUE: j_id1

Это лучше, но все же не идеально.

Обновление 2

Код должен анализировать параметр формы вводаимена в общем.Пока что следующий код работает для удаления префикса (но он выглядит хакерским):

  /**
   * Appends the list of HTTP request parameters to the internal parameter
   * map of user input values. Some frameworks prepend the name of the HTML
   * FORM before the name of the input. This method detects the colon and
   * removes the FORM NAME, if present. This means that input parameter
   * names assigned by developers should not contain a colon in the name.
   * (Technically, it is possible, but to avoid potential confusion it
   * should be avoided.)
   */
  protected void setInputParameters() {
    HttpServletRequest request = getServletRequest();
    Iterator<String> keys = getExternalContext().getRequestParameterNames();
    Parameters p = getParameters();

    while( keys.hasNext() ) {
      String key = keys.next();

      for( String value : request.getParameterValues( key ) ) {
        int i = key.indexOf( ':' );

        if( i >= 0 ) {
          key = key.substring( i + 1 );
        }

        p.put( key, value );
      }
    }
  }

Вопрос

Какой вызов API возвращает имена параметров без префикса j_id2?

Удаление префикса j_id2 (и необязательного полного двоеточия) может привести к появлению кода, зависящего от фреймворка.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2011

Вы можете использовать стандартный тег HTML <input>.Работает просто отлично.На самом деле, я только что опубликовал ответ на свой вопрос, который я нашел, используя его было лучшей идеей.См. Здесь: Передача параметров в компонент PrimeFaces Star Rating?

0 голосов
/ 24 марта 2011

Я не думаю, что для этого есть API, j_id2: XXX - это фактическое имя параметра запроса.

...