- 浏览: 292648 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
springdata_springmvc:
java程序语言学习教程 地址http://www.zuida ...
JAVA获取CLASSPATH路径 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven2创建项目 -
程序员是怎么炼成的:
嗯 , 谢谢!
JAVA获取CLASSPATH路径 -
svygh123:
写的非常好,我已经连接通过,谢谢分享
Oracle建立DBLINK的详细步骤记录 -
aa00aa00:
恩,看了主人的博客,不错,我也是用的DBLINK,进行orac ...
Oracle建立DBLINK的详细步骤记录
收藏列表
- 全部 [120]
- python [6]
- javascript [7]
- freemarker [2]
- jquery [7]
- firefox [1]
- linux [2]
- java [18]
- oracle [4]
- webservice [3]
- sqlserver [3]
- html [3]
- other [3]
- powerdesigner [1]
- maven [1]
- spring mvc [26]
- 保险 [2]
- vba [11]
- lhgdialog [1]
- jeasyui [11]
- docker [1]
- require.js [1]
- gooflow [3]
- jsplumb [1]
- emberjs [1]
- mvel2 [1]
- rancher [1]
标题 | 标签 | 来源 | |
【DFA】敏感词过滤 - demo2 | java | ||
/** * */ package com.cignacmb.jdk8.features.dfa; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; import net.sf.json.JSONArray; import org.apache.commons.lang3.StringUtils; import com.sun.istack.internal.logging.Logger; /** * 参考:http://blog.csdn.net/chenssy/article/details/26961957 * 也可考虑使用:if (text.toLowerCase().contains(key)) * @author cheney * @date 2015年8月8日 下午1:12:21 */ public class DFATest2 extends TestCase { private Logger logger = Logger.getLogger(getClass()); public void test2(){ List<String> keyWordList = this.getKeyWordList(); long start1 = System.currentTimeMillis(); Node sensitiveWordNode = this.addSensitiveWordToHashMap(keyWordList); long end1 = System.currentTimeMillis(); logger.info("生成敏感词库耗时:" + (end1 - start1)); // logger.info(JSONObject.fromObject(sensitiveWordNode).toString()); long start2, end2; List<String> checkSensitiveWordList = this.getCheckSensitiveWordList(); for (String text : checkSensitiveWordList) { start2 = System.currentTimeMillis(); List<String> sensitiveWordContains = this.checkSensitiveWord(text.toLowerCase(), sensitiveWordNode); end2 = System.currentTimeMillis(); logger.info("deal word: " + text); logger.info("包含的敏感词条: " + JSONArray.fromObject(sensitiveWordContains)); logger.info("匹配耗时:" + (end2 - start2)); } } public void test3(){ List<String> keyWordList = this.getKeyWordList(); List<String> checkSensitiveWordList = this.getCheckSensitiveWordList(); List<String> sensitiveWordContains = null; long start, end, start1, end1; start = System.currentTimeMillis(); for (String text : checkSensitiveWordList) { start1 = System.currentTimeMillis(); sensitiveWordContains = new ArrayList<String>(); for (String key : keyWordList) { if (text.toLowerCase().contains(key)) { sensitiveWordContains.add(key); } } end1 = System.currentTimeMillis(); logger.info("deal word: " + text); logger.info("包含的敏感词条: " + JSONArray.fromObject(sensitiveWordContains)); logger.info("匹配耗时:" + (end1 - start1)); } end = System.currentTimeMillis(); logger.info("匹配总耗时:" + (end - start)); } /** * 从数据库中提取配置的敏感词条 * @return */ private List<String> getKeyWordList(){ List<String> keyWordList = new ArrayList<String>(); keyWordList.add("中国"); keyWordList.add("中间人"); keyWordList.add("中国人民"); keyWordList.add("中国男人"); keyWordList.add("五星红旗"); keyWordList.add("?"); keyWordList.add("test"); keyWordList.add("?"); keyWordList.add("ces"); return keyWordList; } /** * 需判断是否包含第三词条的文本 * @return */ private List<String> getCheckSensitiveWordList(){ List<String> keyWordList = new ArrayList<String>(); keyWordList.add("中国政府网是政府面向社会的窗口是公众与政府互动的渠道,是中国国务院和国务院各部门,以及各省、自治区、直辖市人民政府在国际互联网上发布政府信息和提供在线服务的综"); keyWordList.add("地fd?sf"); keyWordList.add("wdfTESTsdf"); keyWordList.add("df?不舒服"); return keyWordList; } /** * 构建敏感词库 * @param keyWordList 从数据库中提取配置的敏感词条 * @return */ private Node addSensitiveWordToHashMap(List<String> keyWordList) { if (null == keyWordList) { return null; } // 虚拟敏感词库空节点 Node rootNode = new Node(); Node curNode = null; String nodeValue = null; Node tempNode = null; for (String key : keyWordList) { if (StringUtils.isBlank(key)) { continue; } curNode = rootNode; for (int i = 0; i < key.length(); i++) { nodeValue = String.valueOf(key.charAt(i)); tempNode = null; if (i == key.length() - 1) { tempNode = new Node(String.valueOf(nodeValue), true); } else { tempNode = new Node(String.valueOf(nodeValue)); } curNode = curNode.addChild(tempNode); } } return rootNode; } /** * 检查文字中是否包含敏感词条 * @param text * @param sensitiveWordMap * @return * 返回文本中包含的所有第三词条 */ private List<String> checkSensitiveWord(String text, Node node){ if (StringUtils.isBlank(text)) { return null; } List<String> sensitiveWordContains = new ArrayList<String>(); for (int i = 0; i < text.length(); i++) { for (Node node2 : node.getChildren()) { if (String.valueOf(text.charAt(i)).equals(node2.getValue())) { if (node2.isEnd()) { sensitiveWordContains.add(node2.getWord()); } else if(text.length() > 1) { sensitiveWordContains.addAll(this.check(text.substring(i + 1), node.getChildren())); } } } } return sensitiveWordContains; } private List<String> check(String text, List<Node> list){ List<String> sensitiveWordContains = new ArrayList<String>(); List<Node> tempNodeList = list; for (Node node : tempNodeList) { logger.info(String.format("char/node value = %s/ %s", String.valueOf(text.charAt(0)), node.getValue())); if (String.valueOf(text.charAt(0)).equals(node.getValue())) { if (node.isEnd()) { sensitiveWordContains.add(node.getWord()); } else { if (text.length() > 1) { sensitiveWordContains.addAll(check(text.substring(1), node.getChildren())); } } } } return sensitiveWordContains; } } |
|||
【DFA】敏感词过滤 - demo1 | java | ||
/** * */ package com.cignacmb.jdk8.features.dfa; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import junit.framework.TestCase; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang3.StringUtils; import com.sun.istack.internal.logging.Logger; /** * 参考:http://blog.csdn.net/chenssy/article/details/26961957 * @author cheney * @date 2015年8月8日 上午10:37:33 */ public class DFATest extends TestCase { private Logger logger = Logger.getLogger(getClass()); public void test1(){ List<String> keyWordList = this.getKeyWordList(); long start1 = System.currentTimeMillis(); Map<String, Node> sensitiveWordMap = this.addSensitiveWordToHashMap(keyWordList); long end1 = System.currentTimeMillis(); logger.info("生成敏感词库耗时:" + (end1 - start1)); logger.info(JSONObject.fromObject(sensitiveWordMap).toString()); List<String> checkSensitiveWordList = this.getCheckSensitiveWordList(); long start2, end2; for (String text : checkSensitiveWordList) { start2 = System.currentTimeMillis(); List<String> sensitiveWordContains = this.checkSensitiveWord(text.toLowerCase(), sensitiveWordMap); end2 = System.currentTimeMillis(); logger.info("deal word: " + text); logger.info("包含的敏感词条: " + JSONArray.fromObject(sensitiveWordContains)); logger.info("匹配耗时:" + (end2 - start2)); } } /** * 从数据库中提取配置的敏感词条 * @return */ private List<String> getKeyWordList(){ List<String> keyWordList = new ArrayList<String>(); keyWordList.add("中国"); keyWordList.add("中间人"); keyWordList.add("中国人民"); keyWordList.add("中国男人"); keyWordList.add("五星红旗"); keyWordList.add("?"); keyWordList.add("test"); keyWordList.add("?"); keyWordList.add("ces"); return keyWordList; } /** * 需判断是否包含第三词条的文本 * @return */ private List<String> getCheckSensitiveWordList(){ List<String> keyWordList = new ArrayList<String>(); keyWordList.add("中国政府网是政府面向社会的窗口是公众与政府互动的渠道,是中fs国国务院和国务院各部门,以及各省、自治区、直辖市人民政府在国际互联网上发布政府信息和提供在线服务的综"); keyWordList.add("地fd?sf"); keyWordList.add("wdfTESTsdf"); keyWordList.add("df?不舒服"); return keyWordList; } /** * 构建敏感词库 * @param keyWordList 从数据库中提取配置的敏感词条 * @return */ private Map<String, Node> addSensitiveWordToHashMap(List<String> keyWordList) { if (null == keyWordList) { return null; } // 初始化敏感词容器,减少扩容操作 Map<String, Node> sensitiveWordMap = new HashMap<String, Node>(keyWordList.size()); Node firstFloorNode = null; for (String key : keyWordList) { if (StringUtils.isBlank(key)) { continue; } char firstFloorKeyChar = key.charAt(0); String firstFloorKey = String.valueOf(firstFloorKeyChar); firstFloorNode = sensitiveWordMap.get(firstFloorKey); if(null == firstFloorNode){ firstFloorNode = new Node(firstFloorKey); } if (key.length() == 1) { firstFloorNode.setEnd(true); } else { Node curNode = firstFloorNode; for (int i = 1; i < key.length(); i++) { Node node = null; if (i == key.length() - 1) { node = new Node(String.valueOf(key.charAt(i)), true); } else { node = new Node(String.valueOf(key.charAt(i))); } curNode = curNode.addChild(node); } } sensitiveWordMap.put(firstFloorKey, firstFloorNode); } return sensitiveWordMap; } /** * 检查文字中是否包含敏感词条 * @param text * @param sensitiveWordMap * @return * 返回文本中包含的所有第三词条 */ private List<String> checkSensitiveWord(String text, Map<String, Node> sensitiveWordMap){ List<String> sensitiveWordContains = null; if (StringUtils.isBlank(text)) { return sensitiveWordContains; } sensitiveWordContains = new ArrayList<String>(); for (int i = 0; i < text.length(); i++) { String key = String.valueOf(text.charAt(i)); Node node = sensitiveWordMap.get(key); if (null == node) { continue; } if(node.isEnd()){ // 已匹配上 // logger.info("1-已匹配上敏感词条: " + node.getWord()); sensitiveWordContains.add(node.getWord()); break; } sensitiveWordContains.addAll(this.check(text.substring(i+1), node.getChildren())); } return sensitiveWordContains; } private List<String> check(String text, List<Node> list){ List<String> sensitiveWordContains = new ArrayList<String>(); List<Node> tempNodeList = list; for (Node node : tempNodeList) { if (String.valueOf(text.charAt(0)).equals(node.getValue())) { if (node.isEnd()) { sensitiveWordContains.add(node.getWord()); // return sensitiveWordContains; } else { if (text.length() > 1) { sensitiveWordContains.addAll(check(text.substring(1), node.getChildren())); } } } } return sensitiveWordContains; } } /******************************************************************************************/ /** * */ package com.cignacmb.jdk8.features.dfa; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; /** * @author cheney * @date 2015年8月8日 上午11:41:02 */ public class Node { private String value = null; private boolean end = false; private List<Node> children = new ArrayList<Node>(); /** * 到当前节点时,敏感词条内容 */ private StringBuffer buffer = new StringBuffer(); public Node() { } public Node(String value) { this.value = value; } public Node(String value, boolean end) { this.value = value; this.end = end; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public boolean isEnd() { return end; } public void setEnd(boolean end) { this.end = end; } public List<Node> getChildren() { return children; } public StringBuffer getBuffer() { if (StringUtils.isBlank(this.buffer.toString())) { if (StringUtils.isNotBlank(this.getValue())) { buffer.append(this.getValue()); } } return buffer; } public void setBuffer(StringBuffer buffer) { this.buffer = buffer; } public String getWord() { if (StringUtils.isBlank(this.buffer.toString())) { if (StringUtils.isNotBlank(this.getValue())) { buffer.append(this.getValue()); } } return this.buffer.toString(); } /** * @param child * @return * 返回当前添加的节点 */ public Node addChild(Node child) { for (int i = 0; i < children.size(); i++) { if (children.get(i).getValue().equals(child.getValue())) { if (child.isEnd()) { children.get(i).setEnd(true); } return children.get(i); } } StringBuffer bufferTemp = new StringBuffer(); bufferTemp.append(this.getBuffer()); bufferTemp.append(child.getValue()); child.setBuffer(bufferTemp); this.children.add(child); return child; } } |
|||
【excel VBA】产品定义平台基础数据格式转换 | vba | ||
' 产品定义平台基础数据格式转换 Sub transferData() Dim orgDataSheetName As String, newDataSheetName As String orgDataSheetName = "女性" newDataSheetName = "sheet_2" Dim newSheetStartRow As Integer newSheetStartRow = 1 ActiveWorkbook.Worksheets.Add(after:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)).Name = newDataSheetName Set factorsRange = Worksheets(orgDataSheetName).Range("B6:B43") ' 保单年度 Set ContYearRange = Worksheets(orgDataSheetName).Range("C5:L5") Dim i Dim factorsRangeRows, factorsRangeCols factorsRangeRows = factorsRange.Rows.Count factorsRangeCols = factorsRange.Columns.Count Dim ContYearRangeCols ContYearRangeCols = ContYearRange.Columns.Count For i = 1 To factorsRangeRows ' 复制左侧因子 Worksheets(orgDataSheetName).Select Range(Cells(i + factorsRange.Row - 1, factorsRange.Column), Cells(i + factorsRange.Row - 1, factorsRangeCols + factorsRange.Column - 1)).Select Selection.Copy Worksheets(newDataSheetName).Select Range(Cells(newSheetStartRow, 1), Cells(newSheetStartRow + ContYearRangeCols - 1, factorsRangeCols)).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ' 复制保单年度,需转置 Worksheets(orgDataSheetName).Select ContYearRange.Select Selection.Copy Worksheets(newDataSheetName).Select Range(Cells(newSheetStartRow, factorsRangeCols + 1), Cells(newSheetStartRow + ContYearRangeCols - 1, factorsRangeCols + 1)).Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ' 复制费率,需转置 Worksheets(orgDataSheetName).Select Range(Cells(ContYearRange.Row + i, ContYearRange.Column), Cells(ContYearRange.Row + i, ContYearRange.Column + ContYearRange.Columns.Count - 1)).Select Selection.Copy Worksheets(newDataSheetName).Select Range(Cells(newSheetStartRow, factorsRangeCols + 2), Cells(newSheetStartRow + ContYearRangeCols - 1, factorsRangeCols + 2)).Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True newSheetStartRow = newSheetStartRow + ContYearRangeCols Next End Sub |
|||
Bean Validation | java | ||
Bean Validation技术实现对Javabean的校验 http://henu-zhangyang.iteye.com/blog/2231893 Spring3.1 对Bean Validation规范的新支持(方法级别验证) http://jinnianshilongnian.iteye.com/blog/1495594 Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC http://jinnianshilongnian.iteye.com/blog/1990081 |
|||
【powerdesigner】导出excel | powerdesigner | [转]powerDesigner生成excel版本的数据库文件 | |
'****************************************************************************** '* 在pd中,shift+ctrl+X,打开脚本运行 '* File: pdm2excel.txt '* Title: pdm export to excel '* Purpose: To export the tables and columns to Excel '* Model: Physical Data Model '* Objects: Table, Column, View '* Author: ziyan '* Created: 2012-05-03 '* Version: 1.0 '****************************************************************************** Option Explicit Dim rowsNum rowsNum = 0 '----------------------------------------------------------------------------- ' Main function '----------------------------------------------------------------------------- ' Get the current active model Dim Model Set Model = ActiveModel If (Model Is Nothing) Or (Not Model.IsKindOf(PdPDM.cls_Model)) Then MsgBox "The current model is not an PDM model." Else ' Get the tables collection '创建EXCEL APP dim beginrow DIM EXCEL, SHEET set EXCEL = CREATEOBJECT("Excel.Application") EXCEL.workbooks.add(-4167)'添加工作表 EXCEL.workbooks(1).sheets(1).name ="test" set sheet = EXCEL.workbooks(1).sheets("test") ShowProperties Model, SHEET EXCEL.visible = true '设置列宽和自动换行 sheet.Columns(1).ColumnWidth = 20 sheet.Columns(2).ColumnWidth = 40 sheet.Columns(4).ColumnWidth = 20 sheet.Columns(5).ColumnWidth = 20 sheet.Columns(6).ColumnWidth = 15 sheet.Columns(1).WrapText =true sheet.Columns(2).WrapText =true sheet.Columns(4).WrapText =true End If '----------------------------------------------------------------------------- ' Show properties of tables '----------------------------------------------------------------------------- Sub ShowProperties(mdl, sheet) ' Show tables of the current model/package rowsNum=0 beginrow = rowsNum+1 ' For each table output "begin" Dim tab For Each tab In mdl.tables ShowTable tab,sheet Next if mdl.tables.count > 0 then sheet.Range("A" & beginrow + 1 & ":A" & rowsNum).Rows.Group end if output "end" End Sub '----------------------------------------------------------------------------- ' Show table properties '----------------------------------------------------------------------------- Sub ShowTable(tab, sheet) If IsObject(tab) Then Dim rangFlag rowsNum = rowsNum + 1 ' Show properties Output "================================" sheet.cells(rowsNum, 1) = "实体名" sheet.cells(rowsNum, 2) =tab.name sheet.cells(rowsNum, 3) = "" sheet.cells(rowsNum, 4) = "表名" sheet.cells(rowsNum, 5) = tab.code sheet.Range(sheet.cells(rowsNum, 5),sheet.cells(rowsNum, 6)).Merge rowsNum = rowsNum + 1 sheet.cells(rowsNum, 1) = "属性名" sheet.cells(rowsNum, 2) = "说明" sheet.cells(rowsNum, 3) = "" sheet.cells(rowsNum, 4) = "字段中文名" sheet.cells(rowsNum, 5) = "字段名" sheet.cells(rowsNum, 6) = "字段类型" '设置边框 sheet.Range(sheet.cells(rowsNum-1, 1),sheet.cells(rowsNum, 2)).Borders.LineStyle = "1" sheet.Range(sheet.cells(rowsNum-1, 4),sheet.cells(rowsNum, 6)).Borders.LineStyle = "1" Dim col ' running column Dim colsNum colsNum = 0 for each col in tab.columns rowsNum = rowsNum + 1 colsNum = colsNum + 1 sheet.cells(rowsNum, 1) = col.name sheet.cells(rowsNum, 2) = col.comment sheet.cells(rowsNum, 3) = "" sheet.cells(rowsNum, 4) = col.name sheet.cells(rowsNum, 5) = col.code sheet.cells(rowsNum, 6) = col.datatype next sheet.Range(sheet.cells(rowsNum-colsNum+1,1),sheet.cells(rowsNum,2)).Borders.LineStyle = "2" sheet.Range(sheet.cells(rowsNum-colsNum+1,4),sheet.cells(rowsNum,6)).Borders.LineStyle = "2" rowsNum = rowsNum + 1 Output "FullDescription: " + tab.Name End If End Sub |
|||
【html】mime 类型 | html | MIME 参考手册 | |
.dotx,application/vnd.openxmlformats-officedocument.wordprocessingml.template .docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document .xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .pptx,application/vnd.openxmlformats-officedocument.presentationml.presentation .doc,application/msword .dot,application/msword .xls,application/vnd.ms-excel 示例参考: http://blog.csdn.net/zclandzzq/article/details/7055552 此方式依赖客户端,若客户端安装版本跟设置的不一致,则会提示下载。 |
|||
Office在线预览及PDF在线预览的实现方式 | html | Office在线预览及PDF在线预览的实现方式大集合 | |
一、服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件,然后再利用免费的swftools.exe工具生成swf格式的Flash文件,网页中加载flexpaper免费开源工具(有广告)实现Flash文件的预览。 优点: 1、有效的保护的源文件及文件的复制,不可复制也是缺点。 2、源码是自己的,版权有保证。 缺点: 1、服务器上必须安装Office软件。 2、导出PDF文件本身是个打印过程,Excel页面格式未设置,会出现一张表格打印出多页来,阅读体验大大下降。 3、转换过程非常耗费资源,低配的CPU几乎能跑满,服务器卡死。转换时间也非常漫长,这个时间主要是卡在了转换PDF上面。 4、转换完成服务器会遗留大量Excel、Word进程无法正常退出,有一些折中的解决办法,可以在网上搜索。 5、设置非常麻烦,本身微软官方的说法Office软件是客户端程序,在与IIS交互的时候本身就未设计。所以很多程序员把精力浪费在了调试程序上面。有两点在调试的时候需要注意。一个是在web.config中设置 <identity impersonate="true" userName="administrator" password="你的服务器管理员密码" />,一个是在Office软件的设置中设置跟桌面交互。 6、严重浪费磁盘空间,一个文件还需要一个PDF文件、一个SWF文件,是否每次都转换,纠结是要硬盘空间呢还是要CPU的资源。 参考链接: http://www.cnblogs.com/expectszc/archive/2012/04/04/2432149.html http://www.cnblogs.com/liuning8023/archive/2013/03/04/2943482.html http://www.cxyclub.cn/n/29549/ 非微软方:没有微软的Office软件可安装,只能用第三方的openoffice(开源、免费)来转换PDF文件,其它方面都一样,优缺点一样 参考链接: http://blog.csdn.net/z69183787/article/details/17468039 二、Office文档直接转换为SWF,通过网页加载Flash预览 利用flashpaper直接转换为SWF文件(虚拟打印机),然后利用flexpaper预览Flash文件。 flashpaper是Macromedia的一款产品,随着被Adobe公司收购,Macromedia对于这款软件早就放弃了,国内尚无人在程序中调试成功过。 参考链接: http://www.dzwebs.net/1149.html 三、office转Html、pdf转图片在线预览文件Html文件 利用DCOM配置直接操作Office文件,读取文件内容,导出Html文件 优点: 实践证明此方法不科学。 缺点: 1、服务器上必须安装Office软件。 2、配置麻烦,正如微软所说,读取Office不是这么干的。 3、转换的文件格式均丢失。 4、仅限于IIS服务器,利用ASP.net(C#)。 参考链接: http://www.cnblogs.com/tangbinblog/archive/2012/11/29/2794110.html 四、第三方ActiveX浏览器控件 如科瀚的SOAOffice中间件、卓正软件的pageoffice控件、WebOffice控件、国外的Office Viewer ActiveX Control 优点: 可在线编辑等。 缺点: 1、客户端需安装控件。 2、付费。 3、在Html5、CSS3以及桌面向浏览器转换的大潮流下,控件已是昨日黄花。 参考链接: http://www.kehansoft.com/soaoffice/index.htm http://www.zhuozhengsoft.com/ http://www.officectrl.com/ http://www.anydraw.com/ 五、微软的Office365 微软新出的在线文档,与Google文档抗衡,估计没谷歌文档,微软也懒得出这个 优点: 微软自家的东西原生态呈现。 缺点: 加载文件较多,各种图片、文字、样式、JQuery等,页面臃肿,加载速度慢,不适合手机预览 需要微软的批量许可(即授权),硬件投入方面:架设一台单独的服务器(可以是虚拟机),配置过低能安装,但无法运行,另外还需一台域服务器。而这两台机器上均不能安装其它程序,比如SQLServer,在Office365服务器上每次重启IIS会重置,也就是说你不能有任何其它网站。其主要是用来与SharePoint搭配使用。 参考链接: http://technet.microsoft.com/zh-cn/library/jj219456(v=office.15).aspx 六、第三方成熟的服务 如OfficeWeb365 优点: 1、OfficeWeb365采用适合中文排版的纯Html、CSS技术。 2、接口简单,适合PHP、JSP、ASP.net等所有的对接,省心省力。 3、费用低廉,节省投入。 4、不用关心客户端是否安装了Office软件,不用在客户端部署。 5、手机在线预览2页Word文档只有3K大小,且格式保留,领先全球的中文在线预览技术。 6、支持国产的金山WPS,这在国内尚属首列。 缺点: 1、OfficeWeb365只能查看不能编辑,目前在线编辑版的正在开发。 参考链接: http://www.officeweb365.com 七、在浏览器中直接打开 通过设置MiME类型,告诉浏览器这是Office文件,浏览器直接调用本地Office或PDF软件打开 优点: 1、不用编程,不用第三方服务,直截了当。 2、很多用户安装了Adobe的PDF预览软件,同时在浏览器上也直接安装了插件,浏览器可直接查看PDF文件。 缺点 你永远不知道客户机器上是否安装了Office软件,虽然几乎都安装了,但直接调用Office软件,客户体验大大下降,更何况还有个讨厌的迅雷一直在监视你的浏览器,不给你打开的机会,当然这些都是你无法预知的。 八、其它 如金山快写、一些网盘的预览 参考链接: http://w.wps.cn/ |
|||
【excel】xssf and sax (event api) | java | The New Halloween Document | |
public class POITest extends TestCase { String path = "D:\\code\\cigna\\lis\\sorcecode\\ui\\banktest\\PMLE001(招商信诺永享康健两全保险)\\RATE_PMLE001_PMLE001298_1.xlsx"; public void testXSSFSaxAPI() throws IOException, OpenXML4JException, SAXException { OPCPackage pkg = OPCPackage.open(path); XSSFReader r = new XSSFReader(pkg); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = XMLReaderFactory .createXMLReader("org.apache.xerces.parsers.SAXParser"); RateCVDataHandler handler = new RateCVDataHandler(sst); parser.setContentHandler(handler); Iterator<InputStream> sheets = r.getSheetsData(); while (sheets.hasNext()) { System.out.println("Processing new sheet:\n"); InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); // System.out.println(""); break; } List<List<String>> rows = handler.getRows(); if (null == rows) { System.out.println("null ...."); } else { for (List<String> list : rows) { for (String string : list) { System.out.print(string + "\t"); } System.out.println(); } } } } /*********************************************************************/ /*********************************************************************/ /*********************************************************************/ /** * */ package com.cignacmb.productdef.converter; import java.util.LinkedList; import java.util.List; import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * 参考:<br> * 解决POI读取Excel内存溢出的问题<br> * http://blog.csdn.net/lishengbo/article/details/40711769<br> * <br> * The New Halloween Document<br> * http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api<br> * @author c1panx * @ 2015年6月25日 下午4:43:33 */ public class RateCVDataHandler extends DefaultHandler { private SharedStringsTable sst; private boolean nextIsString; private String lastContents; /** 临时保留行记录 */ private List<String> record = null; /** 所有记录 */ private List<List<String>> rows = null; public RateCVDataHandler(SharedStringsTable sst){ this.sst = sst; record = new LinkedList<String>(); rows = new LinkedList<List<String>>(); } public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // c => cell if (name.equals("c")) { String cellType = attributes.getValue("t"); if ("s".equals(cellType)) { nextIsString = true; } else { nextIsString = false; } } // Clear contents cache lastContents = ""; } public void endElement(String uri, String localName, String name) throws SAXException { if(nextIsString) { int idx = Integer.parseInt(lastContents); lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); nextIsString = false; } // v => contents of a cell // Output after we've seen the string contents if(name.equals("v")) { // System.out.print(lastContents + "\t"); record.add(lastContents); } if ("row".equals(name)) { rows.add(record); record = new LinkedList<String>(); // System.out.println(); } } public void characters(char[] ch, int start, int length) throws SAXException { lastContents += new String(ch, start, length); } public List<List<String>> getRows() { return rows; } } |
|||
【xstream】属性及注解 | java | ||
public void testXStreamDBTypeMapContext(){ DBTypeMapContext typeMapContext = new DBTypeMapContext(); typeMapContext.setDbtype("oracle"); List<DBTypeMapModel> list = new ArrayList<DBTypeMapModel>(); for (int i = 0; i < 4; i++) { DBTypeMapModel dbTypeMapModel = new DBTypeMapModel(); dbTypeMapModel.setJdbcType("CHAR"); dbTypeMapModel.setJavaType("java.lang.String"); dbTypeMapModel.setPattern("fdafd"); list.add(dbTypeMapModel); } typeMapContext.setList(list); List<DBTypeMapContext> contextList = new ArrayList<DBTypeMapContext>(); contextList.add(typeMapContext); XStream xStream = new XStream(); xStream.registerConverter(new DBTypeMapContextConverter()); xStream.alias("typemap", List.class); xStream.alias("context", DBTypeMapContext.class); System.out.println(xStream.toXML(contextList)); Object obj = xStream.fromXML(getClass().getResourceAsStream("/system-config/dbtype-map.xml")); System.out.println(obj); @SuppressWarnings("unchecked") List<DBTypeMapContext> contextList2 = (List<DBTypeMapContext>) obj; System.out.println(xStream.toXML(contextList2)); } /*********************************************************************************** * **********************************************************************************/ package com.cignacmb.productdef.converter; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.cignacmb.productdef.model.DBTypeMapContext; import com.cignacmb.productdef.model.DBTypeMapModel; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; /** * XStream DBTypeMapContext自定义转换器 * @author c1panx * @ 2015年6月19日 下午5:33:32 */ public class DBTypeMapContextConverter implements Converter { private Logger logger = Logger.getLogger(getClass()); @Override @SuppressWarnings("rawtypes") public boolean canConvert(Class clazz) { return clazz.equals(DBTypeMapContext.class); } @Override public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context) { logger.debug("Object obj: " + obj); if (obj instanceof DBTypeMapContext == false) { return; } DBTypeMapContext typeMapContext = (DBTypeMapContext) obj; writer.addAttribute("dbtype", typeMapContext.getDbtype()); List<DBTypeMapModel> list = typeMapContext.getList(); if (null != list) { for (DBTypeMapModel dbTypeMapModel : list) { writer.startNode("item"); writer.addAttribute("jdbcType", dbTypeMapModel.getJdbcType()); writer.addAttribute("javaType", dbTypeMapModel.getJavaType()); if (StringUtils.isNotBlank(dbTypeMapModel.getPattern())) { writer.addAttribute("pattern", dbTypeMapModel.getPattern()); } writer.endNode(); } } } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { logger.debug("start unmarshal ... "); DBTypeMapContext typeMapContext = new DBTypeMapContext(); typeMapContext.setDbtype(trim(reader.getAttribute("dbtype"))); List<DBTypeMapModel> list = new ArrayList<DBTypeMapModel>(); while (reader.hasMoreChildren()) { reader.moveDown(); DBTypeMapModel typeMapModel = new DBTypeMapModel(); typeMapModel.setJdbcType(trim(reader.getAttribute("jdbcType"))); typeMapModel.setJavaType(trim(reader.getAttribute("javaType"))); typeMapModel.setPattern(trim(reader.getAttribute("pattern"))); list.add(typeMapModel); reader.moveUp(); } typeMapContext.setList(list); logger.debug("end unmarshal ... "); return typeMapContext; } private String trim(String value) { return null == value ? null : value.trim(); } } /*********************************************************************************** * **********************************************************************************/ package com.cignacmb.productdef.model; import java.util.List; import org.apache.commons.lang3.StringUtils; /** * jdbcType && javaType映射关系上下文件,针对特定类型的数据库 * @author c1panx * @ 2015年6月19日 下午5:20:17 */ public class DBTypeMapContext { private String dbtype; private List<DBTypeMapModel> list; public String getDbtype() { return dbtype; } public void setDbtype(String dbtype) { this.dbtype = dbtype; } public List<DBTypeMapModel> getList() { return list; } public void setList(List<DBTypeMapModel> list) { this.list = list; } public DBTypeMapModel getTypeMap(String jdbcType) { if (StringUtils.isBlank(jdbcType) || null == list) { return null; } for (DBTypeMapModel dbTypeMapModel : list) { if (jdbcType.equalsIgnoreCase(dbTypeMapModel.getJdbcType())) { return dbTypeMapModel; } } return null; } } /*********************************************************************************** * **********************************************************************************/ package com.cignacmb.productdef.model; /** * jdbcType && javaType映射关系 * @author c1panx * @ 2015年6月19日 下午5:12:37 */ public class DBTypeMapModel { private String jdbcType; private String javaType; private String pattern; public String getJdbcType() { return jdbcType; } public void setJdbcType(String jdbcType) { this.jdbcType = jdbcType; } public String getJavaType() { return javaType; } public void setJavaType(String javaType) { this.javaType = javaType; } public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; } } /*********************************************************************************** * dbtype-map.xml **********************************************************************************/ <?xml version="1.0" encoding="UTF-8"?> <typemap> <context dbtype="oracle"> <item jdbcType="CHAR" javaType="java.lang.String" pattern="123"/> <item jdbcType="VARCHAR2" javaType="java.lang.String" pattern="dfaf"/> </context> </typemap> |
|||
【SQLServer】导出insert SQL | sqlserver | ||
USE [quote_cn] GO /****** Object: StoredProcedure [dbo].[OutputData] Script Date: 06/18/2015 09:52:25 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /** * 参数:表名 * 输出:指定表下所有记录的insert语句 */ CREATE PROCEDURE [dbo].[OutputData] @tablename sysname AS declare @column varchar(1000) declare @columndata varchar(1000) declare @sql varchar(4000) declare @xtype tinyint declare @name sysname declare @objectId int declare @objectname sysname declare @ident int set nocount on set @objectId=object_id(@tablename) if @objectId is null -- 判断对象是否存在 begin print @tablename + '对象不存在' return end set @objectname=rtrim(object_name(@objectId)) if @objectname is null or charindex(@objectname,@tablename)=0 begin print @tablename + '对象不在当前数据库中' return end if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判断对象是否是表 begin print @tablename + '对象不是表' return end select @ident=status&0x80 from syscolumns where id=@objectid and status&0x80=0x80 if @ident is not null print 'SET IDENTITY_INSERT '+ @TableName + ' ON' --定义游标,循环取数据并生成Insert语句 declare syscolumns_cursor cursor for select c.name,c.xtype from syscolumns c where c.id=@objectid order by c.colid --打开游标 open syscolumns_cursor set @column='' set @columndata='' fetch next from syscolumns_cursor into @name,@xtype while @@fetch_status <> -1 begin if @@fetch_status <> -2 begin if @xtype not in(189,34,35,99,98) --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理 begin set @column=@column + case when len(@column)=0 then '' else ',' end + @name set @columndata = @columndata + case when len(@columndata)=0 then '' else ','','',' end + case when @xtype in(167,175) then '''''''''+'+@name+'+''''''''' --varchar,char when @xtype in(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar when @xtype=61 then '''''''''+convert(char(23),'+@name+',121)+''''''''' --datetime when @xtype=58 then '''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime when @xtype=36 then '''''''''+convert(char(36),'+@name+')+''''''''' --uniqueidentifier else @name end end end fetch next from syscolumns_cursor into @name,@xtype end close syscolumns_cursor deallocate syscolumns_cursor set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename print '--'+@sql exec(@sql) if @ident is not null print 'SET IDENTITY_INSERT '+@TableName+' OFF' GO |
|||
【jeasyui 1.4.2】控件帮助信息 | jeasyui | ||
/** * 依赖样式:icon-help(easyui icon.css中) * .icon-help{ * background:url('icons/help.png') no-repeat center center; * } */ (function($) { $.fn.extend({ /** * 制作帮助信息<br> * 基于保单范围内,也可是其他指定范围,在指定控件位置后(以内嵌方式)显示帮助图标,鼠标移入后显示帮助信息<br> * 页面布局动态变化时,容易出现错位现象,通过setInterval()监控重新设置位置 * @param json */ helptip: function(json){ var pairs = {}; for(var key in json){ var $target = $(this).find("input[name='" + key + "']").parent(); var $helpTip = $("<div name='_helptips' class='icon-help'> </div>"); $("body").append($helpTip); $helpTip.css({ cursor: 'pointer', position: 'absolute', display: 'none', height: 22, width: 18 }); $target.width($target.width() - $helpTip.width()); $helpTip.tooltip({ position : 'right', content : '<span style="color:#fff">' + json[key].description + '</span>', onShow : function() { $(this).tooltip('tip').css({ backgroundColor : '#666', borderColor : '#666' }); } }); pairs[key] = {target:$target, helpTip:$helpTip}; } setInterval(function(){ for(var key in pairs){ if(pairs[key].target.is(":visible")){ pairs[key].helpTip.show('fast').offset({ left:pairs[key].target.offset().left + pairs[key].target.width() + 4, top: pairs[key].target.offset().top }); } else { pairs[key].helpTip.hide(); } } }, 100); } }); })(jQuery); // 调用示例 $(document).ready(function(){ var helpTipsJSON = { risktype:{name:"", description:"L--寿险 A--意外险 H--健康险"}, riskprop:{name:"", description:"L--长险(Long)、M--一年期险(Middle)、S--极短期险(Short)"}, }; $("#defLMRiskInfoFm").helptip(helpTipsJSON); }); |
|||
【jeasyui 1.4.2】右侧浮动菜单 | jeasyui | ||
/* 依赖的样式 .flow-right-menu{ position: fixed; z-index: 1000; } .flow-right-menu-btn{ background: url("./flow-right-menu-show.png") no-repeat; width: 48px; height: 48px; margin-left: 1em; margin-bottom: -2.6em; z-index: 2000; } .flow-right-menu-btn:HOVER{ cursor: pointer; } .flow-right-menu li{ border: 1px solid #95B8E7; border-left: 6px solid #95B8E7; color: #0E2D5F; line-height: 1.5em; list-style-type: circle; padding: .5em 1em; } .flow-right-menu li:HOVER{ border: 1px solid #FF9900; border-left: 4px solid #FF9900; border-right: 1px solid #FF9900; background-color: #FFFFCE; color: #0080FF; cursor: pointer; } .flow-right-menu li.selected{ border: 1px solid #F8FE01; border-left: 4px solid #F8FE01; border-right: 1px solid #F8FE01; background-color: #FF9900; color: #fff; } */ /** * 右侧浮动菜单插件 * @param $ */ (function($){ $.flowmenu = function(options, param){ if(null == options || options == undefined) options = "open"; if (typeof options != 'string'){ param = options; options = "open"; } var method = $.flowmenu.methods[options]; return method ? method(param) : null; }, $.flowmenu.methods = { /** * 显示右侧浮动菜单,且默认第一个菜单选中 * @param param * 参数示例: * [{name:'', text: '', callback: null}] * name: 菜单唯一标识 * text: 显示的菜单名 * callback: 菜单点击回调函数,若当前即为显示的菜单项,则不会执行回调动作 * @returns */ open: function(param){ var $containerDiv = $(".flow-right-menu"); if($containerDiv.length > 0) return $containerDiv; $containerDiv = $("<div/>").addClass("flow-right-menu"); $("body").append($containerDiv); $("<div/>").addClass("flow-right-menu-btn").appendTo($containerDiv).bind("click", function(ev){ var w = $(window).width(); var sw = $containerDiv.width(); if($(".flow-right-menu ul").is(":visible")){ $(".flow-right-menu ul").slideUp('fast', function(){ var l = $(window).width() - $containerDiv.width() * 1/3; $(".flow-right-menu").animate({left: l}); }); } else { var l = sw > w ? w : (w - sw - 2); $(".flow-right-menu").animate({left: l}, function(){ $(".flow-right-menu ul").slideDown('fast'); }); } }); var $ul = $("<ul/>").appendTo($containerDiv); if(null == param || param == undefined){ } else { for (var int = 0; int < param.length; int++) { var menuJSON = param[int]; var $li = $("<li/>").attr({ name : menuJSON.name }).html(menuJSON.text).appendTo($ul); if(menuJSON.callback){ $li.bind("click", {fn: menuJSON.callback}, function(ev){ if("selected" == $(this).attr("class")){ return; } $.flowmenu("select", $(this).attr("name")); ev.data.fn(); }) } } $ul.find("li:first").addClass("selected"); } var sh = $containerDiv.height(); var sw = $containerDiv.width(); $containerDiv.width(sw); function _resize(){ var w = $(window).width(), h = $(window).height(); var t = sh > h ? 0 : (h - sh) / 4; if($(".flow-right-menu ul").is(":visible")){ var l = sw > w ? w : (w - sw - 2); $containerDiv.css({left: l, top: t}); } else { var l = w - sw * 1/3; $containerDiv.css({left: l, top: t}); } } _resize(); $(window).bind('resize', function(){ _resize(); }) return $containerDiv; }, /** * 设置指定菜单被选中 * @param param 菜单唯一标识 * @returns */ select: function(param){ $(".flow-right-menu li").removeClass("selected"); $(".flow-right-menu li[name=" + param + "]").addClass("selected"); } } })(jQuery); // 调用示例 $(document).ready(function(){ var menuJSONArray = [ {name:'easyui_1', text: 'easyui_1', callback: function(){alert('easyui_1');}}, {name:'easyui_2', text: 'easyui_2', callback: function(){alert('easyui_2');}}, {name:'easyui_3', text: 'easyui_3', callback: function(){alert('easyui_3');}}, {name:'easyui_4', text: 'easyui_4', callback: function(){alert('easyui_4');}}, {name:'easyui_5', text: 'easyui_5', callback: function(){alert('easyui_5');}}, {name:'easyui_0', text: 'easyui_0', callback: function(){alert('easyui_0');}} ]; // 右侧浮动菜单 $.flowmenu(menuJSONArray); // $.flowmenu("open", menuJSONArray); $.flowmenu("select", "easyui_3"); }); |
|||
【BeanUtils】 | java | ||
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency> BeanUtils包的使用 http://www.cnblogs.com/H_Razor/archive/2011/03/01/1967620.html spring的BeanUtils.copyProperties用法 http://blog.csdn.net/shimiso/article/details/5644584 BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力! |
|||
【Dozer】 | java | ||
DozerBeanMapper + 对象转Map方法 http://uule.iteye.com/blog/2084016 /** dozer与maven的集成 <dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.0</version> </dependency> dozer spring <bean id="beanMapper" class="org.dozer.spring.DozerBeanMapperFactoryBean"> <property name="mappingFiles" value="classpath*:com/cignacmb/dozer/dozer-*.xml" /> </bean> dozer-bean-mappings.xml <?xml version="1.0" encoding="UTF-8"?> <mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"> <mapping> <class-a>com.cignacmb.productdef.dozer.User</class-a> <class-b>com.cignacmb.productdef.dozer.Customer</class-b> <field> <a>userId</a> <b>customerId</b> </field> <field> <a>userName</a> <b>customerName</b> </field> </mapping> </mappings> */ public class DozerTest extends AbstractJUnit4Test { @Resource private DozerBeanMapper beanMapper; @Test public void testMap() { User user = new User(1, "user1"); Customer customer = beanMapper.map(user, Customer.class); System.out.println("@> CustomerId = " + customer.getCustomerId()); System.out.println("@> CustomerName = " + customer.getCustomerName()); Assert.assertEquals(customer.getCustomerId(), 1); Assert.assertEquals(customer.getCustomerName(), "user1"); } } |
|||
【TODO】XML Schema校验XML | java | ||
Java 语言的 XML 验证 API http://www.ibm.com/developerworks/cn/xml/x-javaxmlvalidapi.html Java通过XML Schema校验XML http://lavasoft.blog.51cto.com/62575/97597/ |
|||
【JSON】 JsonConfig | java | ||
JSONObject tJSON = JSONObject.fromObject(model, getJsonConfig()); public static JsonConfig getJsonConfig(){ JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(java.sql.Date.class, new JsonSQLDateValueProcessor()); jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonUtilDateValueProcessor()); return jsonConfig; } /**************************************************************************************/ /** * */ package com.cignacmb.productdef.converter; import java.text.SimpleDateFormat; import java.util.Locale; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; import com.cignacmb.productdef.util.Tools; /** * java.sql.Date转JSON对象时日期转换<br> * 如将Date转换为“yyyy-MM-dd”格式 * @author c1panx * @ 2015年5月28日 下午5:56:25 */ public class JsonSQLDateValueProcessor implements JsonValueProcessor { private String format = "yyyy-MM-dd"; public JsonSQLDateValueProcessor() { super(); } public JsonSQLDateValueProcessor(String format) { super(); this.format = format; } @Override public Object processArrayValue(Object paramObject, JsonConfig paramJsonConfig) { return process(paramObject); } @Override public Object processObjectValue(String paramString, Object paramObject, JsonConfig paramJsonConfig) { return process(paramObject); } private Object process(Object value) { if (null == value) { return ""; } if (value instanceof java.sql.Date) { java.sql.Date sqlDate = (java.sql.Date) value; java.util.Date date = Tools.sqlDateToUtilDate(sqlDate); SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINA); return sdf.format(date); } return value; } } /**************************************************************************************/ /** * */ package com.cignacmb.productdef.converter; import java.text.SimpleDateFormat; import java.util.Locale; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; /** * java.util.Date转JSON对象时日期转换<br> * 如将Date转换为“yyyy-MM-dd ”格式 * @author c1panx * @ 2015年5月28日 下午5:56:25 */ public class JsonUtilDateValueProcessor implements JsonValueProcessor { private String format = "yyyy-MM-dd HH:mm:ss"; public JsonUtilDateValueProcessor() { super(); } public JsonUtilDateValueProcessor(String format) { super(); this.format = format; } @Override public Object processArrayValue(Object paramObject, JsonConfig paramJsonConfig) { return process(paramObject); } @Override public Object processObjectValue(String paramString, Object paramObject, JsonConfig paramJsonConfig) { return process(paramObject); } private Object process(Object value) { if (null == value) { return null; } if (value instanceof java.util.Date) { java.util.Date date = (java.util.Date) value; SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINA); return sdf.format(date); } return value; } } |
|||
【spring mvc】@InitBinder 表单数据绑定 | spring mvc | ||
/* * Spring表单的initBinder:绑定表单复杂属性: * http://blog.sina.com.cn/s/blog_65dcacbb0100hwa8.html * * spring mvc使用@InitBinder 标签对表单数据绑定: * http://blog.csdn.net/axin66ok/article/details/17938095 */ /** * @author c1panx * @ 2015年5月26日 上午11:34:50 */ public class BaseController { /** * 自定义springMVC的属性编辑器主要有两种方式:<br> * 一种是使用@InitBinder标签在运行期注册一个属性编辑器,这种编辑器只在当前Controller里面有效;<br> * 还有一种是实现自己的 WebBindingInitializer,然后定义一个 AnnotationMethodHandlerAdapter的bean,在此bean里面进行注册 ,这种属性编辑器是全局的。 * <br> * 本类采用方式一 <br> * 默认返回日期格式:yyyy-MM-dd,其他特殊情况时可继承重写 * <hr> * <a href="http://haohaoxuexi.iteye.com/blog/1190065">springMVC自定义属性编辑器</a> <br> * <a href="http://blog.csdn.net/whumr1/article/details/8056285">spring mvc绑定对象String转Date</a> * <br> * @param request * @param binder * @throws Exception */ @InitBinder protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { // 对于需要转换为Date类型的属性,使用DateEditor进行处理 binder.registerCustomEditor(java.util.Date.class, new DateUtilEditor()); binder.registerCustomEditor(java.sql.Date.class, new DateSQLEditor()); } } /**************************************************************************************/ /** * */ package com.cignacmb.productdef.mvc.editor; import java.beans.PropertyEditorSupport; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import com.cignacmb.productdef.common.Constants; /** * springMVC的属性编辑器 —— 日期编辑器 java.util.Date类型 * @author c1panx * @ 2015年5月26日 上午11:11:15 */ public class DateUtilEditor extends PropertyEditorSupport { private static final DateFormat DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd"); // private static final DateFormat TIMEFORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private boolean allowEmpty = true; private DateFormat dateFormat; public DateUtilEditor() { this.dateFormat = DATEFORMAT; } public DateUtilEditor(boolean allowEmpty) { this.allowEmpty = allowEmpty; } public DateUtilEditor(DateFormat dateFormat) { this.dateFormat = dateFormat; } public DateUtilEditor(DateFormat dateFormat, boolean allowEmpty) { this.dateFormat = dateFormat; this.allowEmpty = allowEmpty; } @Override public String getAsText() { if (dateFormat == null) { dateFormat = DATEFORMAT; } Date date = (Date) getValue(); return null == date ? null : dateFormat.format(date); } @Override public void setAsText(String text) throws IllegalArgumentException { if (this.allowEmpty && StringUtils.isBlank(text)) { // Treat empty String as null value. setValue(null); } else { try { // 常用日期格式字符串转换成日期对象 Date date = DateUtils.parseDate(text, Constants.DatePattern); setValue(date); } catch (ParseException e) { throw new IllegalArgumentException("Could not parse date: " + e.getMessage(), e); } } } } /**************************************************************************************/ /** * */ package com.cignacmb.productdef.mvc.editor; import java.beans.PropertyEditorSupport; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import com.cignacmb.productdef.common.Constants; import com.cignacmb.productdef.util.Tools; /** * springMVC的属性编辑器 —— 日期编辑器 java.sql.Date类型 * @author c1panx * @ 2015年5月26日 上午11:11:15 */ public class DateSQLEditor extends PropertyEditorSupport { private static final DateFormat DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd"); private boolean allowEmpty = true; public DateSQLEditor() { } public DateSQLEditor(boolean allowEmpty) { this.allowEmpty = allowEmpty; } @Override public String getAsText() { java.sql.Date sqlDate = (java.sql.Date) getValue(); java.util.Date utilDate = Tools.sqlDateToUtilDate(sqlDate); return null == utilDate ? "" : DATEFORMAT.format(utilDate); } @Override public void setAsText(String text) throws IllegalArgumentException { if (this.allowEmpty && StringUtils.isBlank(text)) { // Treat empty String as null value. setValue(null); } else { try { // 常用日期格式字符串转换成日期对象 Date date = DateUtils.parseDate(text, Constants.DatePattern); setValue(Tools.utilDateToSqlDate(date)); } catch (ParseException e) { throw new IllegalArgumentException("Could not parse date: " + e.getMessage(), e); } } } } |
|||
【spring mvc】mybatis-generator之JavaTypeResolverDefaultImpl.java | spring mvc | ||
/* * Copyright 2005 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mybatis.generator.internal.types; import java.math.BigDecimal; import java.sql.Types; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.JavaTypeResolver; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.config.Context; import org.mybatis.generator.config.PropertyRegistry; import org.mybatis.generator.internal.util.StringUtility; /** * 新核心系统中数据库中的Date只包含年月日信息,时间保存至对应的time字段<br> * mybatis generator默认映射至java.util.Date<br> * 针对新核心,需重新映射至java.sql.Date<br> * 在xml中设置配置开关:<br> * property name="sqldate" value="true" <br> * true: 表示使用java.sql.date, * 其他情况使用java.util.Date * @author Jeff Butler */ public class JavaTypeResolverDefaultImpl implements JavaTypeResolver { protected List<String> warnings; protected Properties properties; protected Context context; protected boolean forceBigDecimals; protected Map<Integer, JdbcTypeInformation> typeMap; public JavaTypeResolverDefaultImpl() { super(); properties = new Properties(); typeMap = new HashMap<Integer, JdbcTypeInformation>(); typeMap.put(Types.ARRAY, new JdbcTypeInformation("ARRAY", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Types.BIGINT, new JdbcTypeInformation("BIGINT", //$NON-NLS-1$ new FullyQualifiedJavaType(Long.class.getName()))); typeMap.put(Types.BINARY, new JdbcTypeInformation("BINARY", //$NON-NLS-1$ new FullyQualifiedJavaType("byte[]"))); //$NON-NLS-1$ typeMap.put(Types.BIT, new JdbcTypeInformation("BIT", //$NON-NLS-1$ new FullyQualifiedJavaType(Boolean.class.getName()))); typeMap.put(Types.BLOB, new JdbcTypeInformation("BLOB", //$NON-NLS-1$ new FullyQualifiedJavaType("byte[]"))); //$NON-NLS-1$ typeMap.put(Types.BOOLEAN, new JdbcTypeInformation("BOOLEAN", //$NON-NLS-1$ new FullyQualifiedJavaType(Boolean.class.getName()))); typeMap.put(Types.CHAR, new JdbcTypeInformation("CHAR", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); typeMap.put(Types.CLOB, new JdbcTypeInformation("CLOB", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); typeMap.put(Types.DATALINK, new JdbcTypeInformation("DATALINK", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Types.DATE, new JdbcTypeInformation("DATE", //$NON-NLS-1$ new FullyQualifiedJavaType(Date.class.getName()))); typeMap.put(Types.DISTINCT, new JdbcTypeInformation("DISTINCT", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Types.DOUBLE, new JdbcTypeInformation("DOUBLE", //$NON-NLS-1$ new FullyQualifiedJavaType(Double.class.getName()))); typeMap.put(Types.FLOAT, new JdbcTypeInformation("FLOAT", //$NON-NLS-1$ new FullyQualifiedJavaType(Double.class.getName()))); typeMap.put(Types.INTEGER, new JdbcTypeInformation("INTEGER", //$NON-NLS-1$ new FullyQualifiedJavaType(Integer.class.getName()))); typeMap.put(Types.JAVA_OBJECT, new JdbcTypeInformation("JAVA_OBJECT", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Jdbc4Types.LONGNVARCHAR, new JdbcTypeInformation("LONGNVARCHAR", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); typeMap.put(Types.LONGVARBINARY, new JdbcTypeInformation( "LONGVARBINARY", //$NON-NLS-1$ new FullyQualifiedJavaType("byte[]"))); //$NON-NLS-1$ typeMap.put(Types.LONGVARCHAR, new JdbcTypeInformation("LONGVARCHAR", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); typeMap.put(Jdbc4Types.NCHAR, new JdbcTypeInformation("NCHAR", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); typeMap.put(Jdbc4Types.NCLOB, new JdbcTypeInformation("NCLOB", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); typeMap.put(Jdbc4Types.NVARCHAR, new JdbcTypeInformation("NVARCHAR", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); typeMap.put(Types.NULL, new JdbcTypeInformation("NULL", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Types.OTHER, new JdbcTypeInformation("OTHER", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Types.REAL, new JdbcTypeInformation("REAL", //$NON-NLS-1$ new FullyQualifiedJavaType(Float.class.getName()))); typeMap.put(Types.REF, new JdbcTypeInformation("REF", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Types.SMALLINT, new JdbcTypeInformation("SMALLINT", //$NON-NLS-1$ new FullyQualifiedJavaType(Short.class.getName()))); typeMap.put(Types.STRUCT, new JdbcTypeInformation("STRUCT", //$NON-NLS-1$ new FullyQualifiedJavaType(Object.class.getName()))); typeMap.put(Types.TIME, new JdbcTypeInformation("TIME", //$NON-NLS-1$ new FullyQualifiedJavaType(Date.class.getName()))); typeMap.put(Types.TIMESTAMP, new JdbcTypeInformation("TIMESTAMP", //$NON-NLS-1$ new FullyQualifiedJavaType(Date.class.getName()))); typeMap.put(Types.TINYINT, new JdbcTypeInformation("TINYINT", //$NON-NLS-1$ new FullyQualifiedJavaType(Byte.class.getName()))); typeMap.put(Types.VARBINARY, new JdbcTypeInformation("VARBINARY", //$NON-NLS-1$ new FullyQualifiedJavaType("byte[]"))); //$NON-NLS-1$ typeMap.put(Types.VARCHAR, new JdbcTypeInformation("VARCHAR", //$NON-NLS-1$ new FullyQualifiedJavaType(String.class.getName()))); } public void addConfigurationProperties(Properties properties) { this.properties.putAll(properties); forceBigDecimals = StringUtility .isTrue(properties .getProperty(PropertyRegistry.TYPE_RESOLVER_FORCE_BIG_DECIMALS)); } public FullyQualifiedJavaType calculateJavaType( IntrospectedColumn introspectedColumn) { FullyQualifiedJavaType answer; JdbcTypeInformation jdbcTypeInformation = typeMap .get(introspectedColumn.getJdbcType()); if (jdbcTypeInformation == null) { switch (introspectedColumn.getJdbcType()) { case Types.DECIMAL: case Types.NUMERIC: if (introspectedColumn.getScale() > 0 || introspectedColumn.getLength() > 18 || forceBigDecimals) { answer = new FullyQualifiedJavaType(BigDecimal.class .getName()); } else if (introspectedColumn.getLength() > 9) { answer = new FullyQualifiedJavaType(Long.class.getName()); } else if (introspectedColumn.getLength() > 4) { answer = new FullyQualifiedJavaType(Integer.class.getName()); } else { answer = new FullyQualifiedJavaType(Short.class.getName()); } break; default: answer = null; break; } } else { answer = jdbcTypeInformation.getFullyQualifiedJavaType(); } return answer; } public String calculateJdbcTypeName(IntrospectedColumn introspectedColumn) { String answer; JdbcTypeInformation jdbcTypeInformation = typeMap .get(introspectedColumn.getJdbcType()); if (jdbcTypeInformation == null) { switch (introspectedColumn.getJdbcType()) { case Types.DECIMAL: answer = "DECIMAL"; //$NON-NLS-1$ break; case Types.NUMERIC: answer = "NUMERIC"; //$NON-NLS-1$ break; default: answer = null; break; } } else { answer = jdbcTypeInformation.getJdbcTypeName(); } return answer; } public void setWarnings(List<String> warnings) { this.warnings = warnings; } public void setContext(Context context) { this.context = context; // TODO add String sqldate = context.getProperty("sqldate"); System.out.println("sqldate = " + sqldate); if ("true".equalsIgnoreCase(sqldate)) { typeMap.put(Types.DATE, new JdbcTypeInformation("DATE", new FullyQualifiedJavaType(java.sql.Date.class.getName()))); typeMap.put(Types.TIME, new JdbcTypeInformation("TIME", new FullyQualifiedJavaType(java.sql.Date.class.getName()))); typeMap.put(Types.TIMESTAMP, new JdbcTypeInformation("TIMESTAMP", new FullyQualifiedJavaType(java.sql.Date.class.getName()))); } } public static class JdbcTypeInformation { private String jdbcTypeName; private FullyQualifiedJavaType fullyQualifiedJavaType; public JdbcTypeInformation(String jdbcTypeName, FullyQualifiedJavaType fullyQualifiedJavaType) { this.jdbcTypeName = jdbcTypeName; this.fullyQualifiedJavaType = fullyQualifiedJavaType; } public String getJdbcTypeName() { return jdbcTypeName; } public FullyQualifiedJavaType getFullyQualifiedJavaType() { return fullyQualifiedJavaType; } } } |
|||
【jeasyui 1.4.2】form扩展 | jeasyui | ||
/** * form扩展 * @param $ */ $.extend($.fn.form.methods, { /** * getData 获取数据接口 * http://www.easyui.info/archives/138.html * 用法示例: * $("#formID").form("getData"); * $("#formID").form("getData", true); * @param jq * @param params 设置为true的话,会把string型"true"和"false"字符串值转化为boolean型。不区分大小写。 */ getData: function(jq, params){ var oRet = {}; var formArray = jq.serializeArray(); for(var i in formArray){ var v = formArray[i].value; if (params){ v = (v.toLocaleLowerCase() == "true" || v.toLocaleLowerCase() == "false") ? v.toLocaleLowerCase() == "true" : v; } if (typeof(oRet[formArray[i].name]) == 'undefined') { oRet[formArray[i].name] = v; } else { oRet[formArray[i].name] += "," + v; } } return oRet; }, /** * 获取指定控件值 * 用法示例: * $("#formID").form("getValue"); * @param jq * @param name 控件的name属性值 * @param value 设置的value值 */ getValue : function(jq, name){ var data = jq.form("getData"); return data[name]; }, /** * 设置指定控件值 * 用法示例: * $("#formID").form("setValue", {name: "email", value: "test@qq.com"}); * @param jq * @param params 控件的name/value属性键值对 */ setValue : function(jq, params) { var json = {name: '', value: ''}; $.extend(true, json, params); return jq.each(function() { var data = $(this).form("getData"); data[json.name] = json.value; $(this).form("load", data); }); }, /** * 是否禁用,针对form表单中所有的input[文本框、复选框、单选框],select[下拉选],多行文本框[textarea] * 参考:http://caizi12.iteye.com/blog/1734143 * 用法示例: * $("#form").form("disabled"); 同 $("#form").form("disabled", true); * $("#form").form("disabled", false); * @param jq * @param flag:true-禁用;false-取消禁用; * 不定义时,默认为true-禁用 */ disabled: function(jq, flag){ flag = null == flag || flag == undefined?true:flag; jq.form("readonly", flag); jq.find(":input").attr("disabled",flag); }, /** * 是否只读,针对form表单中所有的input[文本框、复选框、单选框],select[下拉选],多行文本框[textarea] * 用法示例: * $("#form").form("readonly"); 同 $("#form").form("readonly", true); * $("#form").form("readonly", false); * @param jq * @param flag:true-只读;false-取消只读; * 不定义时,默认为true-只读 */ readonly: function(jq, flag){ flag = null == flag || flag == undefined?true:flag; jq.find(":input").attr("readonly",flag); // jq.find(":text").attr("readonly",flag); // jq.find("textarea").attr("disabled",flag); // jq.find("select").attr("disabled",flag); jq.find(":radio").attr("disabled",flag); jq.find(":checkbox").attr("disabled",flag); // 禁用jquery easyui中的下拉选(使用input生成的combox) jq.find(".easyui-combobox").combobox('readonly', flag); // 禁用jquery easyui中的下拉选(使用select生成的combox) // jq.find("select[class='combobox-f combo-f']").each(function() { // if (this.id) { // $("#" + this.id).combobox(attr); // } // }); // 禁用jquery easyui中的日期组件dataBox jq.find(".easyui-datebox").datebox('readonly', flag); } }); |
|||
jsplumb | jsplumb | http://jsplumb.org/jquery/demo.html | |
jsplumb http://jsplumb.org/jquery/demo.html Qunee for HTML5 http://qunee.com/ |
|||
【jquery】page loading v2.0 | jquery | ||
/** * 解决重复遮罩问题 * loading效果,且可以重复加载而互不干扰 * 依赖于css样式: * .window-loading-img{ * background: center no-repeat url("../jeasyui/themes/images/loading.gif"); * width: 20px; * } * 其中loading.gif使用的是easyui中的图片; * 使用示例: * var l = $.loading(); // 创建loading * l.loadend(); // 移除指定的loading效果 * $.loadend(); // 移除一个loading * $.loadendAll(); // 移除所有loading效果 * @param $ */ (function($) { $.extend(jQuery, { /** * @return 返回jQuery对象,与loadend()结合,可针对单个异步ajax请求处理 */ loading: function(){ var $count = $("<div class='-window-loading-count'/>"); $('body').append($count); if($(".-window-loading-content").length > 0){ $(".-window-loading-content").show(); return $count; } var $mask = $("<div class='-window-loading-mask'/>").css({ background: '#ccc', display: 'block', opacity: '0.40', overflow: 'hidden', position: 'absolute', left: '0px', top: '0px', width: '100%', 'z-index': 8100 }); var $shadow = $("<div class='-window-loading-shadow'/>").css({ background: '#fff', display: 'block', border: '1px solid #ccc', 'box-shadow': '2px 2px 3px #cccccc', overflow: 'hidden', position: 'absolute', 'z-index': 8110 }); var html = '<table><tr><td style="height:2em; width: .5em;"></td>'; html += '<td class="window-loading-img"></td>'; html += '<td style="padding-right: .5em;">正在加载,请等待...</td>'; html += '</tr></table>'; $shadow.append($(html)); var $loading = $("<div class='-window-loading-content'/>").append($mask).append($shadow); $('body').append($loading); var shadow_h = $shadow.height(); var shadow_w = $shadow.width(); _resizeLoading(); $(window).bind('resize', function(){ _resizeLoading(); }); function _resizeLoading(){ $(".-window-loading-mask").height(0); var h = $(window).height(); h = h > $(document).height() ? h : $(document).height(); $(".-window-loading-mask").height(h); var l = ($(window).width() - shadow_w) * 1/2; var t = ($(window).height() - shadow_h) * 1/3; $(".-window-loading-shadow").offset({left: l, top: t}); } return $count; }, /** * 移除所有loading效果 */ loadendAll: function(){ $(".-window-loading-content").hide(); $(".-window-loading-count").remove(); }, /** * 随机移除一个loading */ loadend: function(){ var $count = $(".-window-loading-count"); if($count.length > 0){ $($count[0]).loadend(); } } }); $.fn.extend({ /** * 移除指定的loading */ loadend: function(){ $(this).remove(); var $count = $(".-window-loading-count"); if(null == $count || $count == undefined || $count.length == 0){ $(".-window-loading-content").hide(); } } }); })(jQuery); /** * 设置全局 AJAX 默认选项 */ $.ajaxSetup({ beforeSend: function(XMLHttpRequest){ $.loading(); }, complete: function(XMLHttpRequest, textStatus){ $.loadend(); } }) |
|||
【jquery】page loading | jquery | ||
/** * loading效果,且可以重复加载而互不干扰 * 依赖于css样式: * .window-loading-img{ * background: center no-repeat url("../jeasyui/themes/images/loading.gif"); * width: 20px; * } * 其中loading.gif使用的是easyui中的图片; * 使用示例: * var l = $.loading(); // 创建loading * l.hideloading(); // 移除指定的loading效果 * $.loadendAll(); // 移除所有loading效果 * @param $ */ (function($) { $.extend(jQuery, { /** * @return 返回jQuery对象,与loadend()结合,可针对单个异步ajax请求处理 */ loading: function(){ var $mask = $("<div class='-window-loading-mask'/>").css({ background: '#ccc', display: 'block', opacity: '0.20', overflow: 'hidden', position: 'absolute', left: '0px', top: '0px', width: '100%', 'z-index': 8100 }); var $shadow = $("<div class='-window-loading-shadow'/>").css({ background: '#fff', display: 'block', border: '1px solid #ccc', 'box-shadow': '2px 2px 3px #cccccc', overflow: 'hidden', position: 'absolute', 'z-index': 8110 }); var html = '<table><tr><td style="height:2em; width: .5em;"></td>'; html += '<td class="window-loading-img"></td>'; html += '<td style="padding-right: .5em;">正在加载,请等待...</td>'; html += '</tr></table>'; $shadow.append($(html)); var $loading = $("<div class='-window-loading-content'/>").append($mask).append($shadow); $('body').append($loading); var shadow_h = $shadow.height(); var shadow_w = $shadow.width(); _resizeLoading(); $(window).bind('resize', function(){ _resizeLoading(); }); function _resizeLoading(){ $(".-window-loading-mask").height(0); var h = $(window).height(); h = h > $(document).height() ? h : $(document).height(); $(".-window-loading-mask").height(h); var l = ($(window).width() - shadow_w) * 1/2; var t = ($(window).height() - shadow_h) * 1/3; $(".-window-loading-shadow").offset({left: l, top: t}); } return $loading; }, /** * 移除所有loading效果 */ loadendAll: function(){ $(".-window-loading-content").remove(); } }); $.fn.extend({ /** * 移除指定的loading */ loadend: function(){ $(this).remove(); } }); })(jQuery); |
|||
【spring mvc】mybatis-generator之DatabaseIntrospector.java | spring mvc | ||
/* * Copyright 2005 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mybatis.generator.internal.db; import static org.mybatis.generator.internal.util.JavaBeansUtil.getCamelCaseString; import static org.mybatis.generator.internal.util.JavaBeansUtil.getValidPropertyName; import static org.mybatis.generator.internal.util.StringUtility.composeFullyQualifiedTableName; import static org.mybatis.generator.internal.util.StringUtility.isTrue; import static org.mybatis.generator.internal.util.StringUtility.stringContainsSQLWildcard; import static org.mybatis.generator.internal.util.StringUtility.stringContainsSpace; import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; import static org.mybatis.generator.internal.util.messages.Messages.getString; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.mybatis.generator.api.FullyQualifiedTable; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.JavaTypeResolver; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.config.ColumnOverride; import org.mybatis.generator.config.Context; import org.mybatis.generator.config.GeneratedKey; import org.mybatis.generator.config.PropertyRegistry; import org.mybatis.generator.config.TableConfiguration; import org.mybatis.generator.internal.ObjectFactory; import org.mybatis.generator.logging.Log; import org.mybatis.generator.logging.LogFactory; /** * <a href="http://blog.csdn.net/isea533/article/details/42102297">MyBatis Generator 详解</a><br> * table 元素:schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。 * <br> * 因此重写本类,在table 元素中不配置schema时,采用content中的property配置。 * context节点中配置示例: * <property name="schema" value="lis_dev"/> * @author Jeff Butler */ public class DatabaseIntrospector { private DatabaseMetaData databaseMetaData; private JavaTypeResolver javaTypeResolver; private List<String> warnings; private Context context; private Log logger; public DatabaseIntrospector(Context context, DatabaseMetaData databaseMetaData, JavaTypeResolver javaTypeResolver, List<String> warnings) { super(); this.context = context; this.databaseMetaData = databaseMetaData; this.javaTypeResolver = javaTypeResolver; this.warnings = warnings; logger = LogFactory.getLog(getClass()); } private void calculatePrimaryKey(FullyQualifiedTable table, IntrospectedTable introspectedTable) { ResultSet rs = null; try { rs = databaseMetaData.getPrimaryKeys( table.getIntrospectedCatalog(), table .getIntrospectedSchema(), table .getIntrospectedTableName()); } catch (SQLException e) { closeResultSet(rs); warnings.add(getString("Warning.15")); //$NON-NLS-1$ return; } try { // keep primary columns in key sequence order Map<Short, String> keyColumns = new TreeMap<Short, String>(); while (rs.next()) { String columnName = rs.getString("COLUMN_NAME"); //$NON-NLS-1$ short keySeq = rs.getShort("KEY_SEQ"); //$NON-NLS-1$ keyColumns.put(keySeq, columnName); } for (String columnName : keyColumns.values()) { introspectedTable.addPrimaryKeyColumn(columnName); } } catch (SQLException e) { // ignore the primary key if there's any error } finally { closeResultSet(rs); } } private void closeResultSet(ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { // ignore ; } } } private void reportIntrospectionWarnings( IntrospectedTable introspectedTable, TableConfiguration tableConfiguration, FullyQualifiedTable table) { // make sure that every column listed in column overrides // actually exists in the table for (ColumnOverride columnOverride : tableConfiguration .getColumnOverrides()) { if (introspectedTable.getColumn(columnOverride.getColumnName()) == null) { warnings.add(getString("Warning.3", //$NON-NLS-1$ columnOverride.getColumnName(), table.toString())); } } // make sure that every column listed in ignored columns // actually exists in the table for (String string : tableConfiguration.getIgnoredColumnsInError()) { warnings.add(getString("Warning.4", //$NON-NLS-1$ string, table.toString())); } GeneratedKey generatedKey = tableConfiguration.getGeneratedKey(); if (generatedKey != null && introspectedTable.getColumn(generatedKey.getColumn()) == null) { if (generatedKey.isIdentity()) { warnings.add(getString("Warning.5", //$NON-NLS-1$ generatedKey.getColumn(), table.toString())); } else { warnings.add(getString("Warning.6", //$NON-NLS-1$ generatedKey.getColumn(), table.toString())); } } } /** * Returns a List<IntrospectedTable> that matches the specified table * configuration. * * @param tc * @return a list of introspected tables * @throws SQLException */ public List<IntrospectedTable> introspectTables(TableConfiguration tc) throws SQLException { // get the raw columns from the DB Map<ActualTableName, List<IntrospectedColumn>> columns = getColumns(tc); if (columns.isEmpty()) { warnings.add(getString("Warning.19", tc.getCatalog(), //$NON-NLS-1$ tc.getSchema(), tc.getTableName())); return null; } removeIgnoredColumns(tc, columns); calculateExtraColumnInformation(tc, columns); applyColumnOverrides(tc, columns); calculateIdentityColumns(tc, columns); List<IntrospectedTable> introspectedTables = calculateIntrospectedTables( tc, columns); // now introspectedTables has all the columns from all the // tables in the configuration. Do some validation... Iterator<IntrospectedTable> iter = introspectedTables.iterator(); while (iter.hasNext()) { IntrospectedTable introspectedTable = iter.next(); if (!introspectedTable.hasAnyColumns()) { // add warning that the table has no columns, remove from the // list String warning = getString( "Warning.1", introspectedTable.getFullyQualifiedTable().toString()); //$NON-NLS-1$ warnings.add(warning); iter.remove(); } else if (!introspectedTable.hasPrimaryKeyColumns() && !introspectedTable.hasBaseColumns()) { // add warning that the table has only BLOB columns, remove from // the list String warning = getString( "Warning.18", introspectedTable.getFullyQualifiedTable().toString()); //$NON-NLS-1$ warnings.add(warning); iter.remove(); } else { // now make sure that all columns called out in the // configuration // actually exist reportIntrospectionWarnings(introspectedTable, tc, introspectedTable.getFullyQualifiedTable()); } } return introspectedTables; } /** * @param tc * @param columns */ private void removeIgnoredColumns(TableConfiguration tc, Map<ActualTableName, List<IntrospectedColumn>> columns) { for (Map.Entry<ActualTableName, List<IntrospectedColumn>> entry : columns .entrySet()) { Iterator<IntrospectedColumn> tableColumns = (entry.getValue()) .iterator(); while (tableColumns.hasNext()) { IntrospectedColumn introspectedColumn = tableColumns.next(); if (tc .isColumnIgnored(introspectedColumn .getActualColumnName())) { tableColumns.remove(); if (logger.isDebugEnabled()) { logger.debug(getString("Tracing.3", //$NON-NLS-1$ introspectedColumn.getActualColumnName(), entry .getKey().toString())); } } } } } private void calculateExtraColumnInformation(TableConfiguration tc, Map<ActualTableName, List<IntrospectedColumn>> columns) { StringBuilder sb = new StringBuilder(); Pattern pattern = null; String replaceString = null; if (tc.getColumnRenamingRule() != null) { pattern = Pattern.compile(tc.getColumnRenamingRule() .getSearchString()); replaceString = tc.getColumnRenamingRule().getReplaceString(); replaceString = replaceString == null ? "" : replaceString; //$NON-NLS-1$ } for (Map.Entry<ActualTableName, List<IntrospectedColumn>> entry : columns .entrySet()) { for (IntrospectedColumn introspectedColumn : entry.getValue()) { String calculatedColumnName; if (pattern == null) { calculatedColumnName = introspectedColumn .getActualColumnName(); } else { Matcher matcher = pattern.matcher(introspectedColumn .getActualColumnName()); calculatedColumnName = matcher.replaceAll(replaceString); } if (isTrue(tc .getProperty(PropertyRegistry.TABLE_USE_ACTUAL_COLUMN_NAMES))) { introspectedColumn.setJavaProperty( getValidPropertyName(calculatedColumnName)); } else if (isTrue(tc .getProperty(PropertyRegistry.TABLE_USE_COMPOUND_PROPERTY_NAMES))) { sb.setLength(0); sb.append(calculatedColumnName); sb.append('_'); sb.append(getCamelCaseString( introspectedColumn.getRemarks(), true)); introspectedColumn.setJavaProperty( getValidPropertyName(sb.toString())); } else { introspectedColumn.setJavaProperty( getCamelCaseString(calculatedColumnName, false)); } FullyQualifiedJavaType fullyQualifiedJavaType = javaTypeResolver .calculateJavaType(introspectedColumn); if (fullyQualifiedJavaType != null) { introspectedColumn .setFullyQualifiedJavaType(fullyQualifiedJavaType); introspectedColumn.setJdbcTypeName(javaTypeResolver .calculateJdbcTypeName(introspectedColumn)); } else { // type cannot be resolved. Check for ignored or overridden boolean warn = true; if (tc.isColumnIgnored(introspectedColumn .getActualColumnName())) { warn = false; } ColumnOverride co = tc.getColumnOverride(introspectedColumn .getActualColumnName()); if (co != null) { if (stringHasValue(co.getJavaType()) && stringHasValue(co.getJavaType())) { warn = false; } } // if the type is not supported, then we'll report a warning if (warn) { introspectedColumn .setFullyQualifiedJavaType(FullyQualifiedJavaType .getObjectInstance()); introspectedColumn.setJdbcTypeName("OTHER"); //$NON-NLS-1$ String warning = getString("Warning.14", //$NON-NLS-1$ Integer.toString(introspectedColumn.getJdbcType()), entry.getKey().toString(), introspectedColumn.getActualColumnName()); warnings.add(warning); } } if (context.autoDelimitKeywords()) { if (SqlReservedWords.containsWord(introspectedColumn .getActualColumnName())) { introspectedColumn.setColumnNameDelimited(true); } } if (tc.isAllColumnDelimitingEnabled()) { introspectedColumn.setColumnNameDelimited(true); } } } } private void calculateIdentityColumns(TableConfiguration tc, Map<ActualTableName, List<IntrospectedColumn>> columns) { GeneratedKey gk = tc.getGeneratedKey(); if (gk == null) { // no generated key, then no identity or sequence columns return; } for (Map.Entry<ActualTableName, List<IntrospectedColumn>> entry : columns .entrySet()) { for (IntrospectedColumn introspectedColumn : entry.getValue()) { if (isMatchedColumn(introspectedColumn, gk)) { if (gk.isIdentity() || gk.isJdbcStandard()) { introspectedColumn.setIdentity(true); introspectedColumn.setSequenceColumn(false); } else { introspectedColumn.setIdentity(false); introspectedColumn.setSequenceColumn(true); } } } } } private boolean isMatchedColumn(IntrospectedColumn introspectedColumn, GeneratedKey gk) { if (introspectedColumn.isColumnNameDelimited()) { return introspectedColumn.getActualColumnName().equals(gk.getColumn()); } else { return introspectedColumn.getActualColumnName().equalsIgnoreCase(gk.getColumn()); } } private void applyColumnOverrides(TableConfiguration tc, Map<ActualTableName, List<IntrospectedColumn>> columns) { for (Map.Entry<ActualTableName, List<IntrospectedColumn>> entry : columns .entrySet()) { for (IntrospectedColumn introspectedColumn : entry.getValue()) { ColumnOverride columnOverride = tc .getColumnOverride(introspectedColumn .getActualColumnName()); if (columnOverride != null) { if (logger.isDebugEnabled()) { logger.debug(getString("Tracing.4", //$NON-NLS-1$ introspectedColumn.getActualColumnName(), entry .getKey().toString())); } if (stringHasValue(columnOverride .getJavaProperty())) { introspectedColumn.setJavaProperty(columnOverride .getJavaProperty()); } if (stringHasValue(columnOverride .getJavaType())) { introspectedColumn .setFullyQualifiedJavaType(new FullyQualifiedJavaType( columnOverride.getJavaType())); } if (stringHasValue(columnOverride .getJdbcType())) { introspectedColumn.setJdbcTypeName(columnOverride .getJdbcType()); } if (stringHasValue(columnOverride .getTypeHandler())) { introspectedColumn.setTypeHandler(columnOverride .getTypeHandler()); } if (columnOverride.isColumnNameDelimited()) { introspectedColumn.setColumnNameDelimited(true); } introspectedColumn.setProperties(columnOverride .getProperties()); } } } } /** * This method returns a Map<ActualTableName, List<ColumnDefinitions>> of * columns returned from the database introspection. * * @param tc * @return introspected columns * @throws SQLException */ private Map<ActualTableName, List<IntrospectedColumn>> getColumns( TableConfiguration tc) throws SQLException { String localCatalog; String localSchema; String localTableName; // TODO String schema = context.getProperty("schema"); if (StringUtils.isBlank(schema)) { schema = null; } boolean delimitIdentifiers = tc.isDelimitIdentifiers() || stringContainsSpace(tc.getCatalog()) || stringContainsSpace(tc.getSchema()) || stringContainsSpace(tc.getTableName()); if (delimitIdentifiers) { localCatalog = tc.getCatalog(); localSchema = tc.getSchema(); localTableName = tc.getTableName(); } else if (databaseMetaData.storesLowerCaseIdentifiers()) { localCatalog = tc.getCatalog() == null ? null : tc.getCatalog() .toLowerCase(); localSchema = tc.getSchema() == null ? null : tc.getSchema() .toLowerCase(); localTableName = tc.getTableName() == null ? null : tc .getTableName().toLowerCase(); // TODO add schema = null == schema ? null : schema.toLowerCase(); } else if (databaseMetaData.storesUpperCaseIdentifiers()) { localCatalog = tc.getCatalog() == null ? null : tc.getCatalog() .toUpperCase(); localSchema = tc.getSchema() == null ? null : tc.getSchema() .toUpperCase(); localTableName = tc.getTableName() == null ? null : tc .getTableName().toUpperCase(); // TODO add schema = null == schema ? null : schema.toUpperCase(); } else { localCatalog = tc.getCatalog(); localSchema = tc.getSchema(); localTableName = tc.getTableName(); } if (tc.isWildcardEscapingEnabled()) { String escapeString = databaseMetaData.getSearchStringEscape(); StringBuilder sb = new StringBuilder(); StringTokenizer st; if (localSchema != null) { st = new StringTokenizer(localSchema, "_%", true); //$NON-NLS-1$ while (st.hasMoreTokens()) { String token = st.nextToken(); if (token.equals("_") //$NON-NLS-1$ || token.equals("%")) { //$NON-NLS-1$ sb.append(escapeString); } sb.append(token); } localSchema = sb.toString(); } sb.setLength(0); st = new StringTokenizer(localTableName, "_%", true); //$NON-NLS-1$ while (st.hasMoreTokens()) { String token = st.nextToken(); if (token.equals("_") //$NON-NLS-1$ || token.equals("%")) { //$NON-NLS-1$ sb.append(escapeString); } sb.append(token); } localTableName = sb.toString(); } Map<ActualTableName, List<IntrospectedColumn>> answer = new HashMap<ActualTableName, List<IntrospectedColumn>>(); if (logger.isDebugEnabled()) { String fullTableName = composeFullyQualifiedTableName(localCatalog, localSchema, localTableName, '.'); logger.debug(getString("Tracing.1", fullTableName)); //$NON-NLS-1$ } // ResultSet rs = databaseMetaData.getColumns(localCatalog, localSchema, // localTableName, null); // TODO edit String tSchema = StringUtils.isNotBlank(localSchema) ? localSchema : schema; ResultSet rs = databaseMetaData.getColumns(localCatalog, tSchema, localTableName, null); while (rs.next()) { IntrospectedColumn introspectedColumn = ObjectFactory .createIntrospectedColumn(context); introspectedColumn.setTableAlias(tc.getAlias()); introspectedColumn.setJdbcType(rs.getInt("DATA_TYPE")); //$NON-NLS-1$ introspectedColumn.setLength(rs.getInt("COLUMN_SIZE")); //$NON-NLS-1$ introspectedColumn.setActualColumnName(rs.getString("COLUMN_NAME")); //$NON-NLS-1$ introspectedColumn .setNullable(rs.getInt("NULLABLE") == DatabaseMetaData.columnNullable); //$NON-NLS-1$ introspectedColumn.setScale(rs.getInt("DECIMAL_DIGITS")); //$NON-NLS-1$ introspectedColumn.setRemarks(rs.getString("REMARKS")); //$NON-NLS-1$ introspectedColumn.setDefaultValue(rs.getString("COLUMN_DEF")); //$NON-NLS-1$ ActualTableName atn = new ActualTableName( rs.getString("TABLE_CAT"), //$NON-NLS-1$ rs.getString("TABLE_SCHEM"), //$NON-NLS-1$ rs.getString("TABLE_NAME")); //$NON-NLS-1$ List<IntrospectedColumn> columns = answer.get(atn); if (columns == null) { columns = new ArrayList<IntrospectedColumn>(); answer.put(atn, columns); } columns.add(introspectedColumn); if (logger.isDebugEnabled()) { logger.debug(getString( "Tracing.2", //$NON-NLS-1$ introspectedColumn.getActualColumnName(), Integer .toString(introspectedColumn.getJdbcType()), atn.toString())); } } closeResultSet(rs); if (answer.size() > 1 && !stringContainsSQLWildcard(localSchema) && !stringContainsSQLWildcard(localTableName)) { // issue a warning if there is more than one table and // no wildcards were used ActualTableName inputAtn = new ActualTableName(tc.getCatalog(), tc .getSchema(), tc.getTableName()); StringBuilder sb = new StringBuilder(); boolean comma = false; for (ActualTableName atn : answer.keySet()) { if (comma) { sb.append(','); } else { comma = true; } sb.append(atn.toString()); } warnings.add(getString("Warning.25", //$NON-NLS-1$ inputAtn.toString(), sb.toString())); } return answer; } private List<IntrospectedTable> calculateIntrospectedTables( TableConfiguration tc, Map<ActualTableName, List<IntrospectedColumn>> columns) { boolean delimitIdentifiers = tc.isDelimitIdentifiers() || stringContainsSpace(tc.getCatalog()) || stringContainsSpace(tc.getSchema()) || stringContainsSpace(tc.getTableName()); List<IntrospectedTable> answer = new ArrayList<IntrospectedTable>(); for (Map.Entry<ActualTableName, List<IntrospectedColumn>> entry : columns .entrySet()) { ActualTableName atn = entry.getKey(); // we only use the returned catalog and schema if something was // actually // specified on the table configuration. If something was returned // from the DB for these fields, but nothing was specified on the // table // configuration, then some sort of DB default is being returned // and we don't want that in our SQL FullyQualifiedTable table = new FullyQualifiedTable( stringHasValue(tc.getCatalog()) ? atn .getCatalog() : null, stringHasValue(tc.getSchema()) ? atn .getSchema() : null, atn.getTableName(), tc.getDomainObjectName(), tc.getAlias(), isTrue(tc.getProperty(PropertyRegistry.TABLE_IGNORE_QUALIFIERS_AT_RUNTIME)), tc.getProperty(PropertyRegistry.TABLE_RUNTIME_CATALOG), tc.getProperty(PropertyRegistry.TABLE_RUNTIME_SCHEMA), tc.getProperty(PropertyRegistry.TABLE_RUNTIME_TABLE_NAME), delimitIdentifiers, context); IntrospectedTable introspectedTable = ObjectFactory .createIntrospectedTable(tc, table, context); for (IntrospectedColumn introspectedColumn : entry.getValue()) { introspectedTable.addColumn(introspectedColumn); } calculatePrimaryKey(table, introspectedTable); answer.add(introspectedTable); } return answer; } } |
|||
【spring mvc】mybatis-generator之IntrospectedTableMyBatis3Impl.java | spring mvc | ||
/* * Copyright 2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mybatis.generator.codegen.mybatis3; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.GeneratedJavaFile; import org.mybatis.generator.api.GeneratedXmlFile; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.ProgressCallback; import org.mybatis.generator.api.dom.java.CompilationUnit; import org.mybatis.generator.api.dom.xml.Document; import org.mybatis.generator.codegen.AbstractGenerator; import org.mybatis.generator.codegen.AbstractJavaClientGenerator; import org.mybatis.generator.codegen.AbstractJavaGenerator; import org.mybatis.generator.codegen.AbstractXmlGenerator; import org.mybatis.generator.codegen.mybatis3.javamapper.AnnotatedClientGenerator; import org.mybatis.generator.codegen.mybatis3.javamapper.JavaMapperGenerator; import org.mybatis.generator.codegen.mybatis3.javamapper.MixedClientGenerator; import org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator; import org.mybatis.generator.codegen.mybatis3.model.ExampleGenerator; import org.mybatis.generator.codegen.mybatis3.model.PrimaryKeyGenerator; import org.mybatis.generator.codegen.mybatis3.model.RecordWithBLOBsGenerator; import org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator; import org.mybatis.generator.config.PropertyRegistry; import org.mybatis.generator.internal.ObjectFactory; /** * 重写,以支持mergeable属性<br> * 可不用重新打包jar,直接在工程中按此包结构重写即可 * @author Jeff Butler * */ public class IntrospectedTableMyBatis3Impl extends IntrospectedTable { protected List<AbstractJavaGenerator> javaModelGenerators; protected List<AbstractJavaGenerator> clientGenerators; protected AbstractXmlGenerator xmlMapperGenerator; public IntrospectedTableMyBatis3Impl() { super(TargetRuntime.MYBATIS3); javaModelGenerators = new ArrayList<AbstractJavaGenerator>(); clientGenerators = new ArrayList<AbstractJavaGenerator>(); } @Override public void calculateGenerators(List<String> warnings, ProgressCallback progressCallback) { calculateJavaModelGenerators(warnings, progressCallback); AbstractJavaClientGenerator javaClientGenerator = calculateClientGenerators(warnings, progressCallback); calculateXmlMapperGenerator(javaClientGenerator, warnings, progressCallback); } protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, List<String> warnings, ProgressCallback progressCallback) { if (javaClientGenerator == null) { if (context.getSqlMapGeneratorConfiguration() != null) { xmlMapperGenerator = new XMLMapperGenerator(); } } else { xmlMapperGenerator = javaClientGenerator.getMatchedXMLGenerator(); } initializeAbstractGenerator(xmlMapperGenerator, warnings, progressCallback); } /** * * @param warnings * @param progressCallback * @return true if an XML generator is required */ protected AbstractJavaClientGenerator calculateClientGenerators(List<String> warnings, ProgressCallback progressCallback) { if (!rules.generateJavaClient()) { return null; } AbstractJavaClientGenerator javaGenerator = createJavaClientGenerator(); if (javaGenerator == null) { return null; } initializeAbstractGenerator(javaGenerator, warnings, progressCallback); clientGenerators.add(javaGenerator); return javaGenerator; } protected AbstractJavaClientGenerator createJavaClientGenerator() { if (context.getJavaClientGeneratorConfiguration() == null) { return null; } String type = context.getJavaClientGeneratorConfiguration() .getConfigurationType(); AbstractJavaClientGenerator javaGenerator; if ("XMLMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$ javaGenerator = new JavaMapperGenerator(); } else if ("MIXEDMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$ javaGenerator = new MixedClientGenerator(); } else if ("ANNOTATEDMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$ javaGenerator = new AnnotatedClientGenerator(); } else if ("MAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$ javaGenerator = new JavaMapperGenerator(); } else { javaGenerator = (AbstractJavaClientGenerator) ObjectFactory .createInternalObject(type); } return javaGenerator; } protected void calculateJavaModelGenerators(List<String> warnings, ProgressCallback progressCallback) { if (getRules().generateExampleClass()) { AbstractJavaGenerator javaGenerator = new ExampleGenerator(); initializeAbstractGenerator(javaGenerator, warnings, progressCallback); javaModelGenerators.add(javaGenerator); } if (getRules().generatePrimaryKeyClass()) { AbstractJavaGenerator javaGenerator = new PrimaryKeyGenerator(); initializeAbstractGenerator(javaGenerator, warnings, progressCallback); javaModelGenerators.add(javaGenerator); } if (getRules().generateBaseRecordClass()) { AbstractJavaGenerator javaGenerator = new BaseRecordGenerator(); initializeAbstractGenerator(javaGenerator, warnings, progressCallback); javaModelGenerators.add(javaGenerator); } if (getRules().generateRecordWithBLOBsClass()) { AbstractJavaGenerator javaGenerator = new RecordWithBLOBsGenerator(); initializeAbstractGenerator(javaGenerator, warnings, progressCallback); javaModelGenerators.add(javaGenerator); } } protected void initializeAbstractGenerator( AbstractGenerator abstractGenerator, List<String> warnings, ProgressCallback progressCallback) { if (abstractGenerator == null) { return; } abstractGenerator.setContext(context); abstractGenerator.setIntrospectedTable(this); abstractGenerator.setProgressCallback(progressCallback); abstractGenerator.setWarnings(warnings); } @Override public List<GeneratedJavaFile> getGeneratedJavaFiles() { List<GeneratedJavaFile> answer = new ArrayList<GeneratedJavaFile>(); for (AbstractJavaGenerator javaGenerator : javaModelGenerators) { List<CompilationUnit> compilationUnits = javaGenerator .getCompilationUnits(); for (CompilationUnit compilationUnit : compilationUnits) { GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit, context.getJavaModelGeneratorConfiguration() .getTargetProject(), context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING), context.getJavaFormatter()); answer.add(gjf); } } for (AbstractJavaGenerator javaGenerator : clientGenerators) { List<CompilationUnit> compilationUnits = javaGenerator .getCompilationUnits(); for (CompilationUnit compilationUnit : compilationUnits) { GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit, context.getJavaClientGeneratorConfiguration() .getTargetProject(), context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING), context.getJavaFormatter()); answer.add(gjf); } } return answer; } @Override public List<GeneratedXmlFile> getGeneratedXmlFiles() { List<GeneratedXmlFile> answer = new ArrayList<GeneratedXmlFile>(); if (xmlMapperGenerator != null) { Document document = xmlMapperGenerator.getDocument(); /** * 原来中的 GeneratedXmlFile 保留;将其中构造函数中的true 修改为 : false; 设置 * isMergeable = false; 在生成 xml文件的时候,将不是合并,而是直接覆盖; */ // GeneratedXmlFile gxf = new GeneratedXmlFile(document, // getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(), // context.getSqlMapGeneratorConfiguration().getTargetProject(), // true, context.getXmlFormatter()); String tmp = context.getProperty("mergeable"); boolean mergeable = false; if ("true".equalsIgnoreCase(tmp)) { mergeable = true; } GeneratedXmlFile gxf = new GeneratedXmlFile(document, getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(), context .getSqlMapGeneratorConfiguration() .getTargetProject(), mergeable, context.getXmlFormatter()); if (context.getPlugins().sqlMapGenerated(gxf, this)) { answer.add(gxf); } } return answer; } @Override public int getGenerationSteps() { return javaModelGenerators.size() + clientGenerators.size() + (xmlMapperGenerator == null ? 0 : 1); } @Override public boolean isJava5Targeted() { return true; } @Override public boolean requiresXMLGenerator() { AbstractJavaClientGenerator javaClientGenerator = createJavaClientGenerator(); if (javaClientGenerator == null) { return false; } else { return javaClientGenerator.requiresXMLGenerator(); } } } |
|||
【spring mvc】mybatis-generator | spring mvc | ||
<!-- MyBatis Generator中文文档:http://blog.csdn.net/isea533/article/details/42102297 使用Mybatis的Generator可能导致的一个错误: http://www.tuicool.com/articles/MN7bAbF mybatis-generator重新生成代码时的SQL映射文件覆盖: http://my.oschina.net/u/140938/blog/220006 --> <!-- maven 依赖 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> <scope>test</scope> </dependency> --> <!-- XML示例 --> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <properties resource="system-config/dev.properties"/> <!-- 配置mysql 驱动jar包路径.用了绝对路径 --> <!-- <classPathEntry --> <!-- <classPathEntry location="D:\Maven2\repository\net\sourceforge\jtds\jtds\1.3.0\jtds-1.3.0.jar"/> --> <!-- <classPathEntry location="D:\maven\repository\com\microsoft\sqlserver\sqljdbc4\4.2.0\sqljdbc4-4.2.0.jar"/> --> <!-- 为了防止生成的代码中有很多注释,比较难看,加入下面的配置控制 --> <context id="lis_tables" targetRuntime="MyBatis3" defaultModelType="flat"> <property name="mergeable" value="false"/> <property name="schema" value="lis_dev"/> <property name="sqldate" value="true"/> <commentGenerator> <!-- 去除自动生成的注释 --> <property name="suppressAllComments" value="true" /> <!-- 阻止生成的注释包含时间戳 --> <property name="suppressDate" value="true" /> </commentGenerator> <!-- 注释控制完毕 --> <!-- 数据库连接 --> <jdbcConnection driverClass="${lis.jdbc.driverClassName}" connectionURL="${lis.jdbc.url}" userId="${lis.jdbc.username}" password="${lis.jdbc.password}"> </jdbcConnection> <!-- <jdbcConnection driverClass="com.mysql.jdbc.Driver" --> <!-- connectionURL="jdbc:mysql://localhost:3306/cignacmb" --> <!-- userId="root" password="root"> --> <!-- </jdbcConnection> --> <!-- com.microsoft.sqlserver.jdbc.SQLServerDriver --> <!-- <jdbcConnection driverClass="net.sourceforge.jtds.jdbc.Driver" --> <!-- connectionURL="jdbc:jtds:sqlserver://SD-20120429CJGQ;DatabaseName=cignacmb" --> <!-- userId="lg_dev" password="lg_dev"> --> <!-- </jdbcConnection> --> <!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" --> <!-- connectionURL="jdbc:oracle:thin:@10.141.141.131:1521:gis" --> <!-- userId="lis_dev" password="lis_dev"> --> <!-- </jdbcConnection> --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 数据表对应的model 层 --> <javaModelGenerator targetPackage="com.cignacmb.productdef.lis.model.pub" targetProject="src/main/java"> <!-- <property name="constructorBased" value="true" /> --> <property name="enableSubPackages" value="false" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- sql mapper 映射配置文件 --> <sqlMapGenerator targetPackage="com.cignacmb.productdef.lis.mapper.pub" targetProject="src/main/resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- 在ibatis2 中是dao层,但在mybatis3中,其实就是mapper接口 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.cignacmb.productdef.lis.mapper.pub" targetProject="src/main/java"> </javaClientGenerator> <!-- 要对那些数据表进行生成操作,必须要有一个. --> <table tableName="pd_lmrisk" domainObjectName="PDLMRiskModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_lmriskapp" domainObjectName="PDLMRiskAppModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_lmriskpay" domainObjectName="PDLMRiskPayModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_lmriskrela" domainObjectName="PDLMRiskRelaModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_lmriskduty" domainObjectName="PDLMRiskDutyModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_lmduty" domainObjectName="PDLMDutyModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_lmdutypay" domainObjectName="PDLMDutyPayModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_lmdutyget" domainObjectName="PDLMDutyGetModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="ldmaxno" domainObjectName="LDMaxNoModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="pd_basefield" domainObjectName="PDBaseFieldModel" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> </context> </generatorConfiguration> <!-- java调用 --> public static void main(String[] args) { Logger logger = Logger.getLogger(GenMain.class); long startTime = System.currentTimeMillis(); logger.info("start ..."); List<String> warnings = new ArrayList<String>(); boolean overwrite = true; String genCfg = "/mbgConfiguration.xml"; File configFile = new File(GenMain.class.getResource(genCfg).getFile()); ConfigurationParser cp = new ConfigurationParser(warnings); DefaultShellCallback callback = new DefaultShellCallback(overwrite); try { Configuration config = cp.parseConfiguration(configFile); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } catch (InvalidConfigurationException e) { logger.error(e.getMessage(), e); } catch (SQLException e) { logger.error(e.getMessage(), e); } catch (IOException e) { logger.error(e.getMessage(), e); } catch (InterruptedException e) { logger.error(e.getMessage(), e); } catch (XMLParserException e) { logger.error(e.getMessage(), e); } logger.info("end ... >> " + (System.currentTimeMillis() - startTime)); } |
|||
【spring mvc】乱码问题 | spring mvc | ||
<!-- web.xml 可解决post乱码问题 --> <!-- 编码格式 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- jsp-config 用来说明包含的页面默认按照什么编码格式包含。web-app 标签的version必须是2.4的 --> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude></include-prelude> <include-coda></include-coda> </jsp-property-group> </jsp-config> <!-- 如果get方式乱码,一般是将tomcat中conf目录下server.xml文件中加入: --> <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" /> |
|||
【jeasyui 1.4.2】methods扩展之editCell | jeasyui | 编辑单元格数据 | |
/** * 单元格单击编辑,及禁用单元格单击编辑扩展 * EasyUI中文站 1.4.2 - jQuery EasyUI * http://92ui.net/index.aspx * 需再扩展: * 移除焦点后自动提交 * * 调用示例: * $("#dg").datagrid('enableCellEditing'); * $("#dg").datagrid('disabledCellEditing'); */ $.extend($.fn.datagrid.methods, { editCell : function(jq, param) { return jq.each(function() { var opts = $(this).datagrid('options'); var fields = $(this).datagrid('getColumnFields', true).concat( $(this).datagrid('getColumnFields')); for (var i = 0; i < fields.length; i++) { var col = $(this).datagrid('getColumnOption', fields[i]); col.editor1 = col.editor; if (fields[i] != param.field) { col.editor = null; } } $(this).datagrid('beginEdit', param.index); var ed = $(this).datagrid('getEditor', param); if (ed) { if ($(ed.target).hasClass('textbox-f')) { $(ed.target).textbox('textbox').focus(); } else { $(ed.target).focus(); } } for (var i = 0; i < fields.length; i++) { var col = $(this).datagrid('getColumnOption', fields[i]); col.editor = col.editor1; } }); }, /** * 开启单元格单击编辑 */ enableCellEditing : function(jq) { return jq.each(function() { var dg = $(this); var opts = dg.datagrid('options'); opts.oldOnClickCell = opts.onClickCell; opts.onClickCell = function(index, field) { if (opts.editIndex != undefined) { if (dg.datagrid('validateRow', opts.editIndex)) { dg.datagrid('endEdit', opts.editIndex); opts.editIndex = undefined; } else { return; } } dg.datagrid('selectRow', index).datagrid('editCell', { index : index, field : field }); opts.editIndex = index; opts.oldOnClickCell.call(this, index, field); } }); }, /** * 禁用单元格单击编辑 */ disabledCellEditing: function(jq){ } }); |
|||
【jquery】页面数据加载 | jquery | ||
/** * 将DIV层里的所有元素按Name/Value的形式转换成JSON对象<br> * @param div * @return */ function divIntegrateToJSON(div){ var json = {}; var $paras = $("#" + div).find(":input[type=checkbox]"); var inputArray = new Array(); $.each($paras, function(){ if($(this).attr("checked") == true){ var exist = false; for ( var int = 0; int < inputArray.length; int++) { if(inputArray[int][0] == $.trim($(this).attr("name"))){ inputArray[int][1][inputArray[int][1].length] = $.trim($(this).val()); exist = true; } } if(!exist){ var tempArray = new Array(); tempArray[0] = $.trim($(this).attr("name")); tempArray[1] = new Array(); tempArray[1][0] = $.trim($(this).val()); inputArray[inputArray.length] = tempArray; } } }); for ( var int = 0; int < inputArray.length; int++) { $.extend(json, eval("({" + inputArray[int][0] + ":inputArray[int][1]})")); } var $parasRadio = $("#" + div).find(":input[type=radio]"); $.each($parasRadio, function(){ if($(this).attr("checked") == true){ $.extend(json, eval("({" + $.trim($(this).attr("name")) + ":'" + $.trim($(this).val()) + "'})")); } }); $paras = $("#" + div).find(":input").not($paras).not($parasRadio); $.each($paras, function(i){ if($.trim($(this).attr("name")) != "" && $.trim($(this).val()) != ""){ $.extend(json, eval("({" + $.trim($(this).attr("name")) + ":'" + $.trim($(this).val()) + "'})")); } }); return json; }; $.fn.extend({ /** 返回对象的Name/Value形式的JSON对象 */ nvJson: function(){ var key = $.trim($(this).attr("name")); var value = $.trim($(this).val()); if(key != "" && value != ""){ return $.parseJSON("{\"" + key + "\":\"" + value + "\"}"); }else{ return {}; } } }); /** * 页面数据加载<br> * 针对jQuery Mobile */ $.fn.extend({ loadByAction: function(json){ var deConfig = { url: "../pageLoadAction", // Action地址 dataSQLID: null, // 数据查询脚本,以数组形式指定多个脚本 dataSouce: DataSource.LMES, // 指定数据库:lmes-E服务系统,slis-核心,flexcc-咨诉系统 paras: {} // 查询参数 }; var config = {}; $.extend(true, config, deConfig, json); if(null == config.url){ alert('url is null'); } var paraJSON = {}; $.extend(true, paraJSON, config.paras, {dataSouce: config.dataSouce}); $.extend(true, paraJSON, {dataSQLID: config.dataSQLID}); var result = getAjaxData(config.url, paraJSON); if(result["_state"] == "SUCCESS"){ $(this).loadByData(result["_data"]); }else{ alert("页面数据加载异常"); } }, loadByData: function(data){ if(null == data || undefined == data) return; if($.isJSON(data) == false) return; for(var key in data){ var $ele = $("input[name=" + key.toLowerCase() + "]"); if(null == $ele || $ele.length == 0) continue; if($ele.length == 1) $ele.val(data[key]); else{ // 针对radio、checkbox处理 // TODO } } } }); |
|||
JSON表达式取值 | javascript | ||
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSON eval</title> </head> <body> <script type="text/javascript" src="../../lib/jeasyui/jquery.min.js"></script> <script type="text/javascript"> var json = {"k1":"123", "k2":"属性操作", "k3":"fda"}; // 有大小写区分 console.log(eval("json.k1")); console.log(eval("json.K1")); // undefined console.log(eval("json.k2")); console.log(eval("jSon.k2")); // SCRIPT5009: “jSon”未定义 </script> </body> </html> |
|||
【MVEL】model属性操作 | java | ||
/** <dependency> <groupId>org.mvel</groupId> <artifactId>mvel2</artifactId> <version>2.2.4.Final</version> </dependency> */ import java.lang.reflect.Field; import java.text.ParseException; import java.util.Date; import junit.framework.TestCase; import org.apache.commons.lang3.time.DateUtils; import org.mvel2.MVEL; /** * @author c1panx * @ 2015年5月19日 上午11:46:38 */ public class MVELTest extends TestCase { // 常用日期格式 private final String[] pattern = new String[] { "yyyy-MM", "yyyyMM", "yyyy/MM", "yyyyMMdd", "yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.SSS" }; public void testEval(){ /** * 1. MVEL属性区分大小写 * 2. 不存在的属性会抛异常 * 3. String可强制转换成数字 */ MVELTestBean bean = new MVELTestBean(); this.setFiledValue(bean, "id", "123"); this.setFiledValue(bean, "name", "法是基"); // this.setFiledValue(bean, "makedate", new Date()); this.setFiledValue(bean, "makedate", "2015-05-19"); this.setFiledValue(bean, "modifyDate", "法是基"); System.out.println("result name: " + MVEL.eval("name", bean)); System.out.println("result: " + MVEL.eval("name == null", bean)); System.out.println("result id: " + this.getFiledValue(bean, "ID")); System.out.println("result makedate: " + this.getFiledValue(bean, "makedate")); System.out.println("@>> " + bean.toString()); } /** * 1. property与属性大小写不一致问题; * 2. 日期字符串自动换成Date; * @param obj 对象 * @param property 属性名 * @param value 设置成的值 */ private void setFiledValue(Object obj, String property, Object value){ if (null == obj) { return; } Field[] fields= obj.getClass().getDeclaredFields(); if (null == fields) { return; } for (Field field : fields) { String fieldName = field.getName(); if (fieldName.equalsIgnoreCase(property)) { // 日期字符串处理 if (field.getType() == Date.class && null != value && value.getClass() == String.class) { // 字符串转日期 try { value = DateUtils.parseDate((String)value, pattern); } catch (ParseException e) { e.printStackTrace(); } } MVEL.setProperty(obj, fieldName, value); break; } } } /** * 获取属性值 * @param obj 对象 * @param property 属性名,不区分大小写 * @return */ private Object getFiledValue(Object obj, String property) { if (null == obj) { return null; } // 需考虑父类属性 Field[] fields = obj.getClass().getDeclaredFields(); if (null == fields) { return null; } for (Field field : fields) { String fieldName = field.getName(); if (fieldName.equalsIgnoreCase(property)) { return MVEL.eval(fieldName, obj); } } return null; } } /** * @author c1panx * @ 2015年5月19日 上午11:46:54 */ class MVELTestBean implements Serializable { private static final long serialVersionUID = 1L; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); private Integer id; private String name; private Date makeDate; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getMakeDate() { return makeDate; } public void setMakeDate(Date makeDate) { this.makeDate = makeDate; } public String toString(){ StringBuffer buffer = new StringBuffer(); buffer.append(this.getClass().getSimpleName()); buffer.append("{"); buffer.append("id=" + this.id); buffer.append(", name=" + this.name); if(null == this.makeDate){ buffer.append(", makeDate=" + null); } else { buffer.append(", makeDate=" + sdf.format(this.makeDate)); } buffer.append("}"); return buffer.toString(); } } |