Jeditable - Edit In Place Plugin For jQuery,是一款JQuery就地编辑插件。也就是在页面直接点击需要编辑的内容,就会自动变成文本框进行编辑。它的官方网站是http://www.appelsiini.net/projects/jeditable,我们可以下载JS源码,查看示例。 
    示例代码比较简单,但确是PHP编写的,也没有提供出来,所以我们要探索在Java环境下进行数据操作的方式。由于一直使用Struts2作为控制器,所以便探究了在Struts2下使用Jeditable的方法。 
    首先在页面引入JS文件,只有一个。也不大。代码如下:

  1. <script language="javascript" src="js/plugin/jquery_jeditable.js"></script>

在页面中,我们有如下内容: 
 
    代码如下:

  1. <td class="item">姓名</td><td id="realName">Sarin</td>

我们要编辑姓名,就在<td>标签上加注id属性,标识该单元。则在页面中添加如下JS代码,就可以得到编辑框的效果:

  1. $("#realName").editable("${base}/personal/edit.action?time="+new Date().getTime(), {
  2. indicator : "<img src='${base}/images/indicator.gif'>",
  3. submitdata: { _method: "post" },
  4. tooltip : "点击修改...",
  5. style : "inherit"
  6. );

因为是使用Struts2处理请求,那么请求地址就是.action的,这个没有什么多说的。下面简单来说说JS代码,这里用最简单的文本框来做演示,其他效果可以到官网去看例子,都很好使用。 
    indicator是请求处理过程中的显示效果,这里用图片来代替,这个图片也是从官网找到的,或者写一些提示文字,比如”Saving…”。submitdata中我们指定了操作的提交方式,post很好理解了。tooltip中指的是当鼠标移动到编辑区域时的显示文字。style就是编辑时的样式了,这个不是要紧的东西,可以参考文档。这样配置就完成了。下面看看效果: 
 
    点击时就变成可编辑的效果了,这样我们不用再自己去写JS代码,用Jeditable来帮助非常不错。要保存内容,输入完回车即可。 
    下面的问题就是页面和后台通信,保存数据。使用Struts2提供的方法我们可以看到它向后台发送了什么数据。可以使用如下代码:

  1. ActionContext.getContext().getParameters();

打印之后    我们可以看到有id和value两个属性传回,参考jeditable的文档发现id属性就是我们要修改内容的标识符,value属性是我们输入的更新内容。这两个参数名其实是可以修改的。在JS代码中这样写就可以了:

  1. $("#realName").editable("${base}/personal/edit.action?time="+new Date().getTime(), {
  2. indicator : "<img src='${base}/images/indicator.gif'>",
  3. submitdata: { _method: "post" },
  4. id :"realName",
  5. value : "param",
  6. tooltip : "点击修改...",
  7. style : "inherit"
  8. );

这样到后台的属性名就变成realName和param了但是二者的值不变,我们不做改变,还是使用id和value,那么已经确定value就是我们修改的内容,那么id的值是什么呢?就是我们在<td>中设置的id值,当然也可以在<td>中套用div,这个就是看个人设置的样式进行了。知道了这些,我们就可以向Struts提交请求进行处理了。 
    在这里我们使用ActionContext.getContext().getParameters();获得属性是Map类型的,所以抽象出一个工具类来提供从Map中解析出String和Object[]数组的方法,就可以使用jdbcTemplate来进行数据库操作了。抽取如下:

  1. package xx.xxxx.util;
  2. import java.util.*;
  3. public class MapUtil {
  4. /**
  5. * 从Map中获取数据,能自动取得Object数组中第一项
  6. */
  7. public static Object getObjectFromMap(Map map, String key) {
  8. Object value = map.get(key);
  9. if (value != null && (value instanceof Object[])) {
  10. Object[] array = (Object[]) value;
  11. if (array != null && array.length > 0) {
  12. value = array[0];
  13. }
  14. }
  15. return value;
  16. }
  17. /* 获取字符串 */
  18. public static String getStringFromMap(Map map, String key) {
  19. Object value = getObjectFromMap(map, key);
  20. if (value == null)
  21. return null;
  22. if (value instanceof String) {
  23. return (String) value;
  24. }
  25. return value.toString();
  26. }
  27. /* 获取对象数组 */
  28. public static Object[] getObjectArrayFromMap(Map map, String key) {
  29. String[] keys = key.split(",");
  30. Object[] tmp = new Object[keys.length];
  31. for (int i = 0; i < keys.length; i++) {
  32. tmp[i] = getObjectFromMap(map, keys[i].trim());
  33. }
  34. return tmp;
  35. }
  36. }

使用Struts2,先写个XML配置Action,非常简单,如下:

  1. <action name="edit" class="xx.xxxx.action.UserAction"
  2. method="edit">
  3. </action>

在UserAction中我们使用edit()方法来处理,方法如下:

  1. /**
  2. * 个人信息修改(Jeditable实现)
  3. * @author Sarin
  4. */
  5. public String edit() throws Exception {
  6. Map parameters = getParameters();
  7. getServMgr().getUserService().updateUser(parameters, getLoginUserId());
  8. HttpServletResponse response = ServletActionContext.getResponse();
  9. response.setCharacterEncoding("UTF-8");
  10. PrintWriter out = response.getWriter();
  11. out.print(MapUtil.getStringFromMap(parameters, "value"));
  12. return null;
  13. }

因为是异步操作的方法,不需要方法有什么返回,还在当前页面操作,返回值为null就行了。这里为什么用PrintWriter向客户端输出东西呢?很简单,我们在页面输入内容之后,如果没有返回内容,那么编辑区域就会显示默认内容”Click to edit…”,这样交互显然不合适,我们需要将输入的内容返回到页面,所以调用Action之后,必须将输入的值返回,则就需要用Servlet中最原始的方法进行,这样简单。代码很好理解就不多做解释,下面看看Service的方法:

  1. public void updateUser(Map parameters, Integer userId) {
  2. StringBuffer sql = new StringBuffer("update xx_users set ");
  3. Object[] params = MapUtil.getObjectArrayFromMap(parameters, "id,value");
  4. sql.append(params[0]).append("='").append(params[1]).append("'")
  5. .append(" where userId=").append(userId);
  6. jt.update(sql.toString());
  7. }

Service中我们用StringBuffer来构建SQL语句,为了是拼出如下格式的语句:

  1. Update xx_users set ?=? where userId=?

很显然,第一个?来自jeditable传入的id属性,第二个?是value属性,第三个?是从HttpSession中获取的用户ID。 
    执行之后数据就写入数据库了,而且页面也同时更新了。 
    欢迎交流,希望对使用者有用。

 

jQuery插件Jeditable的使用(Struts2处理)的更多相关文章

  1. JQuery插件之Jquery.datatables.js用法及api

    1.DataTables的默认配置 $(document).ready(function() { $('#example').dataTable(); } ); 示例:http://www.guoxk ...

  2. jquery插件库

    jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多javascript高手加入其team. jQuery是继prototype之后又一个优秀的Javascrīpt框架.其经典 ...

  3. jQuery插件之jquery editable plugin--点击编辑文字插件

    jeditable是一个jquery插件,它的优点是可以就地编辑,并且提交到服务器处理,是一个不可多得的就地编辑插件.(注: 就地编辑,也有称即时编辑?一般的流程是这样的,当用户点击网页上的文字时,该 ...

  4. 强烈推荐240多个jQuery插件提供下载

    jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及 的 ...

  5. 240多个jQuery插件

    概述 jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不 ...

  6. 海量jQuery插件

    转自:http://blog.csdn.net/zzq58157383/article/details/6900142 提醒大家在使用的时候注意jQuery包的版本问题,最好是使用相同的版本,因为使用 ...

  7. jquery插件下载地址

    以下是本人收集的jquery插件下载地址: .............版本自行选择. jquery官网:http://jquery.com/ jquery.validate.js 官网下载地址:htt ...

  8. The ultimate jQuery Plugin List(终极jQuery插件列表)

    下面的文章可能出自一位奥地利的作者,  列出很多jQuery的插件.类似的网站:http://jquerylist.com/原文地址: http://www.kollermedia.at/archiv ...

  9. 转 常用JQuery插件整理

    虽然自己也写过插件,但JQuery插件种类的繁多,大多时候,我还是使用别人写好的插件,这些都是我用了同类插件里较为不错的一些,今天就整理一下公开放出来. UI: jquery.HooRay(哈哈,自己 ...

随机推荐

  1. class 类(4)

    要将类实例化,然后通过实例来调用类的方法(函数).在此,把前面经常做的这类事情概括一下: 方法是类内部定义函数,只不过这个函数的第一个参数是self.(可以认为方法是类属性,但不是实例属性) 必须将类 ...

  2. NOTIFYICONDATA结构

    //农机调度项目代码 NOTIFYICONDATA m_notifyData; m_notifyIcon.ChangeIcon(IDI_PAUSE, _T("监控终端server已暂停&qu ...

  3. [置顶] 强制访问控制内核模块Smack

    Smack(Simplified Mandatory Access Control Kernel)是Casey Schaufler[15]于2007年在LSM基础上实现的Linux强制访问控制安全模块 ...

  4. JMeter脚本参数化和断言设置( CSV Data Set Config )

    用Badboy录制了Jmeter的脚本,用Jmeter打开后形成了原始的脚本.但是在实际应用中,为了增强脚本的多样性,就要使脚本参数化.这里我以登录为例,参数化用户账号与用户密码.  图1 :原始脚本 ...

  5. .NET基础拾遗(3)字符串、集合和流2

    二.常用集合和泛型 2.1 int[]是值类型还是引用类型? .NET中无论是存储值类型对象的数组还是存储引用类型的数组,其本身都是引用类型,其内存也都是分配在堆上的.所有的数组类型都继承自Syste ...

  6. oracle 11g 64位安装32位客户端和PL/SQL

    转自:http://www.360doc.com/content/14/0602/10/4903283_382949382.shtml   这个你需要安装一个32位的oracle客户端才能使用plsq ...

  7. VC中遍历目标进程中的模块

    VC中遍历目标进程中的模块 MFC代码win32 也可以用 在下面代码进行修改转换就可以了CString strModule; 可以换成 char* 但是MODULEENTRY32结构中的szModu ...

  8. 17 java 存在的问题(转)

    java的问题: 1.性能:java的内存管理似乎比较自动化,但其实性能不是特别好.尤其是new对象的时候没有节制.在java中,有些对象构造成本很低,有些 很高.特别在UI编程的时候,大多数的UI对 ...

  9. hdu Red and Black

    算法:深搜 题意:就是让你找到一共可以移动多少次,每次只能移到黑色格子上, Problem Description There is a rectangular room, covered with ...

  10. Mysql存储过程分析

    为了搞明白为什么mysql的存储过程是高效的,我们需要理解mysql的执行流程是什么,当输入sql语句之后,mysql会先进行sql语句语法正确性检查,然后再进行编译,然后才执行,最后把结果返回.如下 ...