jquery+ajax+struts2

来源:http://www.cnblogs.com/pdzbokey/archive/2016/12/09/6118155.html
-Advertisement-
Play Games

AJAX 是與伺服器交換數據的藝術,它在不重載全部頁面的情況下,實現了對部分網頁的更新。編寫常規的 AJAX 代碼並不容易,因為不同的瀏覽器對 AJAX 的實現並不相同。這意味著您必須編寫額外的代碼對瀏覽器進行測試。不過,jQuery 團隊為我們解決了這個難題,我們只需要一行簡單的代碼,就可以實現 ...


AJAX 是與伺服器交換數據的藝術,它在不重載全部頁面的情況下,實現了對部分網頁的更新。
編寫常規的 AJAX 代碼並不容易,因為不同的瀏覽器對 AJAX 的實現並不相同。
這意味著您必須編寫額外的代碼對瀏覽器進行測試。不過,jQuery 團隊為我們解決了這個難題,我們只需要一行簡單的代碼,就可以實現 AJAX 功能。

現在來看一下3個常用的ajax方法
$(selector).load(URL,data,callback);
必需的 URL 參數規定您希望載入的 URL。
可選的 data 參數規定與請求一同發送的查詢字元串鍵/值對集合。是一個json格式的數據。
可選的 callback 參數是 load() 方法完成後所執行的函數名稱。
看一個獲取服務端時間的例子
jsp:

  <script type="text/javascript" src="${basePath }/js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $(":button").click(function(){
                var url = "${basePath}/timeServlet";
                //最簡單的ajax, 預設以get方式提交, 返回值自動填充到標簽中
                $("#time").load(url);
            });
        });
    </script>
  </head>
  <body>
    當前時間<span id="time"></span><br>
    <input type="button" value="獲取時間">
  </body>

頁面是這樣的:

 

其中basePath是這樣的:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
pageContext.setAttribute("basePath", path);
%>

servlet:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
        String formatTime = sdf.format(new Date());
        PrintWriter pw = response.getWriter();
        pw.println(formatTime);
        pw.flush();
        pw.close();
    }

這樣就完成了一個最簡單的ajax,如果有第2個參數data,提交方式就是post,否則就是get。
看一下效果,點擊獲取時間就可以獲取到服務端的時間:

 

後2個參數怎麼使用,別急,下麵在$.post中講解
定義和用法
post() 方法通過 HTTP POST 請求從伺服器載入數據。

語法
jQuery.post(url,data,success(data, textStatus, jqXHR),dataType)

參數 描述
url 必需。規定把請求發送到哪個 URL。
data
可選。映射或字元串值。規定連同請求發送到伺服器的數據。
success(data, textStatus, jqXHR)   可選。請求成功時執行的回調函數。
dataType 可選。規定預期的伺服器響應的數據類型。預設執行智能判斷(xml、json、script 或 html)。

 

 

 

 

看一個判斷登錄的例子來瞭解它的用法,這個例子通過驗證登錄然後返回一個圖片的路徑,如果輸入正確,如果輸入正確,則圖片顯示一個對號,否則顯示一個叉:

jsp:

    <script type="text/javascript">
        $(function(){
            $(":button").click(function(){
                var url = "${basePath}/userServlet"; //先用servlet來做
                //var url = "${basePath}/user_login.action"; //然後用struts2來做
                var username = $(":text").val();
                var password = $(":password").val();
                var data_servlet = {"username" : username, "password" : password};
                var data_struts2 = {"user.username" : username, "user.password" : password};
                //先測試servlet, 測試struts2的時候將第2個data參數改為data_struts2即可
                $.post(url, data_servlet, function(data, statusTxt, jqXHR){
                    alert("data-=-"+data);
                    alert("data.src-=-="+data.src);
                    alert("statusTxt-=-"+statusTxt);
                    alert("jqXHR.status-=-"+jqXHR.status);    //狀態碼, 如200
                    alert("jqXHR.readyState-=-"+jqXHR.readyState);//請求執行的狀態, 如4
                    alert("jqXHR.statusText-=-"+jqXHR.statusText); //狀態字元串, 如ok
                    alert("jqXHR.responseText-=-"+jqXHR.responseText);//返回的字元串值
                    alert("jqXHR.responseXML-=-"+jqXHR.responseXML);//返回的XML數據
                    $("img").attr("src", '${basePath}'+data);//返回的字元串                    
                    //$("img").attr("src", '${basePath}'+data.src); //返回的是json數據                    
                });
            });
        });
    </script>
  </head>
  <body>
    <form>
        用戶名<input type="text"><br>
        密碼<input type="password"><br>
        <input type="button" value="點我驗證">
        <img>
    </form>        
  </body>

 

頁面是這樣的:

 

先看用servlet做的:

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //從資料庫查詢
        User user = userDao.findByUsernameAndPassword(username, password);
        System.out.println(user);
        PrintWriter pw = response.getWriter();
        if(user != null)
            pw.println("/images/icon/Button_Ok_64px_1070400_easyicon.net.ico");
        else
            pw.println("/images/icon/Button_Delete_64px_1070396_easyicon.net.ico");
        pw.flush();
        pw.close();
    }

看一下效果:
如果輸入正確,顯示如下:


如果輸入錯誤,顯示如下:

通過jqXHR.responseText可以看到返回的是一個字元串,字元串不需要解析。接下來看一下struts2的ajax
先做web.xml中配置struts2的過濾器:

  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>*.action</url-pattern>
  </filter-mapping>

 


struts2配置文件struts.xml,放到src下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.action.extension" value="action" /> <!-- 設置struts訪問尾碼為action -->
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />    <!-- 禁止動態方法訪問 -->
    <package name="user-action" namespace="/" extends="json-default"> <!-- json-default是繼承自struts-default的 -->
        <action name="user_login" class="top.bwcx.ajax.user.UserAction">
            <result type="json" /><!-- 無需跳轉頁面 -->
        </action>
    </package>
</struts>

struts2的ajax需要struts2-json-plugin.jar插件包的支持

這裡是通過c3p0連接資料庫, dbutils操作資料庫的,有關這方面的內容,請參看我以前的隨筆c3p0連接資料庫的3種方式dbutils基本使用

action中的配置:

 

public class UserAction extends ActionSupport {
    //這裡為了簡單, 就直接寫了一個dao, service什麼的沒有寫
    private UserDao userDao = new UserDao();
    //User實體類,用來接收頁面傳過來的值,需要get和set方法, 很重要
    private User user;
    //用get方法返回值, 然後在頁面取的, 這個需要get方法
    private String src;
    
    @Override
    public String execute() throws Exception {
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        user = userDao.findByUsernameAndPassword(user.getUsername(), user.getPassword());
        System.out.println(user);
        if(user == null){
            src = "/images/icon/Button_Delete_64px_1070396_easyicon.net.ico";
        }else
            src = "/images/icon/Button_Ok_64px_1070400_easyicon.net.ico";
        return SUCCESS;
    }
public void setUser(User user) { this.user = user; } public User getUser() { return user; } public String getSrc() { return src; } }

ajax請求struts,是在action頁面通過get方法傳遞響應的,此處就是src屬性加上其get方法就能把圖片路徑返回了,返回格式是json串
在頁面接收時,註意把傳遞的參數改為data_struts2,url也改一下,直接像這樣解析json就行了:data.src
效果與剛纔servlet的效果是一樣的,也可以看一下列印的屬性值,如:

其實收集表單項的值還有一種簡單的方法,像這樣
var params = $("form").serialize();
不過這樣需要提供name屬性值

$.get()和$.post()是類似的,接下來看一下$.ajax()
$.ajax()這個參數很多,常用的有這麼幾個:
type: 提交方式,get或post
url: 請求路徑
data: 請求參數
success: 執行成功後所調用的函數


把這個登陸驗證用這個改一下:
jsp改為:

    <form>
        用戶名<input type="text" name="user.username"><br>
        密碼<input type="password" name="user.password"><br>
        <input type="button" value="點我驗證">
        <img>
    </form>  

 

js代碼改為:

    <script type="text/javascript">
        $(function(){
            $(":button").click(function(){
                var params = $("form").serialize();  //直接序列化表單
                $.ajax({
                    type : "post",
                    url : "${basePath}/user_login.action",
                    data : params,
                    success : function(result){
                        $("img").attr("src", '${basePath}'+result.src); //返回的是json數據
                    }
                });
            });
        });
    </script>

 

 其他的不變,這樣也能達到一樣的效果。當然,你也可以在struts2中用response對象響應ajax請求,就像在servlet中一樣。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 此文章是基於 搭建SpringMVC+Spring+Hibernate平臺 一. 準備工作 1. 點擊此找到並下載 commons-digester3-3.2.jar 2. 點擊此找到並下載 commons-beanutils-1.9.3.jar 目前最高版本 3. 將得到的jar包放到工程的 li ...
  • PHP開啟頁面報錯的方法很簡單,在<?php內加入下麵的代碼就可以了: 插入在頁面頂部就可以了。 ...
  • 如果在調用PHP查詢資料庫,在echo後返回的是Resource id #9,可能你的輸出方式是: 按以上方式直接輸出,由於mysql_query($sql)本身返回的就是一個resource,也就是返回的就是Resource id #9,因此在輸出之前,還需要加一個函數: ...
  • 電腦程式的思維邏輯 (1) - 數據和變數 電腦程式的思維邏輯 (2) - 賦值 電腦程式的思維邏輯 (3) - 基本運算 電腦程式的思維邏輯 (4) - 整數的二進位表示與位運算 電腦程式的思維邏輯 (5) - 小數計算為什麼會出錯? 電腦程式的思維邏輯 (6) - 如何從亂碼中恢復 ...
  • 一、異常處理: 1 AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x 2 IOError 輸入/輸出異常;基本上是無法打開文件 3 ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤 4 IndentationError 語法錯誤(的子 ...
  • ...
  • 好久沒寫了,都忘記博客了,趁著現在還在公司,寫的東西是經過驗證的,不是在家憑記憶力寫的,正確率有保障,就說說最近遇到的一件事情吧。 以前一直用的oracle資料庫,這次項目我負責的模塊所在的系統是用的mysql資料庫,結果當初建表時候,欄位什麼的全靠百度,實在是英語不行,然後有個欄位叫usage,是 ...
  • 1、AcceptEx() AcceptEx()用於非同步接收連接,可以取得客戶程式發送的第一塊數據。 [cpp] view plaincopy BOOL AcceptEx( _In_ SOCKET sListenSocket, //監聽套接字句柄 _In_ SOCKET sAcceptSocket, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...