自己设计的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 项目 图书管理系统的设计与实现
随机推荐
- Limitations of Forms Personalization (文档 ID 420518.1)
In this Document Purpose Scope Details Diagnostics & Utilities Community: References A ...
- Go -- 并发编程的两种限速方法
引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...
- HDU 1040 As Easy As A+B [补]
今天去老校区找她,不想带电脑了,所以没时间A题了 /*******************************************************************/ As Ea ...
- 常用shell命令的写法
这并不是教人怎么进行shell编程的文章,只是韦哥在工作中用到的一些简单脚本的写法.因为有些命令即使用过几次了,再次使用时仍然写不对,需要man来看下或者需要google,你也可以理解为对命令的理解不 ...
- 百度ai 基于node 语音识别 音频文件类型转换
百度ai 基于node 语音识别 音频文件类型转换 项目简介 源代码移步:https://github.com/xuess/ai-baidu-node 本项目主要功能为,本地音频语音识别和文件类型转换 ...
- VUE 之 组件
组件是为了解决页面布局的. 什么是单页面? 答:整个页面的切换都是在这个页面上进行变化的,没有页面的刷新. 1.全局组件 1.1全局组件流程: 1.创建全局组件======>创建一个Vue ...
- quilt
1 什么是quilt quilt是一个patch管理工具,特别适合于对多个patch进行管理. quilt是基于gnu patch和diff的. 2 使用quilt创建一个patch 第一步,quil ...
- hadoop 集群搭建 配置 spark yarn 对效率的提升永无止境
[手动验证:任意2个节点间是否实现 双向 ssh免密登录] 弄懂通信原理和集群的容错性 任意2个节点间实现双向 ssh免密登录,默认在~目录下 [实现上步后,在其中任一节点安装\配置hadoop后,可 ...
- sqlldr trailing nullcols
由于要导入到tmp_content表的一些列(列:要导入的源文件txt or csv文件)为空,也,按理讲我当时另存为(在windows处理)csv,以,分隔.就是这个列没有内容,也该显示, ,之类的 ...
- C# partial分部类和分部方法
1.https://www.cnblogs.com/xcsn/p/7533238.html 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法 ...