本身設計的java web消息提示機制

  最近在作個類CMS的一個系統,前端展現都OK了,在作後臺管理,就是對數據庫的增刪改查。使用SSH實現功能倒也蠻簡單的,只是爲了人性化的設計,須要作一些提示機制,好比用戶刪除了一條數據給個刪除成功的提示,添加或者修改一條記錄一樣給個提示,或者不成功給個緣由的彈窗,我所謂的消息就是指這些消息。好比進行一個數據列表管理,增刪改爲功後都會回到列表,這時最有得有個操做結果的提示啊。javascript

  因爲是一我的在寫後臺,爲了節省工做量(避免寫那些顯示錯誤提示的樣式~),我決定所有用js的alert來作這件事,固然用戶體驗可能稍差,但對於一個後臺就沒那麼多要求啦。在後臺管理中,通常是用post請求來進行操做,而post請求是要請求到後臺的,前臺又須要用到js來展現,這就意味着須要把後臺處理請求後的數據再傳到前臺來。web開發經驗很少的我想到了兩種思路,一是把post請求所有寫成ajax,在跳轉頁面前顯示彈窗,二是把消息存到session裏,當跳轉頁面後顯示彈窗。第一種思路會大大增長工做量,而且咱們都知道js極不方便調試,因此我果斷捨棄了那種作法。html

  使用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代碼了,再返回也沒事了。java

<%@ 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,而後就一直彈窗!web

  好吧,這個方法貌似有問題了,可是問題是用來解決的,問題的緣由是由於後臺判斷是否輸出js,致使了不一樣步,即只要執行了js,無論後臺到底有沒有message,都會彈窗。分析了就能夠找到方案了,那就是js執行時要判斷後臺需不須要顯示message,這樣就沒問題了。可是js又無法直接操做session(一個前臺,一個後臺。。),因此須要與後臺通訊,又要不引發注意的通訊,那就只有ajax了,不過這個ajax多是最簡單的ajax了,沒準還能夠不用ajax呢,求大神指教。。 後臺ajax代碼,使用的struts2的actionajax

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(∩_∩)Ojson

相關文章
相關標籤/搜索