STRUT2 determina se é uma chamada de Ajax
1. Ajax e formulários tradicionais
De fato, ambos geralmente são solicitações de postagem via HTTP. A diferença é que, depois que o navegador enviar o formulário, espera que o servidor retorne uma página completa HTML. A chamada AJAX é emitida pelo objeto XMLHTTPREQUEST (diferentes navegadores podem ser diferentes). O navegador espera que o servidor retorne fragmentos HTML, mas não há requisitos para JSON, XML etc. Como usá -lo depois de retornar ao navegador também é determinado pelo próprio script JS.
2. É o pedido Ajax
Então, para o lado do servidor, como determinar se uma solicitação HTTP é uma chamada AJAX? Isso requer o cabeçalho HTTP.
Podemos julgar pela solicitação X-With no cabeçalho. Embora diferentes navegadores enviem objetos diferentes do AJAX, se o jQuery usar para enviar solicitações de Ajax, o identificador foi adicionado quando o jQuery implementa o Ajax internamente. O código-fonte jQuery é o seguinte: xhr.setRequestHeader ("x-requestado-with", "xmlhttprequest");
Portanto, se as páginas de front-end do projeto enviarem solicitações do AJAX através do jQuery, esse julgamento será seguro.
Abaixo está as informações do cabeçalho transportadas pelas solicitações HTTP.
Envio de formulário normal
=== MimeHeaders === ACTECT = */ *referente = http: // localhost: 8080/user2/toQueryPage.actionACcept-language = zh-cnuser-agent = mozilla/4.0 (compatível; msie8.0; Windows NT 6.1; Wows; Clr3.5.30729;
Ajax Call (ou seja)
=== MimeHeaders === x-requestado-with = xmlHttPrequestAccept-Language = zh-cnReferer = http: // localhost: 8080/user2/toQueryPage.actionAccept = Application/json, text/javascript,*/*;; q = 0,01 concntent-type = aplicação/x-www-forma-urlencodedAcept-coding = gzip, deflateUser-agent = mozilla/4.0 (compatível; msie8.0; Windows NT 6.1; Wow64; TRIDE/4.0; Slcc2; .net clr 2.0.50; 3.0.30729;
3. Obtenha o cabeçalho da solicitação HTTP em ação
Na classe de ação, o objeto HttpServletRequest é obtido através da interface ServletRequestAware e, em seguida, as informações do cabeçalho que desejamos são obtidas através do método GETHEADER.
Classe abstrata pública BaseAction <Paramvo estende Baseparamvo, o resultVo estende BaseResultvo> estende o ACTIONSupport implementa servletRequestare {private static string AJAX_RESULT_NAME = "AjaxResult"; String final estática privada xhr_object_name = "xmlhttPrequest"; String final estática privada Header_Request_With = "X-Requested-With"; /** paramvo paramvo privado; resultado privado resultVo; @Override public String Execute () {String resultpage = succcess; tente {resultVo = doexecute (paramvo); } catch (baseexception e) {resultadopage = error; } if (xhr_object_name.equals (request.getheader (header_request_with))) {resultpage = ajax_result_name; } retornar a página de resultado; }} Interceptador de ajuste de desempenho de struts2
Quando precisamos atingir certas pequenas necessidades em nosso trabalho, também podemos realizar uma pesquisa simples para ver se a estrutura de código aberto que estamos usando já tem as funções de que precisamos, para que não precisemos inventar repetidamente a roda.
Vamos fazer testes de desempenho como exemplo para ver como investigar se a estrutura do STRUTS2 tem essa função.
1. Struts-default.xml
Como muitas das funções principais do STRUTS2 são implementadas com base em interceptores internos, primeiro precisamos ver se ele possui interceptores relacionados ao ajuste de desempenho. Isso exige que você verifique os struts de arquivo de configuração padrão-efault.xml no strut2-core-2.3.1.2.jar.
<span style = "space branco: pré"> </span> <interceptor name = "alias"/> <interceptador name = "Autowiring"/> <interceptor name = "cadeia"/> <interceptor name = "conversionError"/> <interceptor name = "cookie"/> <intercetor name = "clearsessption"/> <Interceptor name = "Execandwait"/> <Interceptor name = "Exec"/> <Interceptor name = "Execandwait"/> <interceptornameInterceptorname = "excepção"/> <interceptor name = "excepção"/> <interceptor name = "fileUplOAD"/> <name name = "i18n" "/> <interceptor name =" fileUplOad "/> <name) name = "modeldriven"/> <interceptor name = "scopedmodeldriven"/> <interceptor name = "params"/> <interceptor name = "actionMappingParams"/> <interceptor name = "preparar"/> <interceptor name = "staticParams"/> <names de nome/"scope"/> <> name = "Timer"/> <Interceptor name = "Timer"/> <interceptor name = "name =" token "/> <interceptor name =" tokensession "/> <interceptor name =" validation "/> <Interceptor Name =" Workflow "/> <Interceptor Name =" Store "/<CeptOrgy" Nome "" name = "Papunos" /> <Interceptor name = "AnoTationWorkflow" /> <Interceptor name = "multislect" />
O STRUTS2 tem muitos interceptores construídos como um baú do tesouro. Você pode ver que o perfil é provavelmente um interceptador que atende às nossas necessidades. Em seguida, abra o código -fonte e descubra agora.
2. ProfilingActivationInterceptor
org.apache.struts2.intercept.profilingActivationIntercept.java
classe pública ProfilingActivationInterceptor ExtendsabStractIntercept {private String ProfilingKey = "Profiling"; DevMode booleano privado; @Inject (strutsconstants.struts_devmode) public void setDevMode (string mode) {this.devmode = "true" .equals (modo); } @Override public String Intercept (ActionInvocationInvocation) lança a exceção {if (devMode) {objeto val = invocação.getInvocationContext (). GetParameters (). Get (ProfilingKey); if (val! = null) {string sVal = (valt instanceof string? (string) val: ((string []) val) [0]); boolean enable = "sim" .equalsignorecase (sval) || "verdadeiro" .EqualSignorecase (SVAL); UtilTImerSTack.SetActive (Enable); Invocation.getInvocationContext (). getParameters (). Remover (ProfilingKey); }} return invocation.invoke (); }}
A partir do código -fonte, podemos ver que, desde que os parâmetros de solicitação HTTP enviados pelo navegador incluam perfil = true ou sim, o interceptor de desempenho ativará a classe de ferramentas do timer e imprimirá o tempo de execução da ação.
3. Struts.xml
Como o interceptor de perfil não está incluído no padrão padrão, devemos primeiro anexá -lo à nossa pilha de interceptores personalizados.
<pacote name = "Ajax-default" estends = "Velocity-Default"> <Result-Types> <Result-Type name = "JSON"/> </resultado Nome = "Profiling"/> </soceptor-Stack> </iSceptors> <Defundi-Interceptor-RefnameDefault-Interceptor-Refname = "AjaxInterceptStack"/> <MaMPULSULTS> <Result Name = "ComajaxResult" Type = "JSON"> <amam name = "excluiNullspRover =" ExcluiLlp (comaJaxResult "Type =" JSON "> <amam Name =" excluiNullspRover = "Excudenpr (comajaxResult" Type = "JSON"> <ampul) <param name = "ignorehierarchy"> false </amp> </cost> </lobal-results> </cackage>
4. UserView.js
Agora você pode modificar os parâmetros de chamada AJAX e adicionar os parâmetros de perfil para iniciar o ajuste de desempenho.
função searchallUser () {jquery.ajax ({type: "post", url: "searchalluser.action", processData: true, datatype: 'json', dados: jQuery ("#userQueryForm". generatetablefromjson ("resultado", data.ResulTrows); }
5. Efeito final
O resultado da impressão é o seguinte. Além do tempo total de execução, o tempo de execução do método de ação e o tempo de renderização dos resultados são listados separadamente.