`
这些年
  • 浏览: 405956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jeditable(转)

    博客分类:
  • js
 
阅读更多

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

Html代码 复制代码 收藏代码
  1. <script language="javascript" src="js/plugin/jquery_jeditable.js"></script>  
<script language="javascript" src="js/plugin/jquery_jeditable.js"></script>


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

    代码如下:

Html代码 复制代码 收藏代码
  1. <td class="item">姓名</td><td id="realName">Sarin</td>  
<td class="item">姓名</td><td id="realName">Sarin</td>


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

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. );  
	$("#realName").editable("${base}/personal/edit.action?time="+new Date().getTime(), {
		indicator : "<img src='${base}/images/indicator.gif'>",
		submitdata: { _method: "post" },
		tooltip : "点击修改...",
		style : "inherit"
});


    因为是使用Struts2处理请求,那么请求地址就是.action的,这个没有什么多说的。下面简单来说说JS代码,这里用最简单的文本框来做演示,其他效果可以到官网去看例子,都很好使用。
    indicator是请求处理过程中的显示效果,这里用图片来代替,这个图片也是从官网找到的,或者写一些提示文字,比如”Saving…”。submitdata中我们指定了操作的提交方式,post很好理解了。tooltip中指的是当鼠标移动到编辑区域时的显示文字。style就是编辑时的样式了,这个不是要紧的东西,可以参考文档。这样配置就完成了。下面看看效果:

    点击时就变成可编辑的效果了,这样我们不用再自己去写JS代码,用Jeditable来帮助非常不错。要保存内容,输入完回车即可。
    下面的问题就是页面和后台通信,保存数据。使用Struts2提供的方法我们可以看到它向后台发送了什么数据。可以使用如下代码:

Java代码 复制代码 收藏代码
  1. ActionContext.getContext().getParameters();  
ActionContext.getContext().getParameters();

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

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").editable("${base}/personal/edit.action?time="+new Date().getTime(), {
		indicator : "<img src='${base}/images/indicator.gif'>",
		submitdata: { _method: "post" },
		id :"realName",
		value : "param",
		tooltip : "点击修改...",
		style : "inherit"
});


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

Java代码 复制代码 收藏代码
  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. }  
package xx.xxxx.util;
import java.util.*;
public class MapUtil {
	/**
	 * 从Map中获取数据,能自动取得Object数组中第一项
	 */
	public static Object getObjectFromMap(Map map, String key) {
		Object value = map.get(key);
		if (value != null && (value instanceof Object[])) {
			Object[] array = (Object[]) value;
			if (array != null && array.length > 0) {
				value = array[0];
			}
		}
		return value;
	}
	/* 获取字符串 */
	public static String getStringFromMap(Map map, String key) {
		Object value = getObjectFromMap(map, key);
		if (value == null)
			return null;
		if (value instanceof String) {
			return (String) value;
		}
		return value.toString();
}
	/* 获取对象数组 */
	public static Object[] getObjectArrayFromMap(Map map, String key) {
		String[] keys = key.split(",");
		Object[] tmp = new Object[keys.length];
		for (int i = 0; i < keys.length; i++) {
			tmp[i] = getObjectFromMap(map, keys[i].trim());
		}
		return tmp;
	}
}


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

Xml代码 复制代码 收藏代码
  1.     <action name="edit" class="xx.xxxx.action.UserAction"  
  2.             method="edit">  
  3. </action>  
	<action name="edit" class="xx.xxxx.action.UserAction"
			method="edit">
</action>


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

Java代码 复制代码 收藏代码
  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. }  
	/**
	 * 个人信息修改(Jeditable实现)
	 * @author Sarin
	 */
	public String edit() throws Exception {
		Map parameters = getParameters();
		getServMgr().getUserService().updateUser(parameters, getLoginUserId());
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		out.print(MapUtil.getStringFromMap(parameters, "value"));
		return null;
	}


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

Java代码 复制代码 收藏代码
  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. }  
	public void updateUser(Map parameters, Integer userId) {
		StringBuffer sql = new StringBuffer("update xx_users set ");
		Object[] params = MapUtil.getObjectArrayFromMap(parameters, "id,value");
	sql.append(params[0]).append("='").append(params[1]).append("'")
				.append(" where userId=").append(userId);
		jt.update(sql.toString());
}


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

Sql代码 复制代码 收藏代码
  1. Update xx_users set ?=? where userId=?  
Update xx_users set ?=? where userId=?


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

  • 大小: 9.2 KB
  • 大小: 5.3 KB
分享到:
评论

相关推荐

    php点击修改jeditable插件

    Jeditable支持多种提交方式,包括`GET`和`POST`,并可以处理各种服务器响应,例如JSON、XML或简单的文本。 **PHP与MySQL数据操作** 在PHP环境中,我们通常使用MySQLi或PDO_MySQL扩展来连接和操作MySQL数据库。当...

    可编辑的表格:jQuery+PHP+jeditable实现实时编辑表格字段内容,下拉、日历等多种表单演示

    本教程主要探讨如何利用jQuery、PHP和jeditable插件实现在网页上实时编辑表格内容的功能,包括下拉菜单、日历等丰富的表单元素。以下是详细的知识点解析: 1. **jQuery**:jQuery是一个强大的JavaScript库,简化了...

    jQuery列表 欢迎下载

    - **jQueryeditable**: 与Jeditable类似,但提供更多配置选项。 - **jQueryDisableTextSelectPlugin**: 防止文本被选中,常用于防止用户复制网页内容。 - **TableEditor**: 用于表格内数据编辑的插件。 - **...

    强化学习——电网运营和维护的强化学习,用于电网优化运营和维护Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    cmd-bat-批处理-脚本-MakeToolWindow.zip

    cmd-bat-批处理-脚本-MakeToolWindow.zip

    “华为杯”第十八届中国研究生数学建模竞赛参赛论文

    “华为杯”第十八届中国研究生数学建模竞赛是一项全国性赛事,致力于提升研究生的数学建模与创新实践能力。数学建模是将实际问题转化为数学模型,并运用数学方法求解以解决实际问题的科学方法。该竞赛为参赛者提供了展示学术水平和团队协作精神的平台。 论文模板通常包含以下内容:封面需涵盖比赛名称、学校参赛队号、队员姓名以及“华为杯”和中国研究生创新实践系列大赛的标志;摘要部分应简洁明了地概括研究工作,包括研究问题、方法、主要结果和结论,使读者无需阅读全文即可了解核心内容;目录则列出各章节标题,便于读者快速查找;问题重述部分需详细重新阐述比赛中的实际问题,涵盖背景、原因及重要性;问题分析部分要深入探讨每个问题的内在联系与解决思路,分析各个子问题的特点、难点及可能的解决方案;模型假设与符号说明部分需列出合理假设以简化问题,并清晰定义模型中的变量和符号;模型建立与求解部分是核心,详细阐述将实际问题转化为数学模型的过程,以及采用的数学工具和求解步骤;结果验证与讨论部分展示模型求解结果,评估模型的有效性和局限性,并对结果进行解释;结论部分总结研究工作,强调模型的意义和对未来研究的建议;参考文献部分列出引用文献,遵循规范格式。 在准备竞赛论文时,参赛者需注重逻辑清晰、论述严谨,确保模型科学实用。良好的团队协作和时间管理也是成功的关键。通过竞赛,研究生们不仅锻炼了数学应用能力,还提升了团队合作、问题解决和科研写作能力。

    一个检测俯卧撑和下蹲的检测系统

    希望这会对大家有用,共同发挥互联网精神!

    用于分析和表示神经动脉血流的MATLAB模型.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    cmd-bat-批处理-脚本-Run python script.zip

    cmd-bat-批处理-脚本-Run python script.zip

    基于MatlabSimulink的UKFEKF路面附着系数估计及仿真分析 MatlabSimulink

    内容概要:本文详细介绍了利用Matlab/Simulink平台,通过无迹扩展卡尔曼滤波(UKF/EKF)进行路面附着系数估计的方法及其仿真功能。文中首先阐述了Dugoff轮胎模型的构建方法,强调了避免代数环的重要性,并提供了具体的模块连接方式。接着,描述了7自由度整车模型的搭建步骤,特别是质心加速度和轮速之间的耦合关系。最后,深入探讨了UKF和EKF滤波器的配置细节,包括状态变量选择、观测值设定以及协方差矩阵的初始化等关键参数调整。仿真结果显示,在80km/h的速度下,UKF相比EKF的均方误差降低了18%,但CPU耗时增加了40%。 适合人群:从事车辆控制系统研究的专业人士,尤其是对卡尔曼滤波有一定了解的研究人员和技术人员。 使用场景及目标:适用于需要精确估计路面附着系数的应用场合,如汽车电子稳定程序(ESP)的设计与优化。通过提高附着系数估计的准确性,可以有效提升车辆行驶的安全性和稳定性。 其他说明:文章不仅提供了理论指导,还给出了实际操作的具体步骤和注意事项,帮助读者更好地理解和应用相关技术。

    实体建模技术研究进展.zip

    实体建模技术研究进展.zip

    基于4G通信的高负载电动汽车远程监控平台软件设计与开发.zip

    基于4G通信的高负载电动汽车远程监控平台软件设计与开发.zip

    IMG_20250521_201207.jpg

    IMG_20250521_201207.jpg

    cmd-bat-批处理-脚本-数学-isInteger.zip

    cmd-bat-批处理-脚本-数学-isInteger.zip

    基于改进DeepLabv3+的高分辨率遥感影像屋顶提取方法.pdf

    基于改进DeepLabv3+的高分辨率遥感影像屋顶提取方法.pdf

    cmd-bat-批处理-脚本-post-install.zip

    cmd-bat-批处理-脚本-post-install.zip

    基于遗传算法优化的BP神经网络预测模型代码及注释

    遗传算法优化BP神经网络(GABP)是一种结合了遗传算法(GA)和BP神经网络的优化预测方法。BP神经网络是一种多层前馈神经网络,常用于模式识别和预测问题,但其容易陷入局部最优。而遗传算法是一种模拟自然选择和遗传机制的全局优化方法,能够有效避免局部最优 。GABP算法通过遗传算法优化BP神经网络的权重和阈值,从而提高网络的学习效率和预测精度 。 种群:遗传算法中个体的集合,每个个体代表一种可能的解决方案。 编码:将解决方案转化为适合遗传操作的形式,如二进制编码。 适应度函数:用于评估个体解的质量,通常与目标函数相反,目标函数值越小,适应度越高。 选择:根据适应度保留优秀个体,常见方法有轮盘赌选择、锦标赛选择等。 交叉:两个父代个体交换部分基因生成子代。 变异:随机改变个体的部分基因,增加种群多样性。 终止条件:当迭代次数或适应度阈值达到预设值时停止算法 。 初始化种群:随机生成一组神经网络参数(权重和阈值)作为初始种群 。 计算适应度:使用神经网络模型进行训练和预测,根据预测误差计算适应度 。 选择操作:根据适应度选择优秀个体 。 交叉操作:对选择的个体进行交叉,生成新的子代个体 。 变异操作:对子代进行随机变异 。 替换操作:用新生成的子代替换掉一部分旧种群 。 重复步骤2-6,直到满足终止条件 。 适应度函数通常以预测误差为基础,误差越小,适应度越高。常用的误差指标包括均方根误差(RMSE)或平均绝对误差(MAE)等 。 GABP代码中包含了适应度函数的定义、种群的生成、选择、交叉、变异以及训练过程。代码注释详尽,便于理解每个步骤的作用 。 GABP算法适用于多种领域,如时间序列预测、经济预测、工程问题的优化等。它特别适合解决多峰优化问题,能够有效提高预测的准确性和稳定性 。

    太阳高度角和方位角建模及核桃树阴影变化分析.pdf

    太阳高度角和方位角建模及核桃树阴影变化分析.pdf

    cmd-bat-批处理-脚本-param2.zip

    cmd-bat-批处理-脚本-param2.zip

    前端开发Uniapp日期时间选择器:实现分钟动态步长设置

    Uniapp原生适配日期时间选择器,可动态设置分钟显示间隔

Global site tag (gtag.js) - Google Analytics