Фон
Использование 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
(и необязательного полного двоеточия) может привести к появлению кода, зависящего от фреймворка.
Спасибо!