2012-02-16 103 views
5

estamos haciendo un manejo extraño de nuestras variables de formulario. De todos modos, he logrado obtener las variables de la solicitud para poder hacer algunas cosas en la base de datos. Ahora quiero publicar de nuevo en la página para que los cuadros de selección se puedan completar con las selecciones originales.La función "" debe usarse con un prefijo cuando no se especifica un espacio de nombre predeterminado

Aquí es un ejemplo de un campo de selección:

JSP:

Condition Code:  
<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
    <option value="">&nbsp;</option> 
    <c:forEach var="bean" items="${conditions}"> 
    <option value="'${bean.code}'"<c:if test="${bean.code == form.filterCriteria('CONDITION_CODE').values}"> selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
    </c:forEach> 
</select> 
<input type="hidden" name="filterCriteria('CONDITION_CODE').fieldName" value="CONDITION_CODE"/> 
<input type="hidden" name="filterCriteria('CONDITION_CODE').operation" value="="/> 

Como se puede ver el nombre es una función de la forma: name="filterCriteria('CONDITION_CODE').values

Aquí está la forma:

private String[] fieldNames; 

private Map<String, FilterCriteriaForm> filters = 
    new HashMap<String, FilterCriteriaForm>(); 




public String[] getFieldNames() { return this.fieldNames; } 
    public Map<String, FilterCriteriaForm> getFilters() { return this.filters; } 



    public FilterCriteriaForm getFilterCriteria(String fieldName) 
    throws ServletException 
{ 
    FilterCriteriaForm filter = (FilterCriteriaForm)filters.get(fieldName); 

    if (filter == null) 
    { 
     filter = new DetFilterCriteriaForm(requestAction); 
     filters.put(fieldName, filter); 
    } 

    return filter; 
} 


    public void setFilters(Map<String, FilterCriteriaForm> val) { this.filters = val; } 
    } 

De todos modos, hago algo como esto en el jsp para establecer el campo volver a lo que es en la forma: "<c:if test="${bean.code == form.filterCriteria('CONDITION_CODE').values}"> selected="selected"</c:if>

Cuando hago esto ... me sale este error:

The function filterCriteria must be used with a prefix when a default namespace is not specified

edición:

Condition Code:&nbsp;<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
       <c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
         <option value="">&nbsp;</option> 
         <c:forEach var="bean" items="${conditions}"> 
         <option value="'${bean.code}'" <c:if test="${bean.code == param[condition]}">selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
         </c:forEach> 
         </select> 
         <input type="hidden" name="filterCriteria('CONDITION_CODE').fieldName" value="CONDITION_CODE"/> 
         <input type="hidden" name="filterCriteria('CONDITION_CODE').operation" value="="/> 
         <br/></br> 

ESTO ES Lo que funcionó .... I mirado en el formulario de nuevo más cerca ... llevó a cabo las comillas simples y utilizado los getFilters():

<select size="1" name="filterCriteria(CONDITION_CODE).values"> 
      <option value="">&nbsp;</option> 
       <c:forEach var="bean" items="${conditions}">  
       <c:set var="code" value="'${bean.code}'" />  
       <option value="${code}" <c:if test='${code == form.filters["CONDITION_CODE"].values[0]}'>selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
       </c:forEach> 
       </select> 

Respuesta

5

¿por qué estás dando a su fo rm y los elementos de entrada nombres inválidos como ese?

De todos modos, su problema de concreto es que no se compara con una cadena simple, sino con un objeto EL. Como tiene ahora, espera un bean ${form} con un método filterCriteria(String) que devuelve algún objeto que tiene un método getValues(). Eso no es lo que quieres. Quieres que sea una cadena simple.

solucionarlo lo sigue, es necesario citarlo:

<c:if test="${bean.code == 'form.filterCriteria(\'CONDITION_CODE\').values'}"> 

Pero esto no le permitirá alcanzar el requisito funcional. Parece que estás confundiendo Java/JSP con JavaScript y esperando que se ejecuten de forma sincronizada. Esto no es cierto, Java/JSP se ejecuta en el servidor web y genera HTML. JavaScript es parte de HTML y se ejecuta solo en el navegador web. La variable form solo está disponible en JavaScript, no en una etiqueta JSTL.

Usted realmente necesita tomar el valor presentado como parámetro de solicitud por ${param}. Los valores de todos los elementos de entrada están disponibles por su nombre en el mapa de parámetros de solicitud. Se vería como sigue: nombres

<c:if test="${bean.code == param['filterCriteria(\'CONDITION_CODE\').values']}"> 

sólo no garantizo que si quiere trabajar, nunca he utilizado con caracteres no válidos, que tal vez necesitan para cifrar la URL de los personajes extraños. Sería mucho más fácil si le da a su formulario y elementos de entrada un nombre válido que coincida con las reglas según HTML specification.

<select name="condition"> 
    <option value="">&nbsp;</option> 
    <c:forEach items="${conditions}" var="condition"> 
    <option value="${condition.code}" ${condition.code == param.condition ? 'selected' : ''}>${condition.code}:&nbsp;${condition.description}</option> 
    </c:forEach> 
</select> 

(tenga en cuenta que tenía un valor no válido en <option value>, esos singlequotes no pertenece allí, yo les he quitado)


actualización: según los comentarios, parece que tiene un problema de error de sintaxis EL al acceder al nombre de parámetro ilegal en EL. Los caracteres de escape \ parecen ser completamente tragados por el analizador EL. Su mejor apuesta es, probablemente, a un alias con <c:set>:

<c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
... 
<c:if test="${bean.code == param[condition]}"> 

Actualización 2: aquellos singlequotes todo el valor de la opción parecen ser absolutamente necesario. En ese caso, debe agregar otro alias sobre eso. El código completo se vería así:

<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
    <c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
    <option value="">&nbsp;</option> 
    <c:forEach var="bean" items="${conditions}"> 
    <c:set var="code" value="'${bean.code}'" /> 
    <option value="${code}" <c:if test="${code == param[condition]}">selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
    </c:forEach> 
</select> 
Cuestiones relacionadas