最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化

 更新時(shí)間:2016年01月13日 08:54:08   作者:cdai  
這篇文章主要介紹了在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對(duì)其優(yōu)化的方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

Strut2判斷是否是AJAX調(diào)用
1.   AJAX與傳統(tǒng)Form表單
實(shí)際上,兩者一般都是通過HTTP的POST請(qǐng)求。區(qū)別是瀏覽器提交Form表單后,期望服務(wù)器返回一個(gè)完整的HTML頁面。而AJAX調(diào)用是由XMLHttpRequest對(duì)象(不同瀏覽器可能不一樣)發(fā)出,瀏覽器期望服務(wù)器返回HTML片段即可,具體是JSON、XML等都沒有要求。返回到瀏覽器后如何使用,也是由JS腳本自己決定的。
 
2. 請(qǐng)求是不是AJAX
那么對(duì)于服務(wù)器端,如何判斷一個(gè)HTTP請(qǐng)求是不是AJAX調(diào)用?這需要看HTTP的Header。
 
我們可以通過Header中的x-request-with來判斷。盡管不同瀏覽器發(fā)送AJAX請(qǐng)求的對(duì)象不同,但是如果使用jQuery發(fā)送AJAX請(qǐng)求的話,jQuery內(nèi)部實(shí)現(xiàn)ajax的時(shí)候,已經(jīng)加入了標(biāo)識(shí)。jQuery源碼中是這樣的:xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
所以,如果項(xiàng)目的前臺(tái)頁面都是通過jQuery發(fā)送AJAX請(qǐng)求的話,這樣判斷是安全的。
 
下面是HTTP請(qǐng)求攜帶的Header信息。
 
普通Form表單提交

===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

 
AJAX調(diào)用(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.   在Action中獲得HTTP請(qǐng)求頭
在Action類中,通過ServletRequestAware接口獲得HttpServletRequest對(duì)象,再通過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對(duì)象,用來判斷請(qǐng)求是否是AJAX調(diào)用 
   */ 
  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性能調(diào)優(yōu)攔截器
當(dāng)我們?cè)诠ぷ髦行枰獙?shí)現(xiàn)某些小需求時(shí),不妨先進(jìn)行下簡(jiǎn)單的調(diào)研,看看正在使用的開源框架是否已經(jīng)具備了我們需要的功能,這樣就不用重復(fù)發(fā)明輪子了。
 下面以性能測(cè)試為例,看看如何調(diào)查Struts2框架是否具備這種功能。

1.   struts-default.xml

因?yàn)镾truts2的許多核心功能都是基于內(nèi)部攔截器來實(shí)現(xiàn)的,所以我們首先要看看它是否有性能調(diào)優(yōu)相關(guān)的攔截器。這就需要查看strut2-core-2.3.1.2.jar中的默認(rèn)配置文件struts-default.xml了。

<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像個(gè)百寶箱一樣內(nèi)置了很多攔截器,可以看到profiling很可能就是符合我們需求的攔截器,那現(xiàn)在就打開源碼一探究竟。
 
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(); 
  
  } 
  
} 

 
從源碼中可以看到,只要瀏覽器發(fā)過來的HTTP請(qǐng)求參數(shù)中包含profiling=true或者yes,性能攔截器就會(huì)開啟Timer工具類,打印出Action的執(zhí)行消耗時(shí)間。

3.   struts.xml

因?yàn)閜rofiling攔截器沒有包含到默認(rèn)的defaultStack中,所以我們要先將它追加到我們自定義的攔截器棧中。

<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

現(xiàn)在就可以修改AJAX調(diào)用參數(shù),追加上profiling參數(shù)就可以開始性能調(diào)優(yōu)了。

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("創(chuàng)建成功"); 
       generateTableFromJson("result", data.resultRows); 
    } else { 
       alert("創(chuàng)建失敗"); 
    } 
    } 
  }); 
} 

 
5.   最終效果
 
打印結(jié)果就是下面這樣。除了總執(zhí)行時(shí)間外,Action方法的執(zhí)行時(shí)間和Result的渲染時(shí)間都會(huì)分別列出。

201611385424070.png (411×59)

相關(guān)文章

  • idea中配置tomcat啟動(dòng)jsp項(xiàng)目過程

    idea中配置tomcat啟動(dòng)jsp項(xiàng)目過程

    在IntelliJ IDEA中配置Tomcat并啟動(dòng)JSP項(xiàng)目,首先需要在IDEA中安裝和配置Tomcat服務(wù)器,接著將項(xiàng)目與Tomcat關(guān)聯(lián),設(shè)置正確的部署路徑和端口號(hào),通過這些步驟,可以實(shí)現(xiàn)JSP項(xiàng)目的本地運(yùn)行和調(diào)試,使得開發(fā)和測(cè)試工作更加高效
    2024-10-10
  • java 鍵盤輸入的多種實(shí)現(xiàn)方法

    java 鍵盤輸入的多種實(shí)現(xiàn)方法

    java不像C中擁有scanf這樣功能強(qiáng)大的函數(shù),大多是通過定義輸入輸出流對(duì)象。常用的類有BufferedReader,Scanner。
    2013-03-03
  • java 線程方法join簡(jiǎn)單用法實(shí)例總結(jié)

    java 線程方法join簡(jiǎn)單用法實(shí)例總結(jié)

    這篇文章主要介紹了java 線程方法join簡(jiǎn)單用法,結(jié)合實(shí)例形式總結(jié)分析了Java線程join方法的功能、原理及使用技巧,需要的朋友可以參考下
    2019-11-11
  • jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解

    jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解

    這篇文章主要介紹了jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例代碼,包括配置類、請(qǐng)求攔截器、線程上下文等相關(guān)知識(shí),代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 淺談Spring boot cache使用和原理

    淺談Spring boot cache使用和原理

    這篇文章主要介紹了淺談Spring boot cache使用和原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • SpringBoot和前端Vue的跨域問題及解決方案

    SpringBoot和前端Vue的跨域問題及解決方案

    所謂跨域就是從 A 向 B 發(fā)請(qǐng)求,如若他們的地址協(xié)議、域名、端口都不相同,直接訪問就會(huì)造成跨域問題,跨域是非常常見的現(xiàn)象,這篇文章主要介紹了解決SpringBoot和前端Vue的跨域問題,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼

    Java實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)抽獎(jiǎng)算法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-04-04
  • springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式

    springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了springBoot啟動(dòng)時(shí)讓方法自動(dòng)執(zhí)行的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java基于動(dòng)態(tài)規(guī)劃法實(shí)現(xiàn)求最長(zhǎng)公共子序列及最長(zhǎng)公共子字符串示例

    Java基于動(dòng)態(tài)規(guī)劃法實(shí)現(xiàn)求最長(zhǎng)公共子序列及最長(zhǎng)公共子字符串示例

    這篇文章主要介紹了Java基于動(dòng)態(tài)規(guī)劃法實(shí)現(xiàn)求最長(zhǎng)公共子序列及最長(zhǎng)公共子字符串,簡(jiǎn)單描述了動(dòng)態(tài)規(guī)劃法的概念、原理,并結(jié)合實(shí)例形式分析了Java使用動(dòng)態(tài)規(guī)劃法求最長(zhǎng)公共子序列以及最長(zhǎng)公共子字符串相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • Springboot項(xiàng)目快速實(shí)現(xiàn)攔截器功能

    Springboot項(xiàng)目快速實(shí)現(xiàn)攔截器功能

    上一篇文章介紹了Springboot項(xiàng)目如何快速實(shí)現(xiàn)過濾器功能,本篇文章接著來盤一盤攔截器,仔細(xì)研究后會(huì)發(fā)現(xiàn),其實(shí)攔截器和過濾器的功能非常類似,可以理解為面向切面編程的一種具體實(shí)現(xiàn)。感興趣的小伙伴可以參考閱讀
    2023-03-03

最新評(píng)論

永平县| 镇康县| 盘锦市| 大港区| 曲阳县| 三穗县| 东山县| 图片| 铜陵市| 册亨县| 伊宁县| 三明市| 宜章县| 大关县| 汾阳市| 新昌县| 苏州市| 海林市| 开化县| 宁乡县| 通渭县| 寿阳县| 镇江市| 丹阳市| 淮安市| 三原县| 侯马市| 元朗区| 仪征市| 新安县| 兴文县| 依安县| 志丹县| 乐业县| 五莲县| 长沙市| 东城区| 沽源县| 阿拉善左旗| 图片| 海晏县|