validation - validación de struts2 y método de preparación relacionado
struts2-interceptors (1)
No debe instanciar usted mismo un objeto que proviene de JSP.
Para obtenerlo en el método de prepare()
, ejecutado por el Prepare Interceptor
prepare()
antes del Param Interceptor
, debe usar una pila especial : paramsPrepareParamsStack
<!-- An example of the paramsPrepareParams trick. This stack
is exactly the same as the defaultStack, except that it
includes one extra interceptor before the prepare interceptor:
the params interceptor.
This is useful for when you wish to apply parameters directly
to an object that you wish to load externally (such as a DAO
or database or service layer), but can''t load that object
until at least the ID parameter has been loaded. By loading
the parameters twice, you can retrieve the object in the
prepare() method, allowing the second params interceptor to
apply the values on the object. -->
<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="params">
<param name="excludeParams">^class/..*,^dojo/..*,^struts/..*,^session/..*,^request/..*,^application/..*,^servlet(Request|Response)/..*,^parameters/..*,^action:.*,^method:.*</param>
</interceptor-ref>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">^class/..*,^dojo/..*,^struts/..*,^session/..*,^request/..*,^application/..*,^servlet(Request|Response)/..*,^parameters/..*,^action:.*,^method:.*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
En tener una acción de custprofileview
que muestre una página JSP con todos los detalles del cliente y en mi JSP todos los campos son como mi
<s:textfield name="custprofileVO.email" value="%{custprofileVO.email}" />
<s:textfield name="custprofileVO.phone" value="%{custprofileVO.phone}" />
y hazlo así, y hay un botón de enviar que llama a Action updatecustprofile
.
En updatecustprofile
Action, en lugar de asignar propiedades directamente, tengo una variable de miembro private CustprofileVO custprofileVO;
con setter y getter.
En CustprofileVO
Clase I tengo campos como el email
, el phone
y todos los demás campos con sus métodos setters y getters.
El problema es : en updatecustprofile
Acción Estoy implementando la Interfaz Prepareable
, y en la implementación del método prepare()
tengo custprofileVO.setDefaultID("Select");
y estableciendo 4 campos más, pero cuando ejecuto el programa haciendo clic en el botón de enviar obtengo NPE
en la primera línea que es custprofileVO.setDefaultID("Select");
Parece que el marco no está instanciando CustprofileVO custprofileVO
. Si instancia manualmente custprofileVO
justo encima de la configuración del campo (al hacer custprofileVO = new CustprofileVO()
entonces funciona. El problema es que, idealmente, struts2 framework debería darme una instancia que no está haciendo, quiero entender el motivo.
Además, si configuro manualmente custprofileVO
en el método de preparación, funciona, pero también he aplicado la validación usando XML, donde mi nombre de campo es custprofileVO.email
, su validación y luego custprofileVO.phone
su validación.
Cuando intento validar al hacer clic en botón de enviar, la validación se ejecuta, pero en la pantalla veo mensajes para todos los campos, ya que los datos en todos los cuadros de texto se borran.
¿Por qué se eliminan los datos?