自己设计的java web消息提示机制
最近在做个类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消息提示机制的更多相关文章
- Java Web(三) 会话机制,Cookie和Session详解(转载)
https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...
- 导入的Java Web项目提示找不到javax.servlet.http.*包
在网上下载了个Java web项目,导入到eclipse发现以下错误 解决办法: 1.右击项目,进入Configure Build Path 2.在Libraries标签下点击Add Library. ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- 家庭记账本小程序之框架设计(java web基础版一)
1.设计主页 main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...
- Java Web ClassLoader工作机制
一.ClassLoader的作用: 1.类加载机制:父优先的等级加载机制 2.类加载过程 3.将Class字节码重新解析成JVM统一要求的对象格式 二.ClassLoader常用方法 1.define ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现
前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题.对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传.于是我就简单做了个图标替代 ...
- [转]轻量级 Java Web 框架架构设计
工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...
- [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- java web 项目 图书管理系统的设计与实现
java web 项目 图书管理系统的设计与实现
随机推荐
- iOS App 项目:会员卡管理系统设计方案
1.需求描写叙述 店主须要管理自己的会员信息和充值卡信息以及消费纪录 店主觉得购买电脑和外设成本太高,并且店面没有地方容纳这些设备 店主希望通过手机来完毕这些功能.但尽量不产生流量.对网络要求较低 店 ...
- Microsoft Dynamics CRM Server 2013软件安装要求
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveV9mMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- freeIPMI README && issue about OpenIPMI kernel driver
http://www.gnu.org/software/freeipmi/README FreeIPMI - Copyright (C) 2003-2013 FreeIPMI Core Team Fr ...
- BIOS维修技术
BIOS是电脑中最基础且最重要的程序,为电脑提供最低级且最直接的硬件控制,电脑的原始操作都是依照固化在BIOS里的程序来完成的.因此如果BIOS出现故障将会导致影响电脑的正常工作.BIOS故障有很多, ...
- HDU 5371 Hotaru's problem(Manacher算法+贪心)
manacher算法详见 http://blog.csdn.net/u014664226/article/details/47428293 题意:给一个序列,让求其最大子序列,这个子序列由三段组成, ...
- 64位CentOs7源码安装mysql-5.6.35过程分享
首先安装依赖包,避免在安装过程中出现问题 [root@bogon liuzhen]# yum -y install gcc gcc-c++[root@bogon liuzhen]# yum -y in ...
- 用NHibernate处理带属性的多对多关系
1.引言 老谭在面试开发者的时候,为了考察他们的数据库开发能力,经常祭出我的法宝,就是大学数据库教程中讲到的一个模式:学生选课.这个模式是这种: 在这个模式中,学生(Student)和课程(Cours ...
- java sleep和wait的区别和联系
Thread.sleep不会改变锁的行为,如果当前线程拥有锁,那么当前线程sleep之后,该锁不会被释放. Thread.sleep和Object.wait都会暂停当前的线程,让出cpu.Thread ...
- Android:在子线程中更新UI的三种方式
①使用Activity中的runOnUiThread(Runnable) ②使用Handler中的post(Runnable) 在创建Handler对象时,必须先通过Context的getMainLo ...
- POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)
Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14021 Accepted: 5484 Specia ...