JavaWeb使用ajax实现定时自动保存草稿功能

2023-10-26

在Web程序开发中,难免有时候会遇到一些定时业务,如考试系统中的自动提交试卷、还有平时写博客时定时自动保存草稿的功能。在JavaWeb中也可以利用ajax技术来实现这定时自动保存草稿这一功能。

index.jsp关键代码

html代码

<body onLoad="selectBlog()" >!--  加载时调用查询所有草稿方法-->

<table width="900" height="200" border="0" align="center"  cellpadding="0" style="background-repeat:no-repeat" background="images/top.png">

</table>

<table width="900" border="0" align="center" cellspacing="0">

  <tr><td width="194" align="center" valign="top"  background="#FFFFFF"><p>草稿箱</p>   

<div id="draftBox"></div></td>   <!—用于草稿列表 -->

   <td align="center" valign="top" background="#FFFFFF"><p>添加文章</p>

     <form name=" myform" method="post" action="">

     <table width="90%" height="350" border="0" cellspacing="0">

       <tr> <td height="20" colspan="2" align="center" id="tip">&nbsp;</td>

          </tr>   <tr>

       <td  align="right" height="34">标题: &nbsp;</td>

        <td width="84%" align="left">

          <input name="title" id="title" type="text" size="57">  </td></tr>

        <tr>  <td align="right" height="250">内容:&nbsp;</td>

          <td>  <textarea name="content" cols="55" rows="17" id="content"></textarea></td></tr>

        <tr>   <td>&nbsp;</td>

   <td align="center">

 <input name="Submit" type="submit" class="btn_grey" value="保存">&nbsp;&nbsp;

       <input name="Submit2" type="reset" class="btn_grey" value="重置"></td>

        </tr></table>

     </form>    </td>

  </tr>

</table>

</body>

js关键代码  篇幅有限所以就不贴出构建XMLHttpRequest对象以及请求方法的代码了,注意创建XMLHttpRequest对象时,应该考虑到浏览器的兼容性。不同的浏览器下创建XMLHttpRequest对象是不同的,大多数浏览器都支持 var xmlHttp = new XMLHttpRequest()这种写法,但IE6.0以下的浏览器创建XMLHttpRequest对象时写法有所不同,可以使用if来判断,也可以利用try catch语句来创建XMLHttpRequest对象以解决浏览器兼容性的问题 ,以此尽量兼容大部分浏览器。

<script language="javascript">

   //省略了对构造XMLHttpRequest对象并发送请求的代码……

var saveReq = false;

function autoSave(){//自动保存草稿

    var title=document.getElementById("title").value;

    var content=document.getElementById("content").value;

    if(title!=""&&content!="") {      //当文章标题及内容不为空时

        var param = "title="+title+"&content="+content;//拼接参数

        //调用Ajax请求方法

        saveReq = httpRequest("post","<c:url value='/BlogServlet?type=autoSave'></c:url>",true,cbf_save,param);

    } }

//提示信息 回调函数

function cbf_save(){

    if(saveReq.readyState == 4){ //双重判断 当服务器响应结束时

if(saveReq.status == 200){ ///当服务器响应的状态码为200(即响应成功)

//把提示信息显示出来

  document.getElementById("tip").innerHTML = saveReq.responseText;

        }}

}

var selectReq = false;

function selectBlog(){//查询所有的草稿

        var param = "nocache="+new Date().getTime();

        selectReq = httpRequest("get","drafts.jsp",true,cbf_select,param);

}

function cbf_select(){//回调函数

    if(selectReq.readyState == 4){

        if(selectReq.status == 200){

            document.getElementById("draftBox").innerHTML = selectReq.responseText;

        }}

}

var delay=1000*10*60;      //定义延迟时间,1分钟

//使用JavaScriptwindow对象的setInterval方法执行指定函数

timer=window.setInterval(autoSave,delay); //每间隔1分钟调用autoSave方法

timer=window.setInterval(selectBlog,delay);//每间隔1分钟调用selectBlog方法

</script>

 

从上面代码可以看出利用ajax实现无刷新操作实现自动保存草稿功能。首先创建XMLHttpRequest对象并编写发送请求的方法,然后autoSave()方法调用ajax请求方法保存文章页面的信息,selectBlog()方法调用请求方法从数据库查询草稿信息并生成table(草稿列表),并编写回调函数将结果输出在页面上。而使用JavaScript的Window对象的setInterval()方法实现每间距一定的时间就调用一次指定函数,这样就可以实现定时自动保存草稿的功能了。

drafts.jsp主要代码(作用:生成草稿列表)

调用数据层的查询方法(这里为了方便,所以直接在java脚本调用方法,其实这样并不规范),返回List,遍历List动态生成table(用于显示草稿箱),

<!-- selectAllblog -->

<%List<Blog> list = ArticleDao.getInstance().selectAllblog(); %>

<!--  //草稿箱列表 -->

<table width="96%" border="0" cellspacing="0" cellpadding="0">

    <%

        int i=0;

        for(Blog blog:list){ %>

  <tr>

    <td height="27" align="left" title="<%=blog.getCreateTime()%> 自动保存草稿">

    <input name="hContent" type="hidden" id="hContent<%=i%>" value="<%=blog.getContent()%>">

    <a href="#" onclick="myform.title.value='<%=blog.getTitle()%>';myform.content.value=document.getElementById('hContent<%=i%>').value;"><%=blog.getTitle()%></a>

    </td>

  </tr>

  <%i++;} %>

</table>

Servlet关键代码

自动保存方法()

public static void  autoSave(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");

        response.setCharacterEncoding("UTF-8");

        String title = request.getParameter("title");     //获取文章标题

        String content = request.getParameter("content"); //获取文章内容

        title = URLEncoder.encode(title, "ISO-8859-1");//转换编码,否则乱码

        title = URLDecoder.decode(title, "UTF-8");

        content = URLEncoder.encode(content, "ISO-8859-1");

        content = URLDecoder.decode(content, "UTF-8");

        Blog blog = new Blog();

        blog.setTitle(title);          //保存标题

        blog.setContent(content);      //保存内容

        Calendar c = Calendar.getInstance();//创建一个Calendar

        String time= c.get(c.YEAR)+"-"+c.get(c.MONTH)+"-"+c.get(c.DAY_OF_MONTH)+" "+c.get(c.HOUR_OF_DAY)+":"+c.get(c.MINUTE)+":"+c.get(c.SECOND);

        blog.setCreateTime(time);//设置保存时间

         //获取到标题和内容后,(根据标题和内容查询表中是否有相同的,有就返回false)

        boolean res = BlogDao.getInstance().getBlog(blog);

        if(!res){ //如果不存在

          //saveBlog方法是将当前的Blog对象保存到数据库中

        boolean b= BlogDao.getInstance().saveBlog(blog);//调用saveBlog方法

            if(b){

                response.getWriter().print("文章内容已经自动保存到草稿箱!");

            }else {

                response.getWriter().print("文章内容自动保存失败!");

            }

        }

    }

从上面代码可以看出,先设置请求和响应的编码,然后获取传过来的参数,获取到参数后,调用查询方法根据标题和内容判断是否该内容已经存在,如不存在就调用SaveBlog()方法保存,存在就不保存。

结果:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaWeb使用ajax实现定时自动保存草稿功能 的相关文章

  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • iOS开发设置状态栏字体颜色

    状态栏的字体为黑色 UIStatusBarStyleDefault 状态栏的字体为白色 UIStatusBarStyleLightContent 一 在info plist中 将View controller based status ba
  • 蓝桥杯C/C++省赛:剪格子

    目录 题目描述 思路分析 AC代码 题目描述 如图p1 jpg所示 3 x 3 的格子中填写了一些整数 我们沿着图中的红色线剪开 得到两个部分 每个部分的数字和都是60 本题的要求就是请你编程判定 对给定的m x n 的格子中的整数 是否可
  • Tensorflow——端到端车牌识别(数据制作、训练、评估、预测)

    利用周末时间断断续续实现端到端车牌识别项目 具备完整的数据集 数据制作 训练 评估 预测业务 项目特点 采用tensorflow中的keras库 训练时数据生成器data generator 对学习keras API有一些参考意义 项目地址
  • TCP窗口字段理解

    TCP窗口字段理解 转载自 https blog 51cto com shjrouting 1612855 TCP数据传输过程中 序列号增长的单元是包的个数 解释 这是初学者最常犯的一个错误 原因是绝大多数老师为了方便学生理解 刚开始举例子
  • C++14几种计时方法的对比

    1 C 14 版本 程序如下 include
  • Mysql中索引的最左前缀原则图文剖析(全)

    目录 前言 1 定义 2 全索引顺序 3 部分索引顺序 3 1 正序 3 2 乱序 4 模糊索引 5 范围索引 前言 之所以有这个最左前缀索引 归根结底是mysql的数据库结构 B 树 在实际问题中 比如 索引index a b c 有三个
  • 多个空格的正则表达式

    一 借鉴别人 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  • webpack5

    为什么有webpack web1 0阶段 还没有明确前端岗位 主要职责是编写静态页面 用Js来进行表单验证或动画效果 为了在页面上动态填充数据 后面也出现了php jsp这种开发模式 web2 0阶段 伴随ajax的诞生 不止负责展示界面
  • C# this.InvokeRequired

    C 为控件单独开辟了一个线程 当另外一个线程的方法需要修改控件或者调用控件的方法时 需要通过控件的InvokeRequired方法来进行 InvokeRequired
  • tp5如何跨数据库查询

    gt 当然前提是 这两个的数据库都在同一个服务器上才可以的 如果没有在同一个服务器上 gt 解决办法 mysql设置一下权限 a 可以对b进行select的操作权限 tp5使用原生查询 代码如下 admin Db query SELECT
  • orangepi5使用sata ssd启动系统

    使用sata ssd启动香橙派官方的Ubuntu系统 以Orangepi5 1 1 0 ubuntu jammy server linux5 10 110为例 因为烧录系统到外接的ssd需要另一个系统辅助所以我们还要烧录一个带桌面的系统到T
  • 解决 LINK : fatal error LNK1104: 无法打开文件“freeglutd.lib”问题

    最近跑程序 发现总有这样的错误 如下图 开始我以为是缺少了freeglutd lib这个文件 之后才发现压根没有这个文件 于是找到了解决办法 鼠标右键单击项目 选择属性 出现如下图 找到C C 预处理器 点开预处理器定义 点编辑 添加 ND
  • libevent源码学习(0):libevent库安装与简单使用

    目录 1 下载并解压libevent库 2 安装libevent库 3 简单使用libevent库 1 下载并解压libevent库 这里下载的是libevent 2 0 21 stable版本的 使用wget命令如下所示 下载地址可通过h
  • .git文件夹_Git入门细致讲解

    什么是 git 分布式的版本管理与协作系统 安装 Git 下载安装就不详说了 安装之后 右键会出现 Git bush here 在当前文件夹打开 bash 是一个小型的 linux shell 可以在上面进行关于 git 的操作 他自带 m
  • 妙用mov edi,edi和5个nop实现inline hook

    妙用mov edi edi和5个nop实现inline hook 2008年2月22日 分类 其它技术 标签 inline hook nop 这方法MJ很早时就说过了 简单重复下 大家应该发现大部分API的第一条指令都是mov edi ed
  • MySQL 5.7版本简介

    MySQL的优势 MySQL的主要优势如下 1 速度 运行速度快 2 价格 MySQL对多数个人来说是免费的 3 容易使用 与其他大型数据库的设置和管理相比 其复杂程度较低 易于学习 4 可移植性 能够工作在众多不同的系统平台上 例如 Wi
  • MySQL—SQL优化详解(上)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 前言
  • 【vue】npm install -g @vue/cli出现错误

    进行到npm install g vue cli这一步出现错误 操作步骤如下 1 先下载node js 不知道有没有下载 可以在cmd输入 node v 出现版本号则电脑已经有了node js 没有的话去官网下一个 csdn有其他小伙伴给了
  • Spring Boot全后端实现验证码

    验证码通常是利用前端技术实现的 前端的验证码需要先在后端进行保存 再传到前端 再于前端传输的数据对比校验 一些前后端分离项目的工作量大大增加 而如果完全是由后端独立实现的 那么在代码量和复杂程度上就大大降低了 框架 Spring Boot
  • JavaWeb使用ajax实现定时自动保存草稿功能

    在Web程序开发中 难免有时候会遇到一些定时业务 如考试系统中的自动提交试卷 还有平时写博客时定时自动保存草稿的功能 在JavaWeb中也可以利用ajax技术来实现这定时自动保存草稿这一功能 index jsp关键代码 html代码 加载时