Strut2 détermine s'il s'agit d'un appel AJAX
1 AJAX et Form traditionnel
En fait, les deux sont généralement des requêtes POST via HTTP. La différence est qu'une fois que le navigateur a soumis le formulaire, il s'attend à ce que le serveur renvoie une page HTML complète. L'appel AJAX est émis par l'objet XMLHttpRequest (les différents navigateurs peuvent être différents). Le navigateur s'attend à ce que le serveur renvoie un fragment HTML. Plus précisément, il n'y a aucune exigence pour JSON, XML, etc. La manière de l'utiliser après le retour au navigateur est également déterminée par le script JS lui-même.
2. Si la requête est AJAX
Donc côté serveur, comment déterminer si une requête HTTP est un appel AJAX ? Cela nécessite de regarder l'en-tête HTTP.
Nous pouvons juger par x-request-with dans l'en-tête. Bien que différents navigateurs envoient des requêtes AJAX à différents objets, si jQuery est utilisé pour envoyer des requêtes AJAX, l'identifiant a été ajouté lorsque jQuery implémente ajax en interne. Le code source de jQuery ressemble à ceci : xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
Par conséquent, si la page frontale du projet envoie des requêtes AJAX via jQuery, ce jugement est sûr.
Ce qui suit sont les informations d'en-tête portées par la requête HTTP.
Soumission sous forme normale
===MimeHeaders === accept = */* referer =http://localhost:8080/user2/toQueryPage.action accept-language = zh-CN user-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; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C;.NET4.0E) accept-encoding = gzip, deflate host = localhost:8080 connection = Keep-Alive cache-control = no-cache
Appel AJAX (IE)
===MimeHeaders === x-requested-with = XMLHttpRequest accept-language = zh-cn referer =http://localhost:8080/user2/toQueryPage.action accept = application/json, text/javascript,*/*; q=0.01 content-type =application/x-www-form-urlencoded accept-encoding = gzip, deflate user-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; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C;.NET4.0E) host = localhost:8080 content-length = 57 connection = Keep-Alive cache-control = no-cache
3. l'en-tête de requête HTTP dans Action
Dans la classe Action, obtenez l'objet HttpServletRequest via l'interface ServletRequestAware, puis obtenez les informations d'en-tête souhaitées via la méthode getHeader.
public abstract class BaseAction <ParamVo extends BaseParamVo, ResultVo extends BaseResultVo> extends ActionSupport implements ServletRequestAware { private static final String AJAX_RESULT_NAME = "ajaxResult"; private static final String XHR_OBJECT_NAME = "XMLHttpRequest"; private static final String HEADER_REQUEST_WITH = "x-requested-with"; /** * Request对象,用来判断请求是否是AJAX调用 */ private HttpServletRequest request; private ParamVo paramVo; private ResultVo resultVo; @Override public String execute() { String resultPage = SUCCESS; try { resultVo = doExecute(paramVo); } catch (BaseException e) { resultPage = ERROR; } if (XHR_OBJECT_NAME.equals(request.getHeader(HEADER_REQUEST_WITH))) { resultPage = AJAX_RESULT_NAME; } return resultPage; } }
Struts2 Performance Tuning Interceptor
Lorsque nous devons mettre en œuvre quelques petites exigences au travail, autant mener d'abord une simple enquête Voir. si le framework open source que vous utilisez possède déjà les fonctionnalités dont nous avons besoin, vous n'avez donc pas à réinventer la roue.
Prenons les tests de performances comme exemple pour voir comment déterminer si le framework Struts2 a cette fonction.
1. struts-default.xml
Étant donné que de nombreuses fonctions principales de Struts2 sont implémentées sur la base d'intercepteurs internes, nous devons d'abord voir s'il dispose d'un dispositif d'interception lié au réglage des performances. Cela nécessite de vérifier le fichier de configuration par défaut struts-default.xml dans strut2-core-2.3.1.2.jar.
<span style="white-space:pre"> </span><interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/> <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" /> <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" /> <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /> <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/> <interceptornameinterceptorname="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/> <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/> <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/> <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/> <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/> <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/> <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/> <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/> <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" /> <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" /> <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /> <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" /> <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" /> <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
Struts2 possède de nombreux intercepteurs intégrés comme un coffre au trésor. Vous pouvez voir que le profilage est probablement l'intercepteur qui répond à nos besoins, alors ouvrez-le. Maintenant, consultez le code source.
2. ProfilingActivationInterceptor
org.apache.struts2.interceptor.ProfilingActivationInterceptor.java
public class ProfilingActivationInterceptor extendsAbstractInterceptor { private String profilingKey = "profiling"; private boolean devMode; @Inject(StrutsConstants.STRUTS_DEVMODE) public void setDevMode(String mode) { this.devMode = "true".equals(mode); } @Override public String intercept(ActionInvocationinvocation) throws Exception { if (devMode) { Object val =invocation.getInvocationContext().getParameters().get(profilingKey); if (val != null) { String sval = (val instanceof String ?(String)val : ((String[])val)[0]); boolean enable = "yes".equalsIgnoreCase(sval)|| "true".equalsIgnoreCase(sval); UtilTimerStack.setActive(enable); invocation.getInvocationContext().getParameters().remove(profilingKey); } } return invocation.invoke(); } }
Comme le montre le code source, tant que les paramètres de requête HTTP envoyés par le navigateur contiennent profiling=true ou yes, l'intercepteur de performances ouvrira la classe d'outils Timer et imprimera le temps d'exécution de l'action.
3. struts.xml
Étant donné que l'intercepteur de profilage n'est pas inclus dans le defaultStack par défaut, nous devons d'abord l'ajouter à notre pile d'intercepteur personnalisée.
<package name="ajax-default" extends="velocity-default"> <result-types> <result-type name="json" class="org.apache.struts2.json.JSONResult"/> </result-types> <interceptors> <interceptor-stacknameinterceptor-stackname="ajaxInterceptorStack"> <interceptor-refnameinterceptor-refname="defaultStack" /> <interceptor-ref name="profiling"/> </interceptor-stack> </interceptors> <default-interceptor-refnamedefault-interceptor-refname="ajaxInterceptorStack" /> <global-results> <result name="comAjaxResult" type="json"> <param name="excludeNullProperties">true</param> <param name="root">result</param> <param name="ignoreHierarchy">false</param> </result> </global-results> </package>
4. userview.js
Vous pouvez maintenant modifier les paramètres d'appel AJAX et ajouter des paramètres de profilage pour démarrer le réglage des performances.
function searchAllUser(){ jQuery.ajax({ type:"post", url: "searchAllUser.action", processData:true, dataType:'json', data:jQuery("#userQueryForm").serialize() + "&profiling=yes", success:function(data) { if (data.status == 1) { alert("创建成功"); generateTableFromJson("result", data.resultRows); } else { alert("创建失败"); } } }); }
5. L'effet final
Le résultat imprimé est le suivant. En plus du temps d'exécution total, le temps d'exécution de la méthode Action et le temps de rendu du Résultat seront répertoriés séparément.
Pour plus d'articles sur la façon de déterminer s'il faut appeler AJAX dans Struts de Java et utiliser des intercepteurs pour l'optimiser, veuillez faire attention au PHP Site chinois !