复盘工作2024-10
复盘工作-2024-10-06
1.关于对通过Arrays.asList()获得的list执行.removeAll会报错:需先创建支持修改的集合(例如ArrayList再removeAll)
/** * 练习:关于对通过Arrays.asList()获得的list执行.removeAll会报错:需先创建支持修改的集合(例如ArrayList再removeAll) */ // 假设该数组为前端传来,并处理后的 (前端已选的且去重的)任务负责人id 数组 String[] distinctRwFzrIdArr = {"1", "2", "3", "4", "5"}; // 已下发工作票的负责人id list,应从数据库查出,这里简写直接手动赋值 List yxfGzpFzrIdList = new ArrayList<>(); yxfGzpFzrIdList.add("2"); yxfGzpFzrIdList.add("4"); // 模拟我一开始的错误写法:会报错:java.lang.UnsupportedOperationException // 错误写法:List<String> distinctRwFzrIdList = Arrays.asList(distinctRwFzrIdArr); // 错误写法:distinctRwFzrIdList.removeAll(yxfGzpFzrIdList); // 解析:报错:java.lang.UnsupportedOperationException:意为:正在尝试对一个不支持该操作的数据结构执行某个操作。 // 不能对不可修改的集合进行.removeAll操作。通过Arrays.asList()操作得到的是不可修改的list。 // 解决方案:使用支持修改的集合。可以通过创建一个新的支持修改的集合(例如ArrayList)来避免这个错误: List<String> distinctRwFzrIdList = new ArrayList<>(Arrays.asList(distinctRwFzrIdArr)); distinctRwFzrIdList.removeAll(yxfGzpFzrIdList); System.out.println("======================"); System.out.println("移除已下发任务负责人id后的 任务负责人id list:"); // 结果:1 3 5 for (String rwFzrId : distinctRwFzrIdList) { System.out.println("rwFzrId: " + rwFzrId); } System.out.println("======================");
复盘工作-2024-10-10
1.当是”查看“页时,禁用页面所有输入元素
$(function() { debugger; /** * 当是”查看“页时,禁用页面所有输入元素 * * location是js内置的对象, * location.href获取当前url */ if (location.href.indexOf("&load=detail") != -1) { /** * $(':input').attr("disabled", "true"); * 禁用页面所有输入元素 * * 解析: * $(':input')是一个jQuery选择器,获取所有输入元素,这是jQuery文档定义的 * 输入元素包括4类:<input>、<textarea>、<select>、<button> * .attr()用于获取或设置属性 * .attr("disabled", "true");禁用元素 */ $(':input').attr("disabled", "true"); } })
复盘工作-2024-10-12
1.解除对页面上某些按钮的禁用(这里通过类选择器来选择),.removeAtrr() 对选中的元素移除某属性
/** * 解除对页面上某些按钮的禁用(这里通过类选择器来选择) * .removeAtrr() 对选中的元素移除某属性 */ $('.btn-search').removeAttr("disabled"); $('.btn-print').removeAttr("disabled");
2.问题:异动模块功能里新增一个页面,查缺陷列表,这个jsp放在异动模块文件夹里?还是放在缺陷模块文件夹里更合适?
分析:本例中放在异动文件夹里更合适。原因:该jsp仅用于异动模块,(不是其他多个模块共用),所以放到异动模块文件夹更合适。备注:如果该jsp是多个模块共用,那么放到缺陷模块文件夹更合适。
复盘工作-2024-10-13
1.替换字符串中第一次出现的子串 .replaceFirst("原字符串", "新字符串");
/** * 练习替换字符串中第一次出现的子串 .replaceFirst("原字符串", "新字符串"); * * 最终练习输出结果: * 输出原查询结果: * key: ID, value: 4028e4fa9240eb4a01924226fc300010 * key: ID, value: 8a8a8a86922c5e7701922c6328fe0001 * key: ID, value: 8a8a8a86921d9cb701921da075960001 * 替换后的sql: select t.create_date, t.id from pm_lp_gzp t where t.create_date > to_date('2024-09-22 00:00:00', 'yyyy-MM-dd HH24:mi:ss') * 输出替换字符串,加上创建时间后的查询结果: * key: CREATE_DATE, value: 2024-09-30 16:58:24.0 * key: ID, value: 4028e4fa9240eb4a01924226fc300010 * key: CREATE_DATE, value: 2024-09-26 11:32:29.0 * key: ID, value: 8a8a8a86922c5e7701922c6328fe0001 * key: CREATE_DATE, value: 2024-09-23 14:45:08.0 * key: ID, value: 8a8a8a86921d9cb701921da075960001 */ String sql = " select t.id from pm_lp_gzp t where " + "t.create_date > to_date('2024-09-22 00:00:00', 'yyyy-MM-dd HH24:mi:ss')"; List<Map<String, Object>> mapList = systemService.findForJdbc(sql); System.out.println("输出原查询结果:"); for (Map<String, Object> stringObjectMap : mapList) { // 输出Map<String, Object> for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } } String sqlWithCreateDate = sql.replaceFirst("select", "select t.create_date,"); System.out.println("替换后的sql:" + sqlWithCreateDate); List<Map<String, Object>> mapListWithCreateDate = systemService.findForJdbc(sqlWithCreateDate); System.out.println("输出替换字符串,加上创建时间后的查询结果:"); for (Map<String, Object> stringObjectMap : mapListWithCreateDate) { // 输出Map<String, Object> for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) { System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); } }
复盘工作-2024-10-14
1.SQL中union和union:union 会对查询结果去重;而union all 不会对查询结果去重。
/* 备注:本次练习使用的数据:数据库里存在t.tdsbid='402883f18247207f018249364620009f,402883f1802cf7a90180508f6e2e04a2,402883f1824219ac018244f5001b016d,'的一条记录 */ select t.tdsbid, t.* from pm_yj_tdsqd t order by t.create_date desc; /* 情景:需要对两个设备id值('402883f18247207f018249364620009f'、'402883f1802cf7a90180508f6e2e04a2')分别查询pm_yj_tdsqd, 获取到其关联的tdsqd实体。与此同时,如果某一条tdsqd对应的td设备同时包含着俩设备,则这条tdsqd记录仅需要展示一条。 也就是说查询出来的tdsqd列表,需要进行去重。 union 会对查询结果去重; 而union all 不会对查询结果去重。 */ /* union 去重,(本例中)返回一条记录 */ select * from pm_yj_tdsqd t where t.tdsbid like '%402883f18247207f018249364620009f%' union select * from pm_yj_tdsqd t where t.tdsbid like '%402883f1802cf7a90180508f6e2e04a2%'; /* union all 不去重,(本例中)返回两条相同的记录 */ select * from pm_yj_tdsqd t where t.tdsbid like '%402883f18247207f018249364620009f%' union all select * from pm_yj_tdsqd t where t.tdsbid like '%402883f1802cf7a90180508f6e2e04a2%';
复盘工作-2024-10-24
1.点击按钮,浏览器控制台报错ReferenceError: goPmSbSwbmListYsc is not defined,相关的js作用域:
/** * 问题:对于<%--<t:dgToolBar title="生成实物编码" icon="icon-add" url="" funname="goPmSbSwbmListWsc" width="100%" height="100%"></t:dgToolBar>--%> * 为什么当goPmSbSwbmListWsc定义在$(document).ready(function(){})内时, * 点击“生成实物编码”控制台报错:ReferenceError: goPmSbSwbmListYsc is not defined * 而当goPmSbSwbmListYsc定义在$(document).ready(function(){})外时不会报错? * * 解析: * 1.js有全局作用域和局部作用域。 * 当<%--<t:dgToolBar title=""></t:dgToolBar>--%>被点击时,会在全局作用域寻找goPmSbSwbmListYsc函数, * 而goPmSbSwbmListYsc函数定义在$(document).ready的回调函数里,是局部作用域,所以无法被回调函数之外的地方找到, * 所以会报错“未定义” * 2.$(document).ready的回调函数里定义的函数只能在回调函数内部被访问到 * 3.关于 $(document).ready的回调函数 这种说法的解析: * $(document).ready函数当文档dom对象加载完成后触发,其接受一个函数作为参数,即dom对象加载完成后执行一段函数, * $(document).ready(function(){}),function(){}就是回调函数, * function(){}内部定义的函数,只有在function(){}内部才能被访问到 * 4.在全局作用域中定义的函数,可以在任何位置被访问 */
2.浏览器控制台报错ReferenceError: isEmpty is not defined,相关的js的顺序依赖性问题:
/** * 问题:对于<%--<t:dgCol title="实物编码" formatterjs="formatterSwbm" field="swbm" align="center" queryMode="single" width="200"></t:dgCol>--%> 其所在A.jsp里有如下脚本: <%-- <script src = "webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script> <script type="text/javascript"> function isEmpty(value) { // 检查是否为null、undefined、空字符串或NaN return value === null || value === undefined || value === '' || Number.isNaN(value); } </script> --%> 而webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js里: <%-- // 格式化实物编码(将null改为空格) function formatterSwbm(value, row, index) { if (isEmpty(row.swbm)) { return ''; } else { return row.swbm; } } --%> * 控制台报错:ReferenceError: isEmpty is not defined * * 解析: * 1.对于HTML页面A.jsp里<%--<script type="text/javascript"></script>--%>里定义的isEmpty函数, * 以及通过<%--<script src="webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script>--%>引入的 * pmSjbQrCode.js里定义的formatterSwbm函数,其作用域都是全局作用域 * 2.这里涉及到关键的js的顺序依赖性问题。 * 对于HTML文档,浏览器是根据脚本在HTML页面中定义顺序来依次进行加载的。 * 即对于上述代码,浏览器解析A.jsp时会先加载pmSjbQrCode.js里的函数,然后再加载其本身<script>标签里的函数 * (因为<%--<script src="webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script>--%>这行代码在前面) * 所以对于通用代码,例如这里的isEmpty函数,需要先加载,即其需要放到pmSjbQrCode.js里。 * 即被调用的函数需要定义在先被加载的js里,然后再加载调用者函数所在的js。 * 即正确结构定义应该如下: * A.jsp里先定义:<%--<script src = "webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script>--%> * 然后再是本身的<script>, * pmSjbQrCode.js里如下: function isEmpty(value) { // 检查是否为null、undefined、空字符串或NaN return value === null || value === undefined || value === '' || Number.isNaN(value); } // 格式化实物编码(将null改为空格) function formatterSwbm(value, row, index) { if (isEmpty(row.swbm)) { return ''; } else { return row.swbm; } } * 这样在pmSjbQrCode.js里formatterSwbm函数就可以访问到isEmpty函数, * 并且A.jsp的<script>里,也能正常访问到isEmpty函数 */
3.通过sql改oracle库里某表的某列的注释的语法;以及惯例中每个修改语句后面会加一个/然后回车的作用;以及通过sql查USER*_COL_COMMENTS表来查列注释*:
/* 需求:改表里某列的注释,例如:将PRACTICE_BOOK表ISBN字段的注释改为'ISBN号' 语法: comment on column 表名.列名 is ''; / 分析: comment /ˈkɒment/ 注释 column /ˈkɒləm/ 列 分析:改表结构或表注释时,惯例中每个修改语句后面会加一个/然后回车的作用: /然后回车,表示执行该语句后(立马)提交该语句 */ comment on column PRACTICE_BOOK.ISBN is 'ISBN号'; / /* 查注释 */ select t.comments from USER_COL_COMMENTS t where t.table_name = 'PRACTICE_BOOK' and t.column_name = 'ISBN';
复盘工作-2024-10-27
1.禁用输入框:readonly是HTML中<input>元素的标准属性之一,对input设置readonnly实现禁用input的输入,变成只读。
<!-- readonly是HTML中<input>元素的标准属性之一,对input设置readonnly实现禁用input的输入,变成只读 --> <input readonly id="updateName" name="updateName" type="text" style="width: 150px" class="inputxt" value='${pmArchivePage.updateName}'>
2.js定义常量:const关键字,英文大写定义常量变量名
// js定义常量:const关键字,英文大写定义常量变量名 // 常量:技术资料 const TYPE_JSZL = 'JSZL'; console.log('验证js定义常量:' + TYPE_JSZL);
复盘工作-2024-10-29
1.练习一种情况:当流程在倒数第二个环节点“传递”时,后端逻辑执行完返回前端后,前端函数里再请求后端执行某个业务逻辑:js的typeof()函数相关:
通用代码:工作流js里代码:
$.ajax({ // 请求后端走工作流传递逻辑 url : '', type: "POST", data: { }, success: function(jsonObject){ var d = $.parseJSON(jsonObject); if(d.success){ if (typeof(sbydBeforeGdCallback) === "function") { // 判断是某流程的具体代码省略 /** * 我一开始写的是错误的:报错:TypeError: Cannot set properties of undefined (setting 'msg') * 错误代码:let data; * 错误代码:data.msg = '测试消息'; * 分析: * 1.let data;变量data被声明了,但没初始化。即data为undefined。 * 然后data.msg = '测试消息';尝试给data.msg赋值时,data仍为undefined,所以会报错。 * 2.正确写法: * let data = {};在声明data时初始化其为一个空对象 * data.msg = '测试消息';data是一个对象,可以安全的给其添加属性。 */ let data = {}; data.msg = '测试消息'; sbydBeforeGdCallback(data); } // 剩余代码省略 } } });
待办任务列表页面里js代码:
/** * 问题:练习一种情况:当流程在倒数第二个环节点“传递”时,后端逻辑执行完返回前端后, * 前端函数里再请求后端执行某个业务逻辑 * * 分析: * 1.在通用流程传递前端js里,后端返回后, * 使用if (typeof('sbydBeforeGdCallback') === "function") {}来判断全局作用域,或当前作用域里, * 是否有sbydBeforeGdCallback这个函数,如果有则调用,从而避免“函数未定义”报错 * 2.关于回调函数sbydBeforeGdCallback为什么是写在列表页而不是我之前自认为的流程工单详情页的分析: * 在列表页对某行点击”办理“后一系列操作,调当前页面引入的通用工作流js里如下代码打开对话框,而对话框内容是url对应的详情页, * 而对话框右下角的按钮(也包括其点击事件)仍是在列表页,所以要加的回调函数sbydBeforeGdCallback也应该写在列表页, * 如果写在url对应的详情页,则工作流js里后端返回后前端js代码里会找不到sbydBeforeGdCallback而报错。 * 备注:当前页面引入的工作流js里打开对话框的代码: * function win_back(title,width,height,url,busiId){ $.dialog({ content: 'url:'+url, // 省略其他属性 button: [ { name: "传递", callback: submitBtnFunction, focus: true } // 其他工作流按钮省略 ] }); } * * 如下是在待办任务列表页定义回调函数: */ function sbydBeforeGdCallback(data) { // 最终结果:可以成功弹出:successful enter listPage sbydBeforeGdCallback!测试消息 alert('successful enter listPage sbydBeforeGdCallback!' + data.msg); }
复盘工作-2024-10-31
1.关于新做菜单功能“任务池延期”、“延期任务查询”相关接口是放到原任务池controller还是新建controller:
/** * 1.问题:已有“任务池新建”、“任务池查询”菜单功能,在任务池控制器(controller里),现要新做菜单功能“任务池延期”、“延期任务查询”, * 这俩新功能相关接口是放到原任务池controller还是新建controller? * 2.分析:放到原controller里。 * 3.原因:(1)这4个功能都是对同一业务实体“任务池”的操作,所以放到同一个controller里有利于保持代码的集中和一致性; * (2)同时基于本项目里代码惯例,对同一实体的接口基本都是放到同一个controller里。 */
2.前端定义常量(js文件里定义,然后jsp页面引入js):
js文件里定义常量webpage/common/js/constants.js:
/** * 定义常量 */ /** * 审核状态:未提交 */ const SH_STATE_WTJ = 'WTJ';
jsp页面引入:WebRoot/webpage/com/项目名/ywjx/rwc/pmYjRwcListForDelay.jsp:
<!-- 引入js,<script>标签的src属性用于指定外部js文件的路径,我们项目里引入js写src都是从webpage路径开始, 这与项目的目录结构及web服务器(这里是Tomcat)的配置有关, 我自己的理解:这里pracConstants.js在我们项目目录结构里, 以及在Tomcat里,都是webapp/xxx(项目名)/webpage/common/js/pracConstants.js,以后我就记着从webpage开始写就行。 --> <script src="webpage/common/js/pracConstants.js"></script> <script type="text/javascript"> let test = SH_STATE_WTJ; // 弹出WTJ alert(test); </script>
3.对数据库表插入字段时,例如“延期原因”采用拼音首字母yqyy还是英文定义deploy_reason的分析:
/** * 问题:对数据库表插入字段时,例如“延期原因”采用拼音首字母yqyy还是英文定义deploy_reason的分析: * 分析:应采用英文定义。 * 原因:尽管使用拼音首字母可能在短期来看写代码时速度稍微快些, * 但从长远看,英文定义大大提高代码可读性及可维护性,也利于团队理解协作和效率, * 并且另一方面,基于IDE自动补全功能,英文定义稍长对写代码速度的影响就不复存在了。 */
浙公网安备 33010602011771号