Strut2 определяет, является ли это вызовом Ajax
1. Аякс и традиционные формы формы
Фактически, оба обычно являются почтовыми запросами через HTTP. Разница в том, что после того, как браузер подчиняет форму формы, он ожидает, что сервер вернет полную HTML -страницу. Вызов Ajax выдается объектом Xmlhttprequest (разные браузеры могут быть разными). Браузер ожидает, что сервер вернет фрагменты HTML, но нет никаких требований к JSON, XML и т. Д. Как использовать его после возвращения в браузер, также определяется сам сценарий JS.
2. - это запрос ajax
Итак, для сервера, как определить, является ли HTTP -запрос вызовом AJAX? Это требует заголовка HTTP.
Мы можем судить по X-request в заголовке. Хотя разные браузеры отправляют AJAX запрашивать разные объекты, если JQuery использует для отправки запросов AJAX, идентификатор был добавлен, когда JQuery реализует AJAX внутренне. Исходный код jQuery выглядит следующим образом: xhr.setrequestheader ("x-requested-with", "xmlhttprequest");
Поэтому, если передние страницы проекта отправляют запросы Ajax через jQuery, это решение безопасно.
Ниже приведена информация о заголовке, передаваемая HTTP -запросами.
Обычная форма формы.
=== mimeHeaders === Принять = */ *Реферат = 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 ;NET CLR 3.0.30729;
Ajax Call (т.е.)
=== 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-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.307 3.0.30729;
3. Получить HTTP -запрос в действии
В классе действий объект httpservletrequest получается через интерфейс ServletRequestaware, а затем информацию, которую мы хотим, получается с помощью метода Getheader.
Общедоступный абстрактный класс Baseaction <paramvo Extends BaseParamvo, ResultVo расширяет BASERESULTVO> Extends ActionSupport реализует ServletRequestaware {частная статическая конечная строка AJAX_RESULT_NAME = "AjaxResult"; Приватная статическая конечная строка xhr_object_name = "xmlhttprequest"; частная статическая конечная строка Header_request_with = "x-requested-with"; / *** Объект запроса, используемый для определения того, является ли запрос вызовом Ajax*/ Private HttpservletRequest; Private Paramvo Paramvo; Частный результат resultvo; @Override public String execute () {String resultPage = успех; try {resultVo = doExecute (paramvo); } catch (baseexception e) {resultPage = error; } if (xhr_object_name.equals (request.getheader (header_request_with))) {resultpage = ajax_result_name; } вернуть ResultPage; }} Перехватчик настройки производительности struts2
Когда нам нужно удовлетворить определенные небольшие потребности в нашей работе, мы могли бы также провести простой опрос, чтобы увидеть, есть ли у рамки с открытым исходным кодом, есть уже необходимые нам функции, чтобы нам не приходилось многократно изобретать колесо.
Давайте возьмем тестирование производительности в качестве примера, чтобы увидеть, как выяснить, имеет ли эта функция Struts2.
1. Struts-default.xml
Поскольку многие из основных функций Struts2 реализованы на основе внутренних перехватчиков, нам сначала нужно увидеть, есть ли у него перехватчики, связанные с настройкой производительности. Это требует, чтобы вы проверили файл конфигурации по умолчанию struts-default.xml в 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" /> <interceptor name="debugging" /> <interceptor name="execAndWait"/> <interceptor name="exec"/> <interceptor name="execAndWait"/> <interceptornameinterceptorname="exception"/> <interceptor name="exception"/> <interceptor name="fileUpload"/> <interceptor name="i18n"/> <interceptor name="logger"/> <interceptor name="modelDriven"/> <interceptor name="scopedModelDriven"/> <interceptor name="params"/> <interceptor name="actionMappingParams"/> <interceptor name="prepare"/> <interceptor name="staticParams"/> <interceptor name="scope"/> <interceptor name="servletConfig"/> <interceptor name="timer"/> <interceptor name="timer"/> <interceptor name=" name="token"/> <interceptor name="tokenSession"/> <interceptor name="validation"/> <interceptor name="workflow"/> <interceptor name="store" /> <interceptor name="checkbox" /> <interceptor name="profiling" /> <interceptor name="roles" /> <interceptor name = "annotationworkflow" /> <intemptor name = "multilect" />
У Struts2 есть много перехватчиков, встроенных как сундук с сокровищами. Вы можете видеть, что профилирование, вероятно, является перехватчиком, который удовлетворяет наши потребности. Затем откройте исходный код и узнайте сейчас.
2. Профилирование фактического фактора
org.apache.struts2.interceptor.profilingActivationInterceptor.java
Public Class ProfilingActivationInterceptor ExtendSabStractInterceptor {Private String ProfilingKey = "Профилирование"; частный логический 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 = valce.getInvocationContext (). GetParameters (). Get (profilingKey); if (val! = null) {string sval = (val instanceof string? (String) val: ((String []) val) [0]); Boolean enable = "yes". Equalsignorecase (sval) || "Истинно". EqualsIgnoreCase (SVAL); UtiltimerStack.setactive (enable); vocation.getInvocationContext (). getParameters (). Удалить (профилируется); }} return vlocation.invoke (); }}
Из исходного кода мы видим, что до тех пор, пока параметры HTTP -запроса, отправленные браузером, включают Profiling = true или да, перехватчик производительности включит класс инструментов Timer и распечатайте время выполнения действия.
3. struts.xml
Поскольку перехватчик профилирования не включен в по умолчанию по умолчанию, мы должны сначала добавить его в наш собственный стек перехватчиков.
<package name = "ajax-default" extends = "velocity-default"> <sesult-types> <result-type name = "json"/> </result-types> <Interceptors> <receptor-stacknameinterceptor-stackname = "ajaxInterceptack"> <receptor-refnameinterceptor-re-refname = "deffectecter-stack-ref-ref-refnamenterceptor ="/refcepperceptor-ref-refnameinterceptor = "/refcepperceptor-refnameptor 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
Теперь вы можете изменить параметры вызова AJAX, а затем добавить параметры профилирования, чтобы запустить настройку производительности.
function searchalluser () {jquery.ajax ({type: «post», url: «searchalluser.action», processData: true, dataType: «json ', data: jquery ("#userQueryForm "). serialize () +" & profiling = yes ", успех: function (data) {if (data.Status = alert") {if (data.Status = alert; GenerateTableFromJson («Результат», Data.Resultrows); }
5. Окончательный эффект
Результат печати заключается в следующем. В дополнение к общему времени выполнения, время выполнения метода действия и время рендеринга результатов перечислены отдельно.