最近在做个类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

自己设计的java web消息提示机制的更多相关文章

  1. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

  2. 导入的Java Web项目提示找不到javax.servlet.http.*包

    在网上下载了个Java web项目,导入到eclipse发现以下错误 解决办法: 1.右击项目,进入Configure Build Path 2.在Libraries标签下点击Add Library. ...

  3. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  4. 家庭记账本小程序之框架设计(java web基础版一)

    1.设计主页 main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...

  5. Java Web ClassLoader工作机制

    一.ClassLoader的作用: 1.类加载机制:父优先的等级加载机制 2.类加载过程 3.将Class字节码重新解析成JVM统一要求的对象格式 二.ClassLoader常用方法 1.define ...

  6. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现

    前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题.对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传.于是我就简单做了个图标替代 ...

  7. [转]轻量级 Java Web 框架架构设计

    工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...

  8. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. java web 项目 图书管理系统的设计与实现

     java web 项目 图书管理系统的设计与实现

随机推荐

  1. ios Crash Log 分析汇总

    方法一: 1.xcode 有自带的symbolicatecrash,可以将.crash文件中的16进制地址转换成可读的函数地址. symbolicatecrash位于: /Applications/X ...

  2. Go -- NSQ topic和channel的区别

    topic:一个可供订阅的话题.channel:属于topic的下一级,一个topic可以有多个channel. 举个例子:topic:比做一个广播,如交通广播.打开收音机,你可以换很多频率,如果换到 ...

  3. Python机器学习--聚类

    K-means聚类算法 测试: # -*- coding: utf-8 -*- """ Created on Thu Aug 31 10:59:20 2017 @auth ...

  4. chrome 的onbeforeunload事件没有触发

    onbeforeunload event is not working when user not click inside the body of page 0down votefavorite   ...

  5. fuel 安装openstack

  6. 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement

    本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...

  7. 老大写得一个非常高大上的Makefile,包括非常多语法:

    一个非常高大上的Makefile,包括非常多语法: TARGET = api-login INSTALL_PATH = /huishoubao/cgi include ../../implements ...

  8. javascript Array method总结

    0.创建 Javascript创建数组的基本方式有两种.第一种是使用Array构造函数. var colors = new Array(); var colors = new Array(20); v ...

  9. scala进阶笔记:函数组合器(combinator)

    collection基础参见之前的博文scala快速学习(二). 本文主要是组合器(combinator),因为在实际中发现很有用.主要参考:http://www.importnew.com/3673 ...

  10. TC SRM 582 DIV 2

    Rating又跌了,第二个题,没想好就乱开始乱写了.. 我写乱搞贪心,没过...如果总人数很多judge函数写的不好,DIV2数据很水,直接暴力就行. #include <cstring> ...