Strut2 determina si se trata de una llamada AJAX
1. Ajax y formas de forma tradicional
De hecho, ambas son generalmente solicitudes de publicación a través de HTTP. La diferencia es que después de que el navegador envía el formulario del formulario, espera que el servidor devuelva una página HTML completa. La llamada AJAX es emitida por el objeto XMLHTTPREQUEST (diferentes navegadores pueden ser diferentes). El navegador espera que el servidor devuelva fragmentos HTML, pero no hay requisitos para JSON, XML, etc. Cómo usarlo después de regresar al navegador también está determinado por el script JS en sí.
2. Es la solicitud AJAX
Entonces, para el lado del servidor, ¿cómo determinar si una solicitud HTTP es una llamada AJAX? Esto requiere el encabezado HTTP.
Podemos juzgar por el X-Request con el encabezado. Aunque diferentes navegadores envían solicitudes AJAX diferentes objetos, si JQuery usa para enviar solicitudes AJAX, el identificador se ha agregado cuando jQuery implementa AJAX internamente. El código fuente jQuery es el siguiente: XHR.SetRequestHeader ("X-Requested con", "xmlhttprequest");
Por lo tanto, si las páginas frontales del proyecto envían solicitudes AJAX a través de jQuery, este juicio es seguro.
A continuación se muestra la información del encabezado realizada por las solicitudes HTTP.
Envío de formulario normal
=== MimeHeaders === Aceptar = */ *referente = http: // localhost: 8080/user2/toqueryPage.ActionAccept-language = zh-cnuser-agent = mozilla/4.0 (compatible; msie8.0; windows nt 6.1; wow64; trident/4.0; slcc2; .net clr 2.0.50727;. CLR3.5.30729;
AJAX Llamada (es decir)
=== MimeHeaders === X-Requested-With = xmlhttprequestaccept-language = zh-cnreferer = http: // localhost: 8080/user2/toQueryPage.actionAccept = Application/Json, Text/JavaScript,*/*; q = 0.01Content-type = Application/x-www-form-urlencodedaccept-ending = gzip, deflateuser-agent = mozilla/4.0 (compatible; msie8.0; windows nt 6.1; wow64; trident/4.0; slcc2; .net clr 2.0.50727; .net clr3.5.30729; 3.0.30729;
3. Obtenga el encabezado de solicitud HTTP en acción
En la clase de acción, el objeto httpservletRequest se obtiene a través de la interfaz ServletRequestaware, y luego la información del encabezado que queremos se obtiene a través del método Getheader.
Public Abstract Class Baseaction <Paramvo extiende BaseParamvo, resultVo extiende BaseResultvo> extiende ActionSupport implementa ServletRequestaware {String final estática privada Ajax_Result_Name = "AjaxResult"; Cadena final estática privada xhr_object_name = "xmlhttprequest"; encabezado de cadena final estática privada_request_with = "X-requested con"; / *** Objeto de solicitud, utilizado para determinar si la solicitud es una llamada AJAX*/ PRIVADA HTTPSERVELTREQUEST SOLIT; PARAMVO PRIVADO PARAMVO; ResultVo privado Resultvo; @Override public String Execute () {String dultePage = Succes; intente {resultVo = doExecute (paramvo); } catch (BaseException e) {resultPage = error; } if (xhr_object_name.equals (request.getheader (header_request_with))) {dultepage = ajax_result_name; } return ResultPage; }} Struts2 Interceptor de ajuste de rendimiento
Cuando necesitamos lograr ciertas pequeñas necesidades en nuestro trabajo, también podríamos realizar una encuesta simple para ver si el marco de código abierto que estamos utilizando ya tiene las funciones que necesitamos, para que no tengamos que inventar repetidamente la rueda.
Tomemos las pruebas de rendimiento como un ejemplo para ver cómo investigar si el marco Struts2 tiene esta función.
1. Struts-default.xml
Debido a que muchas de las funciones centrales de Struts2 se implementan en función de interceptores internos, primero debemos ver si tiene interceptores relacionados con el ajuste de rendimiento. Esto requiere que verifique el archivo de configuración predeterminado Struts-Default.xml en STRUT2-Core-2.3.1.2.Jar.
<span style = "white-space: pre"> </span> <interceptor name = "alias"/> <interceptor name = "Autowiring"/> <Interceptor name = "Chain"/> <Interceptor name = "conversionError"/> <Interceptor name = "Cookie"/> <Interceptor Name = "ClearSession"/> <Interceptor Name = "CreateSession"/<Shessionion " <Interceptor name = "ExecandWait"/> <Interceptor name = "EXEC"/> <Interceptor name = "ExecandWait"/> <interceptorNameInterceptOnname = "Exception"/> <Interceptor Name = "Exception"/> <Interceptor Name = "FileUpload"/> <Interceptor Name = "i18n"/> <Interceptor name = "Logger/" Logger " name = "ModelDriven"/> <Interceptor name = "ScopedModEldriven"/> <Interceptor name = "Params"/> <Interceptor name = "ActionMappingParams"/> <Interceptor Name = "Prepare"/> <Interceptore Name = "StaticParams" name = "Timer"/> <Interceptor name = "Timer"/> <interceptor name = "name =" token "/> <interceptor name =" tokensession name = "roles" /> <interceptor name = "annotationworkflow" /> <interceptor name = "multiselect" />
Struts2 tiene muchos interceptores incorporados como un cofre del tesoro. Puede ver que el perfil es probablemente un interceptor que satisface nuestras necesidades. Luego abra el código fuente y averigüe ahora.
2. ProfilingAcivation Interceptor
org.apache.struts2.interceptor.profilingactivationinterceptor.java
Public Class ProfilingActivationInterceptor extendSAbstractInterceptor {private String perfilingKey = "perfilado"; Devmode booleano privado; @Inject (strutsconstants.struts_devmode) public void setDevMode (modo de cadena) {this.devmode = "true" .equals (modo); } @Override public String Intercept (ActionInVocationInVocation) lanza la excepción {if (devMode) {objeto val = invocation.getInVocationContext (). GetParameters (). Get (perfilingkey); if (val! = null) {string sval = (val instanciaf string? (string) val: ((string []) val) [0]); Boolean Enable = "Sí" .equalSignorecase (SVAL) || "verdadero" .equalsignorecase (sval); Utiltimerstack.setActive (habilitar); invocation.getInVocationContext (). GetParameters (). Eliminar (perfilar Key); }} return invocation.invoke (); }}
Desde el código fuente, podemos ver que mientras los parámetros de solicitud HTTP enviados por el navegador incluyan perfil = verdadero o sí, el interceptor de rendimiento encenderá la clase de herramientas de temporizador e imprima el tiempo de ejecución de la acción.
3. Struts.xml
Debido a que el interceptor de perfil no está incluido en el valor predeterminado predeterminado, primero debemos agregarlo a nuestra pila de interceptor personalizado.
<paquete name = "Ajax-Default" extends = "Velocity-Default"> <Result-Types> <Result-type name = "json"/> </resultado-thypes> <interceptors> <interceptor-stacknameinterceptor stacknam name = "Profiling"/> </ Interceptor-stack> </pasceptores> <default-interceptore-refnamedefault-interceptor-refname = "ajaxinterceptoreStack"/> <Global-Results> <Result name = "comaJaxResult" type = "json"> <param name = "ExcuneNullProperties"> verdadero </sulEd </param> "parámetro =" parámetro = "parámetro> <Param name = "IgnoreHierarchy"> False </amam> </ resultado> </global-results> </pacquee>
4. Userview.js
Ahora puede modificar los parámetros de llamadas AJAX y luego agregar los parámetros de perfil para comenzar el ajuste de rendimiento.
function searchAllUser () {jQuery.AJAX ({type: "post", url: "searchAllUser.action", processData: true, dataType: 'json', data: jQuery ("#userQueryform"). Serialize () + "y perfilado = sí", éxito: function (data) {if if 1) GenerAtTableFromJson ("resultado", data.resulTrows); }
5. Efecto final
El resultado de la impresión es el siguiente. Además del tiempo de ejecución total, el tiempo de ejecución del método de acción y el tiempo de representación de los resultados se enumeran por separado.