Java话题
在Java中构建消息内容
String template = "尊敬的%s民警,您在%s案件中所呈请的%s一书,已经被%s审批。请知悉。";
String message = String.format(template, "三元里", "天河商场盗窃案", "《呈请立案报告书》", "三元里所长");
拒绝硬编码
字典项的特殊处理
处理方法:创建枚举类,列出需要特殊处理的字典项。
比如对于:只有已立案、已破案、已结案才允许录入破结案信息,编写枚举类:
package cn.sinobest.jzpt.zdycj.dict; public enum AJZT { /*** * 已立案.<br> */ YLA("02", "已立案"), /** * 已破案.<br> */ YPA("03", "已破案"), /** * 已结案.<br> */ YJA("04", "已结案"); /** * 案件状态的kind.<br> */ public static final String KIND = "56"; private String code; private String detail; private AJZT(String code, String detail) { this.code = code; this.detail = detail; } public String getCode() { return code; } public String getDetail() { return detail; } }
说明:
- 将字典的kind作为枚举类的静态常量是一个好习惯。
- 只需要列出需要特殊处理的字典项,实际上案件状态的字典项不止上面的三个。
问题:对于此类枚举应该制定一份位置的相关规范,以防重复定义。
实际业务代码中的使用:
1 String ajstate = ajjqService.getAjstateByAjId(aj_sysid); 2 boolean validState = AJZT.YLA.getCode().equals(ajstate) 3 || AJZT.YPA.getCode().equals(ajstate) 4 || AJZT.YJA.getCode().equals(ajstate); 5 if (!validState) { 6 String ajstateCN = ajstate == null ? "" : dictService.getDetail(AJZT.KIND, ajstate); 7 8 String message = "只有已立案、已破案、已结案才允许录入破结案信息,当前的案件状态是:${ajstateCN}!"; 9 message = message.replaceFirst("\$\{ajstateCN\}", ajstateCN); 10 11 tab.setInvalidMessage( message ); 12 return tab; 13 }
说明:
- 关键的代码(line 2-4)使用了枚举,这个地方不要用硬编码。
- 第line 8-9行,构建消息的方式也是基于模板的思想,但是已经被更好的方式所取代(参考前文)。
调试输出
使用日志控件(“log4j”+“commons-logging”),而不要用System.out.println。
JS话题
在JS中构建HTML
var template = "<div name='demo'> <input name='name'>{name}</input> <input name='email'>{email}</input> </div>"; var instance = template.replace(/{name}/, "Adam") .replace(/{email}/, "adam@qq.com");
说明:这里使用了正则表达式。
数据缓存
考虑一下我们要做一个百度图片类似的功能。搜索出来的结果是很多的缩略图,点击其中一个图片,打开一个新的页面对点击的图片进行放大。在点击的时候,需要把图片的id信息作为请求参数,发给服务器,关键就是我们如何从点击的图片获取这个图片的id。
- 我们可以给img元素添加额外的属性
这些属性可能不是html的标准属性:比如我们可以增加systemid属性来缓存图片数据的id;或者有违w3c标准对其的定义:比如使用class来记录systemid。 - 在img的相对位置,添加一个隐藏的dom元素
比如,我们在一个img元素之后,紧跟一个隐藏的input;class="systemid",value值为图片的id。
这是我之前一直使用的方式:如果需要缓存多个数据项,可以定义一个隐藏的div,在div内定义多个input来缓存数据。 - 使用jquery的data方法
$("#img01").data("systemid", "PCS4401000000002016022917470001"); // 缓存systemid数据到指定的dom $("#img01").data("systemid") // 从指定的dom获取systemid缓存数据 $("#img01").removeData("systemid"); // 移除缓存数据
如果缓存的数据项,不需要作为表单元素提交到服务端,那么我推荐这个方案。
JSP话题
去JSP脚本
使用EL代替表达式
引入外部资源
默认的写法:
<script src="<%=request.getContextPath()%>/library/js/framework/JavaScriptLibrary.js"></script>
推荐的写法:
<script src="${pageContext.request.contextPath}/library/js/framework/JavaScriptLibrary.js"></script>
传递字符串类型
后台Controller封装数据:
model.addAttribute("kzyw_sysid",sYSTEMID);
前台JSP提取数据:
<script type="text/javascript"> var kzyw_sysid = "${kzyw_sysid}"; </script>
说明:
- 字符串类型,需要加引号。
- 如果直接显示在页面,而不是存储在js变量,不用加引号。
传递复杂结构类型
复杂结构类型,在js中以json格式存储。
后台Controller封装数据:
@RequestMapping("/showStructure") public String showStructure(Model model){ List<Map<String,String>> list= v_ZDYCJ_CONF_YWBService.getStructure(); org.json.JSONArray treeData= new org.json.JSONArray(list); model.addAttribute("treeData", treeData); return STRUCTURE_VIEW; }
说明:以上是集合封装,如果是bean封装,或者集合、bean混合封装,应该也是可以的(没有测试,或者没有记录,不打包票)。
前台JSP提取数据:
<script type="text/javascript"> var treeData = ${treeData}; </script>
说明:提取出来的treeData是JSON格式,不需要加引号。
URL链接参数,控制内容显示
<div style="display:${empty param.hideTitle ? 'auto' : 'none'};">标题</div>
说明:如果有hideTitle请求参数,就不显示;否则显示。
使用标签库代替脚本
JSTL是JSP的标准标签库,目前还没来得及研究。
PLSQ话题
程序注释
注释的demo:
create or replace procedure asj_ws_generateWordMarkForHYZ /* 名字解析:案事件-文书相关-为换押证生成文书字号。 这个过程是对ASJ_GENHYZWORD的一次重构。 */ (in_writid in varchar2, -- 文书实例编号 in_increment in integer, -- 增量,在一书多人时需要同时为多个文书生成序列号 out_wordofwrit out varchar2, -- 文书字 out_markofwrit out integer -- 文书号 ) is
说明:
- 在程序名和程序参数之间添加对程序的功能性说明。
- 在每一项参数后,对参数进行注释。
- 使用is,不要使用as
对这个问题的记录,可以参考PLSQL的注释技巧。