strut2는 그것이 Ajax 호출인지 여부를 결정합니다
1. Ajax 및 전통적인 형태
실제로, 둘 다 일반적으로 HTTP를 통한 후 요청입니다. 차이점은 브라우저가 양식 양식을 제출 한 후 서버가 전체 HTML 페이지를 반환 할 것으로 예상한다는 것입니다. AJAX 호출은 XMLHTTPREQUEST 객체에 의해 발행됩니다 (다른 브라우저는 다를 수 있음). 브라우저는 서버가 HTML 조각을 반환 할 것으로 예상하지만 JSON, XML 등에 대한 요구 사항은 없습니다. 브라우저로 돌아온 후 사용하는 방법은 JS 스크립트 자체에 의해 결정됩니다.
2. 요청 ajax입니다
서버 측의 경우 HTTP 요청이 AJAX 호출인지 여부를 결정하는 방법은 무엇입니까? 이를 위해서는 HTTP 헤더가 필요합니다.
우리는 헤더에서 X- 요청에 의해 판단 할 수 있습니다. 다른 브라우저가 ajax 요청을 보내지 만 JQuery가 AJAX 요청을 보내는 데 사용하면 jQuery가 AJAX를 내부적으로 구현할 때 식별자가 추가되었습니다. jQuery 소스 코드는 다음과 같습니다. XHR.SetRequestHeader ( "X-Requested-With", "xmlhttprequest");
따라서 프로젝트의 프론트 엔드 페이지가 jQuery를 통해 AJAX 요청을 보내면이 판단은 안전합니다.
아래는 HTTP 요청에 의해 수행되는 헤더 정보입니다.
정상적인 양식 제출
=== MimeHeaders === accept = */ *referer = http : // localhost : 8080/user2/toquerypage.actionaccept-language = zh-cnuser-agent = mozilla/4.0 (MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2;. CLR3.5.30729;
Ajax 전화 (IE)
=== MimeHeaders === X- Quested-with = xmlhttprequestaccept-language = zh-cnreferer = http : // localhost : 8080/user2/toquerypage.actionaccept = application/json, text/javascript,*/*; Q = 0.01content-type = application/x-x-www-www-urlencodedaccept-encoding = gzip, deflateuser-agent = mozilla/4.0 (호환 가능; msie8.0; Windows nt 6.1; Wow64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR3.5.30729; 3.0.30729;
3. HTTP 요청 헤더를 얻으십시오
액션 클래스에서 httpservletrequest 객체는 Servletrequestaware 인터페이스를 통해 얻은 다음 원하는 헤더 정보는 Getheader 메소드를 통해 얻습니다.
공개 초록 클래스 BASEEATION <PARAMVO 확장 BASEPARAMVO, resultVO 확장 기준 확장 ActionSupport empless servletRequestAware {개인 정적 최종 문자열 ajax_result_name = "ajaxresult"; 개인 정적 최종 문자열 xhr_object_name = "xmlhttprequest"; 비공개 정적 최종 문자열 header_request_with = "x-requested-with"; / *** 요청 객체, 요청이 ajax 콜*/ private httpservletrequest 요청 여부를 결정하는 데 사용됩니다. 개인 Paramvo Paramvo; 개인 결과 vo 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 성능 튜닝 인터셉터
작업에서 특정 작은 요구를 달성해야 할 때, 우리는 이미 사용하고있는 오픈 소스 프레임 워크에 필요한 기능이 있는지 확인하기 위해 간단한 설문 조사를 수행 할 수 있습니다. 따라서 휠을 반복적으로 발명 할 필요가 없습니다.
STRUTS2 프레임 워크 에이 기능이 있는지 여부를 조사하는 방법을 조사하기 위해 성능 테스트를 예로 들어합시다.
1. Struts-default.xml
Struts2의 많은 핵심 기능은 내부 요격기를 기반으로 구현되므로 먼저 성능 튜닝 관련 인터셉터가 있는지 확인해야합니다. 이를 위해서는 strut2-core-2.3.1.2.jar에서 기본 구성 파일 Struts-default.xml을 확인해야합니다.
<span style = "white"> </span> <인터셉터 이름 = "alias"/> <interceptor name = "autowiring"/<interceptor name = "chain"/> <interceptor name = "conversionerror"/> <interceptor name = "쿠키"/> <interceptor name = "interceptor name ="<interctors " <interceptor name = "execandwait"/<인터셉터 이름 = "exec"/> <interceptor name = "execandwait"/<interceptornameinterceptorname = "exception"/> <interceptor name = "Exception"/> <interceptor name = "interceptor name ="i18n "/> <interceptor name ="interceptor name "" "" "" "" <인터셉터 이름 = "scopedModelDriven"/> <인터셉터 이름 = "params"/> <interceptor name = "actionmappingparams"/<interceptor name = "repary"/<interceptor name = "staticparams"/> <interceptor name = "scope"/> <interceptor name = "servletconfig"interceptor = "serceptor" 이름 = "타이머"/> <interceptor name = "name ="token "/> <interceptor name ="tokensession "/<interceptor name ="validation "/> <interceptor name ="Workflow "/<interceptor name ="store "/> <interceptor name ="checkbox "/> <Interceptor name ="profector ""interceptor ""interceptor ". 이름 = "AnnotationWorkflow" /> <인터셉터 이름 = "multisLect" />
Struts2에는 보물 상자와 같은 많은 인터셉터가 있습니다. 프로파일 링이 아마도 우리의 요구를 충족시키는 인터셉터라는 것을 알 수 있습니다. 그런 다음 소스 코드를 열고 지금 찾으십시오.
2. 프로파일 링 활성화 인터셉터
org.apache.struts2.interceptor.profingactivation interceptor.java
공개 클래스 프로파일 링 활성화 interceptor ExtendSabstractinterceptor {private String profilingkey = "profiling"; 개인 부울 데브 모드; @inject (strutsconstants.struts_devmode) public void setDevMode (문자열 모드) {this.devMode = "true".Equals (mode); } @override public string intercept (actionInvocationInvocation) 예외 {if (devMode) {object val = invocation.getInvocationContext (). getParameters (). if (val! = null) {string sval = (val instanceof string? (String) val : ((String []) val) [0]; 부울 enable = "예".EqualSignoreCase (sval) || "참".equalsignorecase (sval); utiltImerstack.setActive (enable); invocation.getInvocationContext (). getParameters (). 제거 (프로파일 킹 키); }} return invoction.invoke (); }}
소스 코드에서 브라우저에서 보낸 HTTP 요청 매개 변수에 ProfiLING = TRUE 또는 YES가 포함되어있는 한 성능 요격기는 타이머 도구 클래스를 켜고 작업 실행 시간을 인쇄합니다.
3. struts.xml
프로파일 링 인터셉터가 기본 기본 스택에 포함되지 않으므로 먼저 사용자 정의 인터셉터 스택에 추가해야합니다.
<package name = "ajax-default"extends = "velocity-default"> <result-types> <result-type name = "json"/> </result-types> <interceptors> <interceptor-stacknameinterceptor-stackname = "interceptor-refname interceptor-refname ="interceptor-refname interceptor-refname. 이름 = "프로파일 링"/> </interceptor-stack> </interceptors> <default-interceptor-refnamedefault-interceptor-refname = "ajaxinterceptorstack"/> <global-restults> <result name = "comajaxresult"type = "json"> <param name = "ingorehierarchy"> false </param> </result> </global-restults> </package>
4. userview.js
이제 AJAX 호출 매개 변수를 수정 한 다음 프로파일 링 매개 변수를 추가하여 성능 튜닝을 시작할 수 있습니다.
functionAllUser () {jQuery.ajax ({type : "post :"post ", url :"searchAllUser.action ", processData : true, datatype : 'json', data : jQuery ("#userQueryForm "). Serialize () +"& proficing = yes ", success : function (data) {if (detal 1) {alert ("만들기 ( "만들기)"); GenerateBLEFROMJSON ( "result", data.resultrows) {alert ( "실패"); }
5. 최종 효과
인쇄 결과는 다음과 같습니다. 총 실행 시간 외에도 작업 방법의 실행 시간과 결과의 렌더링 시간이 별도로 나열됩니다.