package com.eidlink.util;
import java.util.concurrent.atomic.AtomicInteger;
public class IdGenerator {
* @param len
* @param i
* @param driver 上一个三位数
public static void sn(int len,Integer i,String driver){
String dr = "";
AtomicInteger z = new AtomicInteger(i);
z.getAndIncrement();
if(z.toString().length()>(len-(driver!=null?driver.length():0))){
dr = driverCheck(driver,len);
if(dr.equals(".N")){
len++;
System.out.println("超出范围");
dr = "";
}else{
z.set(1);
}else{
dr = driver;
if(dr.length()==len){
System.out.println(dr);
}else{
System.out.println(String.format("%0"+(len-dr.length())+"d", z.intValue())+dr);
* 字母有效检查
* 1.检查字母是否都为Z
* 2.检查字母长度
* @param driver
* @param len
* @return
public static String driverCheck(String driver,int len){
char[] charArray = driver.toCharArray();
AtomicInteger z = new AtomicInteger(0);
for (char c : charArray) {
if (c == 'Z') {
z.getAndIncrement();
if (z.intValue() == driver.length() && z.intValue() == len) {
return ".N";
} else if (z.intValue() == driver.length() && z.intValue() < len) {
return driver("@" + driver);
} else {
return driver(driver);
* 字母递增
* @param driver
* @return
public static String driver(String driver){
if(driver!=null && driver.length()>0 ){
char[] charArray = driver.toCharArray();
AtomicInteger z = new AtomicInteger(0);
for(int i = charArray.length-1;i>-1;i--){
if(charArray[i]=='Z'){
z.set(z.incrementAndGet());
else{
if(z.intValue()>0 || i==charArray.length-1){
AtomicInteger atomic = new AtomicInteger(charArray[i]);
if (charArray[i]=='9' &&charArray[i-1]=='9'&&charArray[i-2]=='9') {
charArray[i] = '0';
charArray[i - 1] = '0';
charArray[i - 2] = (char) atomic.addAndGet(8);
}else if( charArray[i]> charArray[i-1] && charArray[i]=='9') {
charArray[i] = '0';
charArray[i-1]= ++charArray[i-1];
else if(charArray[i]== '9'&& charArray[i-1]=='9' && charArray[i-2]!='Z') {
charArray[i] = '0';
charArray[i - 1] = '0';
if (charArray[i-2]=='Z'){
charArray[i-1] = (char) atomic.addAndGet(8);
int ascll =(int) charArray[i-2];
ascll=ascll+1;
charArray[i-2] =(char)ascll;
z.set(0);
else if (charArray[i]== '9'&& charArray[i-1]=='9' && charArray[i-2]=='Z'){
charArray[i] = '0';
charArray[i - 1] = (char) atomic.addAndGet(8);
else if (charArray[i]== '9'&& charArray[i-1]=='Z' && charArray[i-2]=='Z'){
charArray[i] = (char) atomic.addAndGet(8);
else if(charArray[i]== '9'){
charArray[i] = '0';
int ascll =(int) charArray[i-1];
ascll=ascll+1;
charArray[i-1] =(char)ascll;
z.set(0);
else {
charArray[i]=(char) atomic.incrementAndGet();
z.set(0);
return String.valueOf(charArray);
}else{
return "A";
public static void main(String[] args) {
sn(3, 999, "A0");
Oracle P/L SQL实现发送Email、浏览网页等网络操作功能
Oracle P/L SQL实现发送Email、浏览网页等网络操作功能,以下是此过程包的头部,包体经常打包处理plb,感兴趣用户可以下载下来。
--.使用聚合函数实现 多行合并
Drop Type Strcat_type;
Drop Function f_StrCat;
Drop Package UTL_INet;
Variable ls_ObjectName VarChar2(128);
Begin
Select Sequence_Name Into :ls_ObjectName From User_Sequences Where Sequence_Name = 'SYS_RAND_
ID';
DBMS_Output.Put_Line( :ls_ObjectName );
Exception When No_Data_Found Then
Execute Immediate 'Create Sequence SYS_RAND_
ID minvalue 1 maxValue 99999999999999999 Start With 1 increment by 1 cache 5 cycle order';
--1、创建类型
Create Or Replace Type Strcat_type As Object (
cat_string varchar2(4000),
Static Function ODCIAggregateInitialize(cs_ctx In Out strcat_type) Return Number,
Member Function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) Return Number,
Member Function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type) Return Number,
Member Function ODCIAggregateTerminate(self In Out strcat_type,ReturnValue Out varchar2,flags in Number) Return Number
--2. 创建类型体
Create Or Replace Type Body Strcat_type Is
Static Function ODCIAggregateInitialize( cs_ctx In Out strcat_type
)Return Number
Begin
cs_ctx := strcat_type( Null );
Return ODCIConst.Success;
Member Function ODCIAggregateIterate( self In Out strcat_type,
value In varchar2 )
Return Number
Begin
if self.cat_string is Null or Instr( self.cat_string, value ) = 0 Then
self.cat_string := self.cat_string || ','|| value;
End if;
Return ODCIConst.Success;
Member Function ODCIAggregateTerminate( self In Out strcat_type,
ReturnValue Out varchar2,
flags In Number)
Return Number
Begin
ReturnValue := ltrim(rtrim( self.cat_string,','),',' );
Return ODCIConst.Success;
Member Function ODCIAggregateMerge( self In Out strcat_type,
ctx2 In Out strcat_type)
Return Number
Begin
if self.cat_string is Null or Instr( self.cat_string, ctx2.cat_string ) = 0 Then
self.cat_string := self.cat_string || ',' || ctx2.cat_string;
End if;
Return ODCIConst.Success;
--3.创建函数: 使用聚合函数实现 多行合并
Create or Replace Function f_StrCat( as_input Varchar2 ) Return Varchar2
PARALLEL_ENABLE AGGREGATE USING strcat_type;
Grant Execute on f_StrCat To Public;
--End of 使用聚合函数实现 多行合并
Create Or Replace Package UTL_INet AS
Type VarChar_Type is Table of VarChar2(400) Index By Binary_Integer;
Type Number_Type is Table of Number(12,4) Index By Binary_Integer;
Type DynamicCursor is ref Cursor; --动态游标
--Purpose : 获得汉字拼音编码
Type ut_PYIndex_191_List is Varray( 191 ) OF Number;
Type ut_PYIndex_List is Varray( 10 ) OF ut_PYIndex_191_List;
is_OracleDirectory Constant VarChar2(20) := 'ATTACH_DIR'; --内部附件
生成目录(Oracle的目录)
--Clob叠加比较慢,先用VarChar2叠加到4000个字符后才叠加到Clob字段
--UTL_INet.p_ClobCAT(
Procedure p_ClobCAT(
ac_HTMLText in Out Clob,
as_CatText in Out VarChar2,
as_Str in VarChar2 Default Null
--字符串根据特定分隔符分来
--Select UTL_INet.f_SplitString( 'A,B,C', xx, ',' ) From dual;
Function f_SplitString(
as_SourStr in out Clob, --输入字符串A,B,C
as_Separator in VarChar2 Default '/' --分拆依据的分隔符,
)Return VarChar2; --分拆结果A
--将Clob内容写入物理文件
--Exec UTL_INet.p_PutClob2File( as_FileName => 'aa.sql', ac_Text => 'test sql' );
Procedure p_PutClob2File(
as_SubDir in VarChar2, --目录名
as_FileName in VarChar2, --文件名
ac_Text in Clob, --文件内容
as_Overwrite in VarChar default 'Y', --标志位:Y:覆盖文件内容,N:追加
as_OraVersion in VarChar default 'N' --标志位:Y:写入Oracle版本信息
--序号
自动递增计算
--e.g.: 输入:HLXU99349021,返回:HLXU99349022
--范例: Select UTL_INet.f_AutoNum( 'HLXU99349021' ), UTL_INet.f_AutoNum( 'ABA', -1 ), UTL_INet.f_AutoNum( 'ABZ' ) from Dual;
Function f_AutoNum(
as_OldNum in VarChar2, --原字符串
ai_Step in Number Default 1, --步长,默认是
递增加1,
ai_DigitXXX in Number Default Null --累计序号位数 XXX
)Return VarChar2;
--字符串加解密,返回一串32位长的字符串
--Select UTL_INet.f_MD5( 'TestPassword' ) From Dual;
Function f_MD5(
as_SourceStr in Varchar2 --需要加密的字符串
) Return Varchar2;
--将Email地址去头去尾,剩下最简单的Email地址,如"TSI Customer Service" <cs@csdn.com>变成cs@csdn.com
Function f_GetNakedEmailAddr(
as_DisplayEmail In VarChar2,
as_Including in Char Default 'N' --Y: 返回<cs@csdn.com>
)Return VarChar2;
--测试发送Email的邮箱是否正确
Function f_TestEmailAccount(
ac_Connection out Nocopy UTL_SMTP.Connection,
as_SMTPHost in VarChar2, --邮件服务器 mail.csdn.com
ai_SMTPPort in PLS_Integer Default 25, --邮件服务器端口
as_SMTPAuth in VarChar2 Default 'Y', --发送密码验证
as_Username in VarChar2 Default Null, --邮件用户
as_Password in VarChar2 Default Null, --邮件口令
as_WalletPath in VarChar2 Default Null,
as_WalletPwd in VarChar2 Default Null
)Return Boolean;
------------------------------------------------ 写邮件头和邮件内容-------------------------
Procedure p_WriteRawData(
ac_Conn in Out Nocopy UTL_SMTP.Connection,
as_Partname in VarChar2,
as_Value in VarChar2,
as_Splite in VarChar2 Default ':',
as_CRLF in VarChar2 Default UTL_TCP.CRLF
----------------------------------------------发送附件-------------------------------------
Procedure p_MailAttachment(
ac_Conn in Out Nocopy UTL_SMTP.Connection,
as_Filename in VarChar2,
as_Boundary in VarChar2,
as_Encode in VarChar2 Default 'base64',
as_MimeType in VarChar2 Default 'text/plain',
as_Content
ID in VarChar2 Default Null, --
ab_Inline in Boolean Default False --True将文本内容直接在邮件内容显示出来,并出现在附件中,False不显示只出现在附件中
-----------------
自动签名的
生成,签名
生成显示后还出现此签名文件为附件,尚未解决-------------------------------
Procedure p_GetMailSignature(
ac_Conn in Out Nocopy UTL_SMTP.Connection,
as_Boundary in VarChar2,
as_Encode in VarChar2 Default 'base64',
as_SignatureLogo in VarChar2 Default Null,
as_SignatureText in VarChar2 Default Null
--发送Email前必须将ewallet.p12拷贝到C:\OracleAttachDir目录
--发送电子邮件
--Exec UTL_INet.p_SendEmail( 'csdn@gmail.com', 'Test 主题Subject', 'Mail body(邮件内容)' );
Procedure p_SendEmail(
as_Sender in VarChar2,
as_Recipient in VarChar2,
as_CC in VarChar2 Default Null,
as_BCC in VarChar2 Default Null,
as_Subject in VarChar2,
ac_Message in Clob,
as_AttachLists in VarChar2 Default Null, --多个用逗号,分开
as_SMTPHost in VarChar2, --邮件服务器
ai_SMTPPort in PLS_Integer Default 25, --邮件服务器端口
as_SMTPAuth in VarChar2 Default 'Y', --发送密码验证
as_WalletPath in VarChar2 Default Null,
as_WalletPwd in VarChar2 Default Null,
as_Username in VarChar2 Default Null,
as_Password in VarChar2 Default Null,
as_RunResult out VarChar2, --返回信息,OK成功,其他返回错误
as_SignatureLogo in VarChar2 Default Null,
as_SignatureText in VarChar2 Default Null,
as_Encode in VarChar2 Default 'base64',
ai_Priority In Pls_Integer Default Null
Function f_LoadHTMLFromURL(
as_URL in VarChar2,
as_CharSet in VarChar2 Default 'UTF-8'
)Return Clob;
--
生成HTML报表表头
--Exec f_HTMLTableHead( 'Tab1', '20:Table Name;20:Records' );
Function f_HTMLTableHead(
as_Table
ID in VarChar2, --表
ID
as_W
idthColumns in VarChar2, --表头内容,用分号;隔开,宽度与标题用冒号:隔开
as_BgColor in VarChar2 Default 'CCCCCC' --标题背景色
)Return VarChar2;
--
生成HTML报表主体内容
--Exec UTL_INet.f_HTMLTableBody( '' );
Function f_HTMLTableBody(
as_BodyText in VarChar2, --主体内容,多个用分号;隔开
as_Align in VarChar2 Default Null --格式(居中,靠左,靠右)
)Return VarChar2;
--获取汉字拼音
字母表
--Select UTL_INet.f_getChineseSpell( '获取汉字拼音' ) from dual;
Function f_getChineseSpell(
as_CNStr in VarChar2, --中文
as_First in VarChar2 Default Null --空返回完整拼音,其他返回拼音首
字母
)Return VarChar2;
--二进制转换成十进制函数
--Select UTL_INet.f_Bin2Dec( '10111011' ) From dual;
Function f_Bin2Dec(
as_Bin in VarChar2
)Return Number;
--十进制转换成二进制函数
--Select UTL_INet.f_Dec2Bin( 187 ) From dual;
Function f_Dec2Bin(
an_Dec in Number
)Return VarChar2;
--十进制转换成三十二进制函数
--Select UTL_INet.f_Dec2Hex( 187 ) From dual;
Function f_Dec2Hex(
an_Dec in Number
)Return VarChar2;
--三十二进制转换成十进制函数
--Select UTL_INet.f_Hex2Dec( '5R' ) From dual;
Function f_Hex2Dec(
as_Hex in VarChar2
)Return Number;
--
生成12位随机数
--Select UTL_INet.f_Rand() From dual;
Function f_Rand(
as_PreFix in VarChar2 Default '00', --未满个
数字符补充串
an_Nums in Number Default 12
)Return VarChar2;
--繁体字转化成简体字(传入的汉字,若有繁体
自动转化为简体)
Function f_ft2jt(
as_Text in VarChar2 --传入的汉字
)Return VarChar2;
--简体字转化成繁体字(传入的汉字,若有简体
自动转化为繁体)
Function f_jt2ft(
as_Text in VarChar2 --传入的汉字
)Return VarChar2;
-- --------------------------------------------------------------------------
-- Description : SOAP related Functions for consuming web services.
Type t_Request is Record (
Method VarChar2(256),
Namespace VarChar2(256),
Body VarChar2(32767),
EnvelopeTag VarChar2(30)
Type t_Response is Record
Doc XMLType,
EnvelopeTag VarChar2(30)
Function f_NewRequest(
as_Method in VarChar2,
as_Namespace in VarChar2,
as_EnvelopeTag in VarChar2 Default 'SOAP-ENV'
)Return t_Request;
Procedure p_AddParameter(
as_Request in out Nocopy t_Request,
as_Name in VarChar2,
as_Type in VarChar2,
as_Value in VarChar2
Function f_Invoke(
as_Request in out Nocopy t_Request,
as_URL in VarChar2,
as_Action in VarChar2
)Return t_Response;
Function f_GetReturnValue(
as_Response in out Nocopy t_Response,
as_Name in VarChar2,
as_Namespace in VarChar2
)Return VarChar2;
--列出当前目录下所有文件清单,可以指定扩展名,是否包含子目录,返回的文件名用|分割开来
Function f_ListDirectory(
as_SubDir in VarChar2,
as_Ext in VarChar2 Default Null,
as_IncludingSubDir in Char Default 'N'
)Return Clob;
--将数值翻译成中文大写、英文大写
--Select f_Digit2Char( 24822.80, 'EN_Amount' ) From dual;
Function f_Digit2Char(
an_Amount in Number, --要被翻译的数值
as_Option in VarChar2 --翻译选择项
)Return VarChar2;
--发送短信
Function f_SendSMS(
as_MobilePhone in VarChar2, --手机号码
as_SMSText in VarChar2, --短信内容
as_SMSURL in VarChar2,
as_SMSUser
ID in VarChar2,
as_SMSPasswd in VarChar2
)Return VarChar2;
--删除某个指定文件
Procedure p_RemoveFile(
as_SubDir in VarChar2, --路径
as_FileName in VarChar2 --多个用逗号,分开
--从文件中读内容
Function f_GetTextFromFile(
as_SubDir in VarChar2, --目录名
as_FileName in VarChar2, --文件名
as_NewLine in VarChar2 Default UTL_TCP.CRLF --换行符
)Return Clob;
END UTL_INet;
项目需求中有时需要生成一定规则递增编号。例如生成设备编号:设备类型+五位编号(从1开始,不够前补0),也就是 SYXH000001 / SYXH00002 / SDOI00001 类似这样。
那么如何处理 000001 自增1变为 000002 呢?
在一些简单的业务中可能需要一些ID.这些ID是使用java代码实现的并不是通过数据库的自增实现的.下面是我写的一个简单的ID工具类,在使用的过程中你需要将最后一次的编号保存下来,你可以建一张表来维护这个自增的ID
这个自增的ID生成是线程安全的,而且在一定线程竞争不是很激烈的情况下比synchronized的效率高其中count是一个类的成员变量,通过使用count.incrementAndGe
首先数据库
ID字段存为varchar类型,查找数据库当前最大的
ID,新增数据时,获取的最大
ID加1,然后格式化成字符串,存入数据库即可,如下:
private Integer getMaxSort() {
List<Integer> max=...
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:
1,文本:直接输出的部分
2,注释:<#-- ... -->格式部分,不会输出
3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出
4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
下面是一个FreeMarker模板的例子,包含了以上所说的4个部分
<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#-- 注释部分 --><br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1><br>
<p>We have these animals:<br>
<u1><br>
<#-- 使用FTL指令 -->
<#list animals as being><br>
<li>${being.name} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>
1, FTL指令规则
在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.
1,开始标签:<#directivename parameter>
2,结束标签:</#directivename>
3,空标签:<#directivename parameter/>
实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.
用户指令用@
使用FTL标签时, 应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样.如果全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符.
2, 插值规则
FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}
2.1 通用插值
对于通用插值,又可以分为以下4种情况:
1,插值结果为字符串值:直接输出表达式结果
2,插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
<#settion number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
${answer}
输出结果是:
$42.00
$42.00
$42.00
4,200%
3,插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}
输出结果是:
2008-04-08 08:08:08 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)
4,插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
<#assign foo=true/>
${foo?string("yes", "no")}
输出结果是:
2.2 数字格式化插值
数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
如下面的例子:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 输出2.58 -->
#{y; M2} <#-- 输出4 -->
#{x; m1} <#-- 输出2.6 -->
#{y; m1} <#-- 输出4.0 -->
#{x; m1M2} <#-- 输出2.58 -->
#{x; m1M2} <#-- 输出4.0 -->
3, 表达式
表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker 标签结合,用于控制输出.实际上FreeMarker的表达式功能非常强大,它不仅支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能.
3.1 直接指定值
使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象.
1,字符串
直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子:
${"我的文件保存在C:\\盘"}
${'我名字是\"annlee\"'}
输出结果是:
我的文件保存在C:\盘
我名字是"annlee"
FreeMarker支持如下转义字符:
\";双引号(u0022)
\';单引号(u0027)
\\;反斜杠(u005C)
\n;换行(u000A)
\r;回车(u000D)
\t;Tab(u0009)
\b;退格键(u0008)
\f;Form feed(u000C)
\xCode;直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符.
如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.看如下代码:
${r"${foo}"}
${r"C:\foo\bar"}
输出结果是:
${foo}
C:\foo\bar
表达式中的数值直接输出,不需要引号.小数点使用"."分隔,不能使用分组","符号.FreeMarker目前还不支持科学计数法,所以"1E3"是错误的.在FreeMarker表达式中使用数值需要注意以下几点:
1,数值不能省略小数点前面的0,所以".5"是错误的写法
2,数值8 , +8 , 8.00都是相同的
3,布尔值
直接使用true和false,不使用引号.
集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
</#list>
输出结果是:
除此之外,集合元素也可以是表达式,例子如下:
[2 + 2, [1, 2, 3, 4], "whatnot"]
还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2
5,Map对象
Map对象使用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例子:
{"语文":78, "数学":80}
Map对象的key和value都是表达式,但是key必须是字符串
3.2 输出变量值
FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况
1,顶层变量
所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:
Map root = new HashMap(); //创建数据模型
root.put("name","annlee"); //name是一个顶层变量
对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法:
${name}
2,输出集合元素
如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:
["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法:
${week[2]} //输出第三个集合元素
此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:
week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素
3,输出Map元素
这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:
Map root = new HashMap();
Book book = new Book();
Author author = new Author();
author.setName("annlee");
author.setAddress("gz");
book.setName("struts2");
book.setAuthor(author);
root.put("info","struts");
root.put("book", book);
书有作者,
为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法:
book.author.name //全部使用点语法
book["author"].name
book.author["name"] //混合使用点语法和方括号语法
book["author"]["name"] //全部使用方括号语法
使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果.
Map?keys这个map当中所有的key的列表
Map?values这个map当中所有的value的列表
3.3, 字符串操作
FreeMarker的表达式对字符串操作非常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的子串等.
字符串连接有两种语法:
1,使用${..}或#{..}在字符串常量部分插入表达式的值,从而完成字符串连接.
2,直接使用连接运算符+来连接字符串
例如有如下数据模型:
Map root = new HashMap(); root.put("user","annlee");
下面将user变量和常量连接起来:
${"hello, ${user}!"} //使用第一种语法来连接
${"hello, " + user + "!"} //使用+号来连接
上面的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全一样.
值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:<#if isBig>Wow!</#if>
截取子串可以根据字符串的索引来进行,截取子串时如果只指定了一个索引值,则用于取得字符串中指定索引所对应的字符;如果指定两个索引值,则返回两个索引中间的字符串子串.假如有如下数据模型:
Map root = new HashMap(); root.put("book","struts2,freemarker");
可以通过如下语法来截取子串:
${book[0]}${book[4]} //结果是su
${book[1..4]} //结果是tru
在添加标签内容时,经常用到生成流水号的功能,实现流水号的效果,使用数据库导入或者中琅软件中的序列生成都可以实现,那么如果想要实现有规律递增该如何实现呢?下面我们来看详细看一下其操作方法:
一、序列递增流水号对于序列递增的流水号,我们可以在中琅标签打印软件中新建标签后,点击左侧工具栏中的“A”,绘制普通文本,然后双击普通文本,在数据源下方左侧点击修改,将流水号编码的固定内容用手动输入添加,序列递增部分用“序列生成”方式添加即可:
序列递增流水号使用“序列生成”方式添加时,页面山的...
1.软件系统读取文本文件数据信息内容(数据信息由汉字、英文字母、数字),然后对数据信息进行QR二维码编码,生成QR二维码图片文件,并保存在指定文件夹下面。
2.生成的QR二维码图片为清晰的、黑白色BMP图片,保存的文件名生成规则为当前日期+时间+三位递增序列号,文件后缀名为bmp。例如2017年1月11日10点38分40秒时刻生成的序列号为5的图片文件,其对应文件名为:20170111103840005.bmp。
4.QR二维码编码时要求软件系统能够根据数据信息容量自动选择二维码的版本
二维码识别:进行解码并显示结果信息
在Java中,当你使用双引号直接创建字符串时,如:String s = "LXHYouth";String s2 = "LXHYouth";使用`==`运算符比较这两个引用时,结果为`true`
然而,当你使用`new`关键字创建字符串对象时,情况就有所不同了:
String s3 = new String("LXHYouth"); // 使用 new 关键字,s3 指向堆中的一个新对象
String s4 = new String("LXHYouth"); // 再次使用 new 关键字,s4 指向另一个
你可以使用 Java 中的 AtomicInteger 类来自动生成递增编号。你可以在你的 Java Swing 应用程序中创建一个 AtomicInteger 对象,并在需要生成递增编号时调用该对象的 getAndIncrement() 方法即可。例如:
import java.util.concurrent.atomic.AtomicInteger;
public class MySwingApp {
private AtomicInteger counter = new AtomicInteger(0);
public String generateId() {
return "ID" + counter.getAndIncrement();
在上面的示例中,每次调用 generateId() 方法时,都会返回一个以 "ID" 开头的递增编号。
./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such