Pasar parámetros a la acción a través de ModelDriven en Struts 2

El problema está relacionado con el ModelDriven y Struts 2.3.16. Dado que el comportamiento del interceptor de params cambiado para acceder a los parámetros pasados ​​a la acción requiere configurar la lista acceptParamNames para usar con la acción ModelDriven . Si la lista acceptParamNames está vacía, funciona de forma predeterminada aceptando parámetros a través del patrón predeterminado. Supongamos que tenemos un

Acción de ModelDriven :

 @Namespace("/modelDriven") public class ModelDrivenAction extends ActionSupport implements ModelDriven { private Gangster model = new Gangster(); private String name; //getter and setter public Object getModel() { return model; } @Actions({ @Action(value="modelDriven", results=@Result(location = "/modelDriven/modelDriven.jsp")), @Action(value="modelDrivenResult", results=@Result(location = "/modelDriven/modelDrivenResult.jsp")) }) public String execute() throws Exception { model.setName(name); return SUCCESS; } } 

el modelo:

 public class Gangster { private String name; //getter and setter } 

modelDriven.jsp:

     

modelDrivenResult.jsp:

 

En el método de execute acciones estamos obteniendo el name parámetro que debe ser llenado por el interceptor de params e inicializando la propiedad del modelo para mostrarlo en el resultado. Pero el problema es que el parámetro no está poblado. ¿Cómo obtener el name parámetro name se llena con el interceptor de params, por lo que la acción podría mostrar el valor?

El name es propiedad del modelo y también es propiedad de la clase de acción. El interceptor modelDriven empuja al modelo sobre la stack de valores, por lo que es fácil de usar en JSP. El objeto de acción está debajo del modelo. Por lo tanto, se puede hacer referencia directamente usando el prefijo [1] . Vea los básicos de OGNL .

Pero no es necesario si no hay nombres de propiedad duplicados en el modelo y el objeto de acción. Cuando el nombre como el name es evaluado por OGNL, busca desde la parte superior de la stack de valores hacia abajo en la stack para el acceso a la propiedad. El primer acceso encontrado se ejecutará. Entonces, la propiedad del modelo tiene una prioridad porque el modelo se encuentra en la parte superior de la stack de valores.

Si la propiedad con el nombre del name debe establecerse en la acción, puede nombrar directamente esa propiedad como [1].name . Pero ese nombre de parámetro no es aceptado por el patrón predeterminado de params interceptor. Sin embargo, es una expresión OGNL válida. Entonces, para que pase por el interceptor, debe agregarlo a un patrón de nombres de parámetros aceptados. Como eso

 @Action(value="modelDrivenResult", results=@Result(location = "/modelDriven/modelDrivenResult.jsp"), interceptorRefs = @InterceptorRef(value="defaultStack", params={ "params.acceptParamNames", "(\\[\\d+\\]\\.)*\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*" }) ) 

Esto se debe a que OGNL también verifica el patrón de parámetros aceptados y este patrón de expresiones regulares permite hacer coincidir los params y los emparejamientos OGNL.