最近在做個類CMS的一個系統,前端展示都OK了,在做后台管理,就是對數據庫的增刪改查。使用SSH實現功能倒也蠻簡單的,只是為了人性化的設計,需要做一些提示機制,比如用戶刪除了一條數據給個刪除成功的提示,添加或者修改一條記錄同樣給個提示,或者不成功給個原因的彈窗,我所謂的消息就是指這些消息。比如進行一個數據列表管理,增刪改成功后都會回到列表,這時最有得有個操作結果的提示啊。
由於是一個人在寫后台,為了節省工作量(避免寫那些顯示錯誤提示的樣式~),我決定全部用js的alert來做這件事,當然用戶體驗可能稍差,但對於一個后台就沒那么多要求啦。在后台管理中,一般是用post請求來進行操作,而post請求是要請求到后台的,前台又需要用到js來展示,這就意味着需要把后台處理請求后的數據再傳到前台來。web開發經驗不多的我想到了兩種思路,一是把post請求全部寫成ajax,在跳轉頁面前顯示彈窗,二是把消息存到session里,當跳轉頁面后顯示彈窗。第一種思路會大大增加工作量,並且我們都知道js極不方便調試,所以我果斷舍棄了那種做法。
使用session的辦法來實現,在post請求處理頁面前,將要顯示的message放到session里面,然后再跳轉頁面。后台存放message的方法多樣,根據不同的框架有不同的代碼,只要定義一個session變量即可,類似於session.setAttribute("message",message),對於前端頁面,我寫了個messag.jsp的頁面,在所有前端jsp頁面的底部include了這個頁面,在底部include是想讓頁面載入完后在彈窗,就不會出現一個空白頁面彈窗了,這樣感覺體驗要好一點。如果你是拆分了header foot等頁面就更好了,只需要在foot頁面潛入message.jsp頁面即可。message.jsp代碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% if(session.getAttribute("message")!=null&&session.getAttribute("message").toString().trim().length()>0){ out.print("<script>alert('"+session.getAttribute("message").toString().trim()+"');</script>"); session.setAttribute("message",null); } %>
這樣一來一旦有message需要顯示,前端就會多出一段js代碼來,並且執行完后會把session里的這個變量清空。功能實現了,卻出現了一個問題,就是因為這是在文件里寫了段js代碼來彈窗,而判斷是在jsp的java代碼里寫的,這意味着,彈窗后,點擊到別的頁面,然后通過history.go(-1)或者瀏覽器的back按鈕返回到這個頁面時,還是會繼續彈窗,因為歷史記錄里的有那段js的彈窗代碼!不過我馬上想到了解決方案,就是在輸出的js代碼里加一句history.go(0),就是刷新當前頁面,刷新之后就沒有那段js代碼了,再返回也沒事了。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% if(session.getAttribute("message")!=null&&session.getAttribute("message").toString().trim().length()>0){ //use history.go(0) to refresh ,avoid to show the message again out.print("<script>alert('"+session.getAttribute("message").toString().trim()+"');history.go(0)</script>"); session.setAttribute("message",null); } %>
測試了一下,果然沒問題了,但過了一陣子,又發現了新的問題,那就是如果post失敗的話,還停留在當前頁面的話,由於刷新問題,會一直post,然后就一直彈窗!
好吧,這個方法貌似有問題了,但是問題是用來解決的,問題的原因是因為后台判斷是否輸出js,導致了不同步,即只要執行了js,不管后台到底有沒有message,都會彈窗。分析了就可以找到方案了,那就是js執行時要判斷后台需不需要顯示message,這樣就沒問題了。但是js又沒法直接操作session(一個前台,一個后台。。),所以需要與后台通信,又要不引起注意的通信,那就只有ajax了,不過這個ajax可能是最簡單的ajax了,沒准還可以不用ajax呢,求大神指教。。 后台ajax代碼,使用的struts2的action
public class MessageAction extends BaseAction { public String execute(){ String message=""; if(getSession().get("message")!=null){ message=getSession().get("message").toString(); getSession().put("message", null); } getResponse().setContentType("text/html;charset=utf-8"); PrintWriter out; try { out = getResponse().getWriter(); out.write(JsonUtil.string2json(message)); out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
前端message.jsp代碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <script type="text/javascript"> $(document).ready(function(){ $.post("admin/message.action",//這個需要改成自己的action地址 { }, function(data,status){ if(data!=null&&data.length>0){ alert(data); } }); }); </script>
解決問題,覺得這個過程還蠻有意思的,經過自己思考解決問題還是蠻有成就感的O(∩_∩)O