亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Struts教程-Struts的幾個精細之處

2019-11-18 13:34:16
字體:
來源:轉載
供稿:網友

最近在網上看到一篇N. Alex Rupp寫的“Beyond MVC: A New Look at the Servlet InfrastrUCture”文章,意思大致是說MVC被Struts等框架錯誤地應用到了Servlet架構中。我想只有對Struts有足夠的了解再加上在MVC方面有足夠深的功力,才敢發此言論,不是經常聽人說:最熟悉自己的人是你的敵人。本人功力尚淺,沒有引領風潮的能力,而且生活還得繼續,只能先來熟悉熟悉Struts。

申明: 強烈建議在閱讀本文之前先閱讀一下N. Alex Rupp老兄的文章,假如你贊同他的看法,可能你會覺得研究Struts就沒什么意義了。

說明:本文所講的Struts知識基于Struts 1.1版本,除非非凡說明,本文中的Struts都特指Struts 1.1這個版本。

精細之處一:“利用Token解決重復提交”背后的前提

我們知道,可以利用同步令牌(Token)機制來解決Web應用中重復提交的問題,Struts也給出了一個參考實現。服務器端在處理到達的請求之前,會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較,看是否匹配。在處理完該請求后,且在答復發送給客戶端之前,將會產生一個新的令牌,該令牌除傳給客戶端以外,也會將用戶會話中保存的舊的令牌進行替換。這樣假如用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重復提交的發生。對應于這段描述,你可能會在你的Action子類中有這么一段代碼:

if (isTokenValid(request, true)) {	// your code herereturn mapping.findForward("success");} else {saveToken(request);return mapping.findForward("submitagain");}

其中isTokenValid()和saveToken()都是org.apache.struts.action.Action類中的方法,而具體的Token處理邏輯都在org.apache.struts.util.TokenPRocessor類中。Struts中是根據用戶會話ID和當前系統時間來生成一個唯一(對于每個會話)令牌的,具體實現可以參考TokenProcessor類中的generateToken()方法。

不知道大家有沒有注重到這樣一個問題,因為Struts是將Token保存在session的一個屬性中,也就是說對于每個會話服務器端只保存而且只能保存一個最新Token值。對于這一點,我的同事就提出了疑問:那假如我在同一個會話中打開兩個頁面,那么后提交的那個頁面肯定不能提交成功了。他還給出了一個實際的例子:比如現在需要把兩個客戶A和B的地址都改為某個值,那用戶就可能同時打開兩個頁面,修改A,修改B,提交A,提交B,按照Struts中的處理邏輯,B的修改提交就肯定不能成功,但是這個提交操作對于用戶來說并不存在操作不正確的地方。

在這里,可能有人要問:怎么可能在同一個會話中打開兩個頁面呢?重新打開一個IE瀏覽器不是重新開始了一個會話嗎?不錯,這種情況下是兩個會話,不存在任何問題。但是,你還可以通過菜單“文件”-“新建”-“窗口”(或者快捷鍵Ctrl+N)來復制當前窗口,這個時候你會發現該頁面與原有頁面同處在一個會話當中。其實,能夠發現這個問題得歸功于我的那位同事對IE習慣性的操作方法。

這下我的那位同事不滿足啦,他于是開始動手修改Struts中的實現方式,讓每個頁面(至少某類頁面)在服務器端都保存有一個唯一的Token值。這樣,前面所講的客戶A,B同時修改的限制就不存在了。但是不久,我的那位同事就開始意識到他正在走向一條危險的道路。首先,假如每個頁面都在服務器端保存一個Token值,則服務器端保存的數據量將越來越大。而且,假如考慮這種同一個會話中打開多個頁面的情況的話,就似乎打開了潘多拉魔盒,將會給自己帶來無窮無盡的麻煩。比如,首先打開頁面P1,然后利用Ctrl+N得到頁面P2,P1提交,P2提交,目前為止一切正常。但是假如此時,在P1,P2中點擊“后退”按鈕,然后再提交P1, P2呢,情況會是怎樣?假如在P2中提交完后執行其它操作,而在P1中回退后提交,情況又是怎么樣呢?假如有P1,P2,P3,那情況又是如何呢?太復雜啦!我想你也會和我們有同感,你需要考慮許多種可能的組合,而且有的時候結果并不是你想象中的那樣簡單。

此路不通,還得回來看看Struts。其實經過以上一番折騰,我們可以發現在Struts中的Token機制背后隱藏著這樣一個前提:不答應你(客戶端)在同一會話中打開多個頁面。注重是同一會話,假如打開兩個IE瀏覽器,那已經是兩個會話啦,不受該限制。其實,這個看似不合理的規定卻自有其道理:一是它極大地簡化了Token的實現,二個這種限定也符合大部分人的使用習慣。

精細之處二:頁面流轉控制中的職責分配

我們知道,Struts的執行過程大致如下:首先,控制器接收到客戶端請求,將這些請求映射至相應的Action,并調用Action的execute方法,這中間可能還涉及到ActionForm的創建和填充。Action的execute方法執行完以后,返回一個ActionForward對象,控制器根據該ActionForward對象將請求轉發至下一個Action或jsp。最后,產生視圖響應客戶。在大的層面上,Struts是采用了MVC這種架構,沒什么非凡之處。但從一些小的地方,我們還是可以看出Craig R. McClanahan老兄的一些考慮。我們看到Action與控制器之間傳遞的是ActionForward對象,由于Action的execute方法要求返回一個ActionForward對象,所以你會經常在Action子類中看到如下語句:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大片在线免费观看| 精品久久久在线观看| 国产综合久久久久| 精品国产999| 亚洲精品色婷婷福利天堂| 久久精品人人做人人爽| 亚洲天堂av在线免费观看| 精品欧美国产一区二区三区| 久久精品91久久久久久再现| 久久黄色av网站| 精品国产一区二区在线| 色琪琪综合男人的天堂aⅴ视频| 欧美另类极品videosbest最新版本| 欧美性视频在线| 日韩高清有码在线| 精品女同一区二区三区在线播放| 欧美国产精品日韩| 91av视频在线| 国产999精品久久久| 久久久久这里只有精品| 伊人精品在线观看| 亚洲国产成人精品电影| 97热在线精品视频在线观看| 精品国内亚洲在观看18黄| 最新国产成人av网站网址麻豆| 成人乱色短篇合集| 国产91在线播放| 一本色道久久综合狠狠躁篇怎么玩| 精品欧美激情精品一区| 成人精品福利视频| 亚洲丁香婷深爱综合| 亚洲黄色免费三级| 亚洲国产高潮在线观看| 久久精品国产久精国产思思| 日韩在线精品视频| 欧美成人激情在线| 国产精品久久电影观看| 亚洲久久久久久久久久| 日韩视频亚洲视频| 国产精彩精品视频| 亚洲激情在线观看| 国产精品视频一区二区高潮| 久久精品一区中文字幕| 亚洲社区在线观看| 欧美精品久久久久久久久久| 国产福利精品av综合导导航| www.欧美三级电影.com| 日韩最新免费不卡| 久久精品视频va| 亚洲国产精品网站| 97超视频免费观看| 在线播放亚洲激情| 97视频免费看| 青青a在线精品免费观看| 国产日韩在线看| 国产精品视频一区国模私拍| 亚洲美女性视频| 久久99国产综合精品女同| 久久精品成人一区二区三区| 欧美色另类天堂2015| 国产成人精彩在线视频九色| 亚洲www视频| 浅井舞香一区二区| 日本久久久久亚洲中字幕| 日日狠狠久久偷偷四色综合免费| 中文字幕国产精品| 久久精品夜夜夜夜夜久久| 国产精品精品久久久久久| 国产精品白丝jk喷水视频一区| 国产日韩欧美日韩| 米奇精品一区二区三区在线观看| 黑人巨大精品欧美一区二区| 欧亚精品在线观看| 亚洲香蕉伊综合在人在线视看| 在线色欧美三级视频| 欧美亚洲在线播放| 久久久亚洲精品视频| 国产精品精品视频一区二区三区| 欧美性猛交xxxx黑人猛交| 久久久久国产精品免费网站| 国产精品av电影| 国产精品美女www爽爽爽视频| 伊人久久免费视频| 懂色av中文一区二区三区天美| 中文字幕日韩综合av| 欧美高清视频在线播放| 视频在线一区二区| 国产成人综合av| 国产日韩精品综合网站| 欧美日韩视频在线| 国产精品三级在线| 国产一区二区美女视频| 亚洲美女在线看| 九九久久综合网站| 久久久久国产精品免费网站| 国产精品美女无圣光视频| 国模吧一区二区| 久久久午夜视频| 日本精品久久中文字幕佐佐木| 久久99国产精品久久久久久久久| 欧日韩在线观看| 日韩第一页在线| 欧美高清性猛交| 超碰97人人做人人爱少妇| 日韩久久午夜影院| 国产成人福利夜色影视| 久久人人看视频| 国内自拍欧美激情| xxav国产精品美女主播| 日韩视频免费大全中文字幕| 国产精品www网站| 国模私拍视频一区| 久久精品一本久久99精品| 啊v视频在线一区二区三区| 日韩美女视频在线观看| 亚洲性夜色噜噜噜7777| 国内外成人免费激情在线视频| 日韩a**中文字幕| 中文字幕日韩有码| 日韩中文字幕视频在线| 色悠久久久久综合先锋影音下载| 欧美日韩国产精品| 色在人av网站天堂精品| 亚洲综合国产精品| 日韩美女福利视频| 国产精品免费看久久久香蕉| 国产精品91视频| 日韩国产高清污视频在线观看| 日韩美女免费观看| 久久久久在线观看| 日韩欧美国产一区二区| 一本大道亚洲视频| 色偷偷88888欧美精品久久久| 久久精品视频va| 5278欧美一区二区三区| 日韩在线视频网站| 欧美日韩性视频在线| 成人国产精品日本在线| 青青草国产精品一区二区| 国产精品久久久久久久久免费看| 精品亚洲一区二区| 2020国产精品视频| 成人午夜小视频| 中国china体内裑精亚洲片| 欧美激情一二区| 久久人人爽亚洲精品天堂| 亚洲国产小视频| 欧美夫妻性生活xx| 亚洲日本中文字幕| 欧美成人免费网| 欧美日本在线视频中文字字幕| 日本一区二区三区四区视频| 日韩精品欧美激情| 欧美成年人视频网站| 国产中文字幕亚洲| 国产精品久久婷婷六月丁香| 欧美成人国产va精品日本一级| 久久久久国色av免费观看性色| 尤物九九久久国产精品的特点| 日韩国产高清视频在线| 一区二区三区视频免费在线观看| 欧美中文字幕在线播放| 51ⅴ精品国产91久久久久久| 精品欧美激情精品一区|