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

SSH框架網(wǎng)上商城項(xiàng)目第28戰(zhàn)之使用Ajax技術(shù)局部更新商品數(shù)量和總價(jià)

 更新時(shí)間:2016年06月06日 16:35:34   作者:eson_15  
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第28戰(zhàn)之使用Ajax技術(shù)局部更新商品數(shù)量和總價(jià),感興趣的小伙伴們可以參考一下

之前,把項(xiàng)目部署了一下,玩了玩,今天完善了一下購物車中修改商品數(shù)量就能局部更新相應(yīng)的總價(jià)的功能,大家都知道這得用Ajax實(shí)現(xiàn),我之前也沒學(xué)Ajax,剛好借助這個(gè)小功能,去簡單學(xué)習(xí)一下Ajax的知識(shí)。  

1. 問題的分析

先看一下頁面中的情況:


功能如上,在沒有Ajax之前,一般都是根據(jù)用戶修改的值去找Action,然后返回新的jsp頁面重新加載整個(gè)頁面,完成數(shù)字的更新。但是有了Ajax技術(shù)后,我們可以利用Ajax技術(shù)局部刷新要改變的地方,而不是重新加載整個(gè)頁面。首先看一下上圖對應(yīng)的jsp部分的代碼:

<div class="section_container">
 <!-- 購物車 -->
 <div id="shopping_cart">
  <div class="message success">我的購物車</div>
   <table class="data-table cart-table" cellpadding="0" cellspacing="0">
    <tr>
     <th class="align_center" width="10%">商品編號(hào)</th>
     <th class="align_left" width="35%" colspan="2">商品名稱</th>
     <th class="align_center" width="10%">銷售價(jià)格</th>
     <th class="align_center" width="20%">數(shù)量</th>
     <th class="align_center" width="15%">小計(jì)</th>
     <th class="align_center" width="10%">刪除</th>
    </tr>
    <c:forEach items="${sessionScope.forder.sorders }" var="sorder" varStatus="num">
    <tr lang="${sorder.product.id}">
     <td class="align_center"><a href="#" class="edit">${num.count }</a></td>
     <td width="80px"><img src="${shop}/files/${sorder.product.pic}" width="80" height="80" /></td>
     <td class="align_left"><a class="pr_name" href="#">${sorder.name }</a></td>
     <td class="align_center vline">${sorder.price }</td>
     <td class="align_center vline">
      <!-- 文本框 -->
      <input class="text" style="height: 20px;" value="${sorder.number }" lang="${sorder.number }">  
     </td>
     <td class="align_center vline">${sorder.price*sorder.number }</td>
     <td class="align_center vline"><a href="#" class="remove"></a></td>
    </tr>
    </c:forEach>

   </table>
   <!-- 結(jié)算 -->
   <div class="totals">
    <table id="totals-table">
     <tbody>
      <tr>
       <td width="60%" colspan="1" class="align_left"><strong>小計(jì)</strong></td>
       <td class="align_right" style=""><strong>¥<span
          class="price" id="total">${sessionScope.forder.total}</span>
       </strong></td>
      </tr>
      <tr>
       <td width="60%" colspan="1" class="align_left">運(yùn)費(fèi)</td>
       <td class="align_right" style="">¥<span class="price" id="yunfei">0.00</span></td>
      </tr>
      <tr>
       <td width="60%" colspan="1" class="align_left total"><strong>總計(jì)</strong></td>
       <td class="align_right" style="">¥<span class="total" id="totalAll"><strong>${sessionScope.forder.total}</strong></span>
       </td>
      </tr>
     </tbody>
    </table>
    <div class="action_buttonbar">
     <font><a href="${shop}/user/confirm.jsp">
      <button type="button" title="" class="checkout fr" style="background-color: #f38256;">訂單確認(rèn)</button></a>
     </font>
     <font><a href="#">
      <button type="button" title="" class=" fr">
       <font>清空購物車</font>
      </button>
     </font>
     <a href="${shop}/index.jsp">
      <button type="button" title="" class="continue fr">
       <font>繼續(xù)購物</font>
      </button></a>
     <div style="clear:both"></div>
    </div>
   </div>
  </div>

  看著貌似很多的樣子,其實(shí)功能很簡單,就是從域中拿出相應(yīng)的數(shù)據(jù)顯示出來而已,我們現(xiàn)在要實(shí)現(xiàn)上面描述的功能的話,先來分析一下思路:

首先得注冊一個(gè)事件:即修改了數(shù)量那里的文本框觸發(fā)的事件;
在該事件中,我們拿到用戶輸入的數(shù),判斷輸入的合法性,因?yàn)橐乐褂脩魜y輸入;
如果合法,通過Ajax請求將數(shù)據(jù)發(fā)送到后臺(tái);
后臺(tái)針對新的數(shù)量,調(diào)用相應(yīng)的業(yè)務(wù)邏輯方法得到新的結(jié)果,并將其通過流返回到前臺(tái);
Ajax收到結(jié)果后,再對相應(yīng)位置的數(shù)據(jù)進(jìn)行更新。整個(gè)流程就走完了。
如果非法,則顯示修改前的數(shù)字。不做任何處理

2. Ajax請求的實(shí)現(xiàn)

分析完了流程,接下來我們就著手去實(shí)現(xiàn)了,首先把js部分的代碼貼在這,然后我們根據(jù)上面的流程詳細(xì)分析:

<script type="text/javascript">
 $(function(){
  //1. 注冊事件
  $(".text").change(function(){
  //2. 驗(yàn)證數(shù)據(jù)的有效性
   var number = this.value; //也可以使用$(this).val();
   //isNaN(number)表示若number不是數(shù)字就返回真
   if(!isNaN(number) && parseInt(number)==number && number>0){ 
    //如果合法,同步更新的數(shù)
    $(this).attr("lang", number);
    //找到當(dāng)前標(biāo)簽中第一個(gè)是tr的父節(jié)點(diǎn),然后拿到屬性為lang的值,也就是商品的id
    var pid = $(this).parents("tr:first").attr("lang");
    //發(fā)送Ajax請求,傳輸當(dāng)前的數(shù)量與商品的id,返回修改數(shù)量后的總價(jià)格
    $.post("sorder_updateSorder.action", 
     {number:number, 'product.id':pid},
     function(total){  
      $("#total").html(total); //所有商品小計(jì)
      var yunfei = $("#yunfei").html();
      $("#totalAll").html((total*1 + yunfei*1).toFixed(2));//所有商品小計(jì)和運(yùn)費(fèi)的和
    }, "text");
    //計(jì)算單個(gè)商品的小計(jì),保留兩位小數(shù)
    var price = ($(this).parent().prev().html()*number).toFixed(2);
    $(this).parent().next().html(price);
   } else {
    //如果非法,還原為剛剛合法的數(shù)
    this.value = $(this).attr("lang");
   }
  })
 })
</script>

2.1 注冊事件

  我們看上面的代碼可知,注冊事件首先要定位到這個(gè)文本框,這里是通過類選擇器來定位的,因?yàn)槭俏谋究?,所以用change()來注冊該事件,然后在里面定義一個(gè)function()函數(shù)來處理該事件。

2.2 判斷數(shù)據(jù)合法性

  好了,注冊好了事件后,我們首先要對用戶輸入的數(shù)進(jìn)行合法性判斷,因?yàn)橛脩艨赡茌斎肓?或者負(fù)數(shù),可能輸入了小數(shù),甚至輸入了字母或其他字符等等。所以要進(jìn)行驗(yàn)證。isNaN(number)表示若number不是數(shù)字就返回真,我們可以用這個(gè)函數(shù)來判斷是否為數(shù)字;parseInt(number)表示對數(shù)組進(jìn)行取整,然后跟它自身進(jìn)行比較,我們巧妙的運(yùn)用了這個(gè)來判斷number是否為整數(shù)。

2.3 發(fā)送Ajax請求

  如果數(shù)據(jù)是合法的,我們獲取該數(shù)據(jù)后,就可以向后臺(tái)發(fā)送Ajax請求了,我們需要考慮一個(gè)問題:需要傳哪些參數(shù)呢?首先用戶想要更新數(shù)量,毫無疑問,用戶輸入的數(shù)字肯定要傳過去,其次到底傳哪個(gè)商品呢?也就是說我們需要獲取用戶想要修改的商品的id號(hào),知道了要傳的參數(shù)后,我們想辦法獲取id號(hào)即可。
  這里有一個(gè)問題,用戶的購物車?yán)锟赡懿恢挂患唐罚茏匀坏臅?huì)想到,如果能用一條語句可以拿到不同商品的id,就非常好了,因此,想到了可以使用該文本框的父標(biāo)簽,因?yàn)椴煌纳唐匪母笜?biāo)簽都一樣,都是第一個(gè)<tr>標(biāo)簽,所以我們把商品的id放在那個(gè)<tr>標(biāo)簽中的lang屬性里,為什么要放在lang屬性里呢?因?yàn)閘ang屬性基本不會(huì)用到,它是用來定義語言的,而且用lang屬性還不容易和其他屬性沖突~這樣我們就可以通過$(this).parents("tr:first").attr("lang");來獲取商品的id了。
  接下來開始發(fā)送Ajax請求,使用post方式發(fā)送,post方法中有四個(gè)參數(shù):

第一個(gè)參數(shù)是要發(fā)送到的Action
第二個(gè)參數(shù)是要傳過去的參數(shù),使用的是json格式
第三個(gè)參數(shù)是一個(gè)function(result),result是用來接收后臺(tái)穿過來的數(shù)據(jù)
第四個(gè)方式是規(guī)定接收什么類型的數(shù)據(jù),json表示接收json數(shù)據(jù),text表示接收流

  從后臺(tái)返回的total是所有商品的總價(jià)格,所以在function中,首先我們根據(jù)id拿到所有商品小計(jì)的元素然后賦值為total即可,totalAll是加了運(yùn)費(fèi)的總價(jià),后面那個(gè)toFixes(2)表示保留兩位小數(shù)。然后再拿到單個(gè)商品小計(jì)的元素,計(jì)算一下單個(gè)商品的小計(jì),這樣前臺(tái)頁面在沒有重新載入的情況下,更新了我們想要更新的部分,這就是Ajax強(qiáng)大的地方,這個(gè)和前面EasyUI一樣的,EasyUI也是Ajax請求。
   好了,關(guān)于Ajax部分到這里就介紹完了,下面是后臺(tái)的處理剛剛的請求,是針對自己這個(gè)項(xiàng)目的,用來記錄項(xiàng)目進(jìn)度用的。

3. 后臺(tái)的更新

  剛剛Ajax請求的action是SortedAction中的updateSorder()方法,所以我們?nèi)orderAction中完成updateSorder()方法:

@Controller
@Scope("prototype")
public class SorderAction extends BaseAction<Sorder> {
 public String addSorder() {

 //省略無關(guān)的代碼……

 //根據(jù)商品編號(hào)更新商品數(shù)量
 public String updateSorder() {
  Forder forder = (Forder) session.get("forder");
  //更新購物項(xiàng),傳進(jìn)來的product.id被封裝到了model中
  forder = sorderService.updateSorder(model, forder);
  //計(jì)算新的總價(jià)格
  forder.setTotal(forderService.cluTotal(forder));
  session.put("forder", forder);
  //以流的形式返回新的總價(jià)格
  inputStream = new ByteArrayInputStream(forder.getTotal().toString().getBytes());
  return "stream";
 }
}

相應(yīng)的Service中的方法完善如下:

//SorderService接口
public interface SorderService extends BaseService<Sorder> {
 //省去無關(guān)的代碼……
 //根據(jù)商品id和數(shù)量更新商品數(shù)量
 public Forder updateSorder(Sorder sorder, Forder forder);
}

//SorderServiceImpl實(shí)現(xiàn)類
@Service("sorderService")
public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements
  SorderService {

 //省略無關(guān)的代碼……

 @Override
 public Forder updateSorder(Sorder sorder, Forder forder) {
  for(Sorder temp : forder.getSorders()) {
   if(temp.getProduct().getId().equals(sorder.getProduct().getId())) {
    temp.setNumber(sorder.getNumber());
   }
  }
  return forder;
 }
}

最后struts.xml文件中的配置,是把”stream”配在了<global-result>里面,如下

<global-results>
  <!-- 省去其他公共配置 -->
  <result name="stream" type="stream">
   <param name="inputName">inputStream</param>
  </result>
</global-results>

好了,現(xiàn)在Action中計(jì)算出的總價(jià)格就可以通過流的形式傳到前臺(tái)了,Ajax就可以在它的function中接收到,放到total中了,跟前面的就接上了。

原文鏈接: http://blog.csdn.net/eson_15/article/details/51487323

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Idea Project文件目錄不見了,只剩External Libraries和imi文件的解決

    Idea Project文件目錄不見了,只剩External Libraries和imi文件的解決

    這篇文章主要介紹了Idea Project文件目錄不見了,只剩External Libraries和imi文件的解決方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • JVM:早期(編譯期)優(yōu)化的深入理解

    JVM:早期(編譯期)優(yōu)化的深入理解

    今天小編就為大家分享一篇關(guān)于JVM:早期(編譯期)優(yōu)化的深入理解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 關(guān)于SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過濾器的問題

    關(guān)于SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過濾器的問題

    這篇文章主要介紹了SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過濾器的問題,需要在配置文件中,添加JWT需要的密匙,過期時(shí)間和緩存過期時(shí)間,具體實(shí)例代碼參考下本文
    2021-09-09
  • 大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機(jī)號(hào)碼脫敏)

    大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機(jī)號(hào)碼脫敏)

    這篇文章主要介紹了大數(shù)據(jù) java hive udf函數(shù)(手機(jī)號(hào)碼脫敏),的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Mybatis緩存機(jī)制詳解與實(shí)例分析

    Mybatis緩存機(jī)制詳解與實(shí)例分析

    Mybatis的緩存分為一級(jí)緩存和二級(jí)緩存,一級(jí)緩存是SqlSession級(jí)別的而二級(jí)緩存是mapper級(jí)別的,本文詳細(xì)的介紹了Mybatis緩存機(jī)制與實(shí)例分析,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • Java dom4j創(chuàng)建解析xml文檔過程解析

    Java dom4j創(chuàng)建解析xml文檔過程解析

    這篇文章主要介紹了Java dom4j創(chuàng)建解析xml文檔過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java.lang.NullPointerException異常問題解決方案

    java.lang.NullPointerException異常問題解決方案

    這篇文章主要介紹了java.lang.NullPointerException異常問題解決方案,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 使用spring連接及操作mongodb3.0實(shí)例

    使用spring連接及操作mongodb3.0實(shí)例

    這篇文章主要介紹了使用spring連接及操作mongodb3.0實(shí)例,詳細(xì)的介紹了使用spring的情況下,在java中簡單操作mongodb。有興趣的可以了解一下。
    2016-12-12
  • Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法

    Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法

    這篇文章主要介紹了Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java.lang.NullPointerException的錯(cuò)誤解決

    Java.lang.NullPointerException的錯(cuò)誤解決

    Java中NullPointerException是一種常見的運(yùn)行時(shí)異常,通常發(fā)生在嘗試調(diào)用null對象的方法或訪問其屬性時(shí),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09

最新評(píng)論

潢川县| 滦南县| 凉山| 肥城市| 昭通市| 三明市| 昌邑市| 黄平县| 兴安县| 宁乡县| 柘荣县| 五台县| 屏边| 安宁市| 黑水县| 兴文县| 方城县| 安庆市| 体育| 梧州市| 营口市| 昆明市| 宁都县| 阿勒泰市| 镇远县| 铜陵市| 宝鸡市| 雅安市| 鄂托克前旗| 陵水| 博爱县| 玉门市| 蒙山县| 同心县| 庐江县| 石柱| 濮阳县| 普兰县| 邯郸县| 沭阳县| 宜黄县|