1. 程式人生 > >通用Servlet Ajax請求 /do 處理所有請求,反射機制

通用Servlet Ajax請求 /do 處理所有請求,反射機制

//我們來看下通用ajax 對應的js//其中action為系統內對應的Action類,method 對應的是類中的方法,page和id 可以為"",param為傳入引數,//func為回撥函式,p1-p8均為回撥函式傳遞的引數
function callObjectAction(action, method, page, id, param, func, p1, p2, p3, p4, p5, p6, p7, p8) {
if (!Me._id) {
    window.open('index.html','_self');
  } else {
    var sPost = '{"a":"'+action+'","c":"'+method+'","k":"' + page + '","i":"' + id + '","_userid":"'+ Me._id +'"';
    if (param) {
      sPost += ','+param;
    }
    sPost += '}';
//alert("post = " + sPost + "\r\n >>>   " + encrypt(sPost, Me._s).length);
    $.ajax({
      url : PostAction,
      method : 'POST',
      async : false,
      cache : false,
      //timeout : 30000,
      data : {
        a : encrypt(sPost, Me._s),
        b : "",
        c : Me._s
      },
//      beforeSend:function() {
//alert("before send");
//      },
//      complete:function() {
//alert("after success or error");
//      },
      success : function(callBackData) {
        var jsonData = eval("(" + decrypt(callBackData, Me._s) + ");");
        if (jsonData.m) {
          if (jsonData.s == '1') {
            successMessage(jsonData.m);
          } else {
            if (document.getElementById("er-" + page + "." + id)) {
              document.getElementById("er-" + page + "." + id).innerHTML = jsonData.m;
              document.getElementById("er-" + page + "." + id).style.display = "";
            } else {
              errorMessage(jsonData.m);
            }
          }
        }
        if (jsonData.c) {
          eval(jsonData.c);
        }
        if (jsonData.s=='1') {
          if (func) {
            func(jsonData,p1,p2,p3,p4,p5,p6,p7,p8);
          }
        }
      },
      error:function(callBackData) {
alert("error");
      }
    });
  }
};
//對於以上程式碼,PostAction對應你要請求的地址,我們暫時定義為var PostAction = "http://localhost:8080/tom/app/do";//拼接sPost引數,作為json格式傳入後臺,a是加密過的資料,c是當前使用者id//在後臺,我們配置對應的Servlet,我們攔截字尾為/app/do的請求,可以攔截所有app/do請求
	<servlet>
		<servlet-name>AppReceiver</servlet-name>
		<servlet-class>app.servlet.AppServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>AppReceiver</servlet-name>
		<url-pattern>/app/do</url-pattern>
	</servlet-mapping>


//我們這裡AppServlet繼承我們寫好的BaseServlet基類,我們的BaseServlet繼承HttpServlet
      JsonNode node = JsonUtil.getJson(sJson);
      sUser = JsonUtil.getJsonStringValue(node, "_u");
      String sClass = JsonUtil.getJsonStringValue(node, "a");
      String sFunction = JsonUtil.getJsonStringValue(node, "c");
//取出對應的類以及函式
String sIP = getRemoteHost(request);

//獲取遠端ip訪問地址,具體方法函式如下://獲取客戶端地址 

public String getRemoteHost(javax.servlet.http.HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip; }


sReturn = callAction(request, response, sClass, sFunction, sToken, node, sUser);
//上面一句是關鍵地方,傳遞函式以及類,node是封裝後的ip地址//下面是具體執行反射呼叫的過程,非常重要
 //呼叫執行方法
  public String callAction(HttpServletRequest request, HttpServletResponse response, String sClass, String sFunction,
      String sToken, JsonNode node, String sUser) throws Exception {
    String sResult = "";
    Class[] aParams = new Class[4];
    Object[] aValues = new Object[4];
    aParams[0] = HttpServletRequest.class;
    aParams[1] = HttpServletResponse.class;
    aParams[2] = JsonNode.class;
    aParams[3] = String.class;
    aValues[0] = request;
    aValues[1] = response;
    aValues[2] = node;
    aValues[3] = sUser;

    Class aClass = null;
    try {
      aClass = Class.forName(ConfigUtil.App + ".app.action.Action" + sClass);
    } catch (ClassNotFoundException e) {
      aClass = Class.forName("app.action.Action" + sClass);
    }
    sResult = "" + aClass.getMethod(CommonUtil.isNull(sFunction) ? "action" : sFunction, aParams).invoke(null, aValues);
    return sResult;
  }


//我們來分析一下,request和response物件,類名,方法名,token,node傳入引數,sUser當前使用者
//建立一個aParams 的類陣列來儲存類資料,Class.forName("app.action.Action"+sClass),
//class.forName()是運用反射的原理建立物件,平常我們建立物件都是用new方式,class.forName也是一種方式。

//在這裡可以簡單說下5種建立物件的方式,1:使用new關鍵字,呼叫了建構函式,2:使用Class類的newInstance方法,呼叫了建構函式,
//3:使用Constructor類的newInstance方法,4:使用clone方法,沒有呼叫建構函式,5:使用反序列化,沒有呼叫建構函式。
//如,我前臺寫callObjectAction("Config","goodsPutAwayCheck",'',i,sParam,loadTableOption,i,d,c,s,p,t,f);
//即呼叫了app.action.ActionConfig類的goodsPutAwayCheck方法,返回資料在js中已經有處理,就不再細說,完整的公用callObjectAction適用所有請求

相關推薦

通用Servlet Ajax請求 /do 處理所有請求反射機制

//我們來看下通用ajax 對應的js//其中action為系統內對應的Action類,method 對應的是類中的方法,page和id 可以為"",param為傳入引數,//func為回撥函式,p1-p8均為回撥函式傳遞的引數function callObjectActi

Servlet初始化及處理HTTP請求

png cal 共享 servlet配置 用戶訪問 input 端口號 doget 本地 上一篇詳細介紹了與Servlet相關的幾個核心的接口和類,當我們自己寫Servlet類時,一般需要繼承HttpServlet類,實現init()、doGet()、doP

Servlet生命週期和處理Http請求與響應

servlet的生命週期:    1.容器開啟並載入servlet;    2.呼叫init()方法對servlet進行初始化;    3.當請求到來呼叫service()方法處理請求,傳送響應;    4.呼叫destory()方法銷燬servlet; servlet處理Http響應        

Servlet+AJAX實現資料處理顯示

實現功能:在輸入框中輸入字元,用AJAX傳到後臺Servlet處理後加上隨機數,並返回到前臺顯示。 一、寫前臺jsp頁面index.jsp <%@ page language="java"

axios(封裝使用、攔截特定請求、判斷所有請求加載完畢)

做出 page push cover arr 登錄 開發 自動識別 ram 博客地址:https://ainyi.com/71 基於 Promise 的 HTTP 請求客戶端,可同時在瀏覽器和 Node.js 中使用 vue2.0之後,就不再對 vue-resource

Servlet裏面request處理外部POST請求的輸入流的工具類

ace exceptio 輸入流 exception tac append clas blog trac package etcom.servlet; import java.io.BufferedReader; import java.io.IOException;

Ajax中與服務器的通信【發送請求處理響應】

active 狀態碼 代碼 技術 bsp item 出版 ml2 圖書 一、發送請求 Ajax中通過XMLHttpRequest對象發送異步方式的後臺請求時。通常有兩種方式的請求,一種是GET請求,另一種是POST請求。發送請求一般要經過4個步驟分別是: (1)初始化X

Filter過濾器(自動登陸、通用的字符集編碼的過濾【處理不同請求的亂碼問題】、。。。)

XML under amt 有關 filter過濾器 pre 繼承 擴展名 獲取 Filter過濾器:可以過濾(攔截)從客戶端向服務器發送的請求。 過濾器的作用:   進行ip的過濾,臟話敏感詞語的過濾,自動登陸,響應壓縮。。。 過濾器的使用:   1.編寫類實現Filte

ajax 請求前後處理

1. 介紹 通過 jQuery 提供的 ajaxSetup 方法,我們可以攔截頁面上所有的 Ajax 請求響應(包括 $.ajax、$.post、$.get)。這樣我們可以對這些 Ajax 請求響應做統一的處理。 2. 例項 在每個需要攔截的頁面中新增 或者 在頁面引入的js檔案中新增 //

前端接收資料流實現圖片預覽效果--ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求處理二進位制流資料 之最佳實踐

本文為轉載文章 原文連結:https://www.cnblogs.com/cdemo/p/5225848.html 首先要謝謝這位大神的無私貢獻!解決了我的問題也完美表達了我當時的心路歷程 ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 之最佳實踐

使用AJAX傳送POST/GET請求處理返回的結果集

 1.AJAX格式 $.ajax({ //請求方式post /get type:'post', //請求地址 url:'${ctx}/business/userActivateOrder/getOrders', //請求資料型別 dataType:'js

AJAX+Servlet實現客戶端無重新整理請求伺服器實踐

   最近需要做一個在網頁中要不斷檢測伺服器端資料程式,當然最簡單的方法是在html頁面頭部加以下標籤 <META http-equiv=V="REFRESH" content="5;URL=本頁面url">  實現將網頁設成每隔5秒鐘將自身頁面重新整理一次

axios處理http請求對比ajax

在處理http請求方面,已經不推薦使用vue-resource了,而是使用最新的axios,下面做一個簡單的介紹。 安裝 使用node npm install axios 使用cdn <script src="https://unpkg.com/

前端html列表載入更多效果(預設取出所有資料用js控制顯示數量也可以用分頁的形式進行ajax請求這種暫時木有寫)

程式碼說明,頁面是用freemarker寫的,newsModel.list  是所有的資料;  <ul class="affair_list" pagesize="3">  這句是關鍵 <#if type=='news'> &nbs

web 會話超時請求(http請求和ajax非同步請求處理

@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {HttpServletRe

shiro 攔截器實現session過期攔截ajax請求處理

攔截器程式碼: package com.xlqh.outlook.shirofilter; import java.io.IOException; import org.apache.shiro.

springMVC一個Controller處理所有使用者請求的併發問題

有狀態和無狀態的物件基本概念:  有狀態物件(Stateful Bean),就是有例項變數的物件 ,可以儲存資料,是非執行緒安全的。一般是prototype scope。 無狀態物件(Stateless Bean),就是沒有例項變數的物件,不能儲存資料,是不變類,是執行緒安全的。一般是singleton s

SpringMVC中servlet處理http請求原始碼解析

    Spring MVC的核心控制器為Servlet,所有訪問服務端的請求都將由servlet攔截接受,並進行相應處理最終進行返回。下面我們來看看它究竟是怎麼做的。     SpringMVC中的Servl

ajax實戰:(ajax非同步下載檔案)請求二進位制流進行處理

需求 管理後臺需要隨時下載資料報表,資料要實時生成後轉換為excel下載 檔案不大,頁面放置“匯出”按鈕,點選按鈕後彈出儲存檔案對話方塊儲存 說明:第一種方法使用a標籤直接可以滿足大部分人需求,第二種方法純粹是在說實現方法以及更好的操作體驗,不需要(舉一個需

ssm整合shiro後,遇到ajax請求處理

public class RoleAUthorizationFilter extends AuthorizationFilter {        @Override        protected boolean onAccessDenied(ServletRequest request,