通过iframe实现简单的ajax表单提交

之前做项目都是用现成的jquery插件实现表单的校验以及ajax提交,但是今天有个简单的头像图片ajax上传,以及一个很简单的表单提交,实在不想引入一个插件了,本着代码量最小,最简单的原则,照着豆瓣照抄了一个,基于jquery搞的一个简单的基于iframe的ajax表单提交功能,也就是通过隐藏的iframe上传图片的功能。原理很简单,就是在iframe里处理提交的表单的返回值,并且做出相应处理,从而实现页面无刷新的ajax上传图片效果。

简单代码如下:

阅读剩余部分 -

vps上部署jetty多个端口多个webapp

做为一个专业挖坑20年的互联网爱好者,这几天有新的小(大)项(坑)目(啊)要发布,于是发现原先的jetty不够用了,只放一个项目怎么可以,于是决定重新配置一下,多配几个端口,然后一个端口对应一个项目,分别用nginx反代上去。
经过查看jetty的官方文档,配合google之后,搞定了,简单总结下,给需要的朋友做个参考

注:我用的是jetty-distribution-9.1.4.v20140401这个版本的,jetty9需要JDK1.7的支持,要是java环境是1.6会报错的。此外,这个配置方法是自己摸索的,可能有不完善的地方,希望大家能给点改进意见


阅读剩余部分 -

Linux下Mysql大小写敏感的问题

今天发现项目报了个异常:

bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'twe.PLACE' doesn't exist

提示表不存在,可查了数据库发现表是存在的,顿时意识到八成是大小写出问题了……但是我再windows环境下和Mac OSX的环境下开发的时候都没啥问题,那就奇怪了,万能的google告诉我:

Mysql的大小写敏感,在windows上lower_case_table_names变量的缺省值为1; 在linux上为0; 在mac os上为2;

看来还是不同环境的默认配置的问题,服务器是linux的环境,于是简单设置了一下,把mysql设置成大小写不敏感就OK了,操作如下:

1.打开mysql的配置文件

vi /etc/my.cnf

2.在 [mysqld] 下设置lower_case_table_names的值,也就是加一行:

lower_case_table_names=1 

3.重启下mysql,于是搞定了

改版啦

typecho0.9出来也有段时间了,新版确实看起来舒服多了,尤其是后台的Markdown编辑器很讨人喜欢,于是决定升级一下,顺带把主题改了改

总体还以简洁大方,清新淡雅为主嘛(画外音:“喂喂,你那半吊子水平也设计不出啥复杂炫丽的样式好伐……”)

改版前:

before.png

改版后:

after.png

于是,博客升级后,新主题顺利上线……其实还有不少小细节要完善,比如代码高亮,不过没关系,慢慢来嘛,先写个博客纪念一下……

(画外音:“喂喂,你难道不是博客好久不更新了,直到自己都看不下去了才写这个满篇都是废话的博客的么”;博主:“……”)

vps安装JDK,无法建立 SSL 连接链接问题

今天想把VPS的JDK重装一下,因为之前装的是JRE,貌似jetty跟JRE有点不兼容,老是打错误日志,提示java.err.nojdk

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html上找到下载链接,直接wget,然后就报错了

[root@vps java]# wget http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-i586.bin
--2014-02-18 21:47:58--  http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-i586.bin
正在解析主机 download.oracle.com... 65.122.127.49, 65.122.127.43
Connecting to download.oracle.com|65.122.127.49|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 302 Moved Temporarily
位置:https://edelivery.oracle.com/akam/otn/java/jdk/6u45-b06/jdk-6u45-linux-i586.bin [跟随至新的 URL]
--2014-02-18 21:47:59--  https://edelivery.oracle.com/akam/otn/java/jdk/6u45-b06/jdk-6u45-linux-i586.bin
正在解析主机 edelivery.oracle.com... 23.214.22.140
Connecting to edelivery.oracle.com|23.214.22.140|:443... 已连接。
ERROR: certificate common name www.oracle.com' doesn't match requested host name edelivery.oracle.com'.
To connect to edelivery.oracle.com insecurely, use `--no-check-certificate'.
无法建立 SSL 连接。

阅读剩余部分 -

fullCalendar改造计划之带农历节气节假日的万年历

计划着要做一款万年历,作为自己小项目的便民功能。

作为一枚“资深”业余前端,本想着网上应该有现成的代码可用,一顿猛搜之后,倒是确实搜到几个,但是一看功能,跟我想的不一样;再看代码,顿时没有了修改的欲望。顿时大失所望,理想太丰满,现实太骨感啊!!

无意搜到一款jquery的日程安排日历插件,fullCalendar(官网:http://arshaw.com/fullcalendar/),

发现嗯,功能貌似挺强大的嘛,再一看,最近更新日期是2013年9月,于是决定了,改造!

下载下来的最新版是fullcalendar-1.6.4,原生的样子是这样的:
请输入图片描述

但是我想象的应该是这个样子的:
请输入图片描述

貌似差别有点大……没关系,一步步来改造。

一、当然是汉化啦



阅读剩余部分 -

linux下jetty替换部署war包步骤小笔记

今天给自己的小网站做了点小更新,部署的时候发现……有段时间没管,忘了文件在哪儿了,也忘了怎么操作了。
没办法,简单google了一下,总算记起一些,于是决定做个小记录,下次省的搜了

就几个简单的linux命令,用来对war包做重新部署的。第一次部署的时候jetty的安装配置就免了,需要的可以自行google:

1. 打开jetty安装目录下的bin目录。由于安装的时候配置了环境变量,这边就很方便了

cd ${JETTY_HOME}/bin

2.关闭jetty。bin目录下的jetty.sh里包含了jetty的基本操作指令(stop,start,restart等等)

./jetty.sh stop

3.用其他工具上传新的war包并覆盖以前的旧war包(一般在jetty安装目录的webapps目录下)

4.启动jetty

./jetty.sh start

搞定,掩面飘过,这么简单的步骤都能忘……

目测百度统计出问题了

许久不写博客,今天发个博客吐槽下百度统计

今天发现自己的几个站全被挂了弹窗,弹窗第一次的时候会设置cookies,一天只弹一次……粗心一点估计就直接无视了……

顿时大惊,以为服务器被黑了,辛辛苦苦排查一通,没发现啥可疑问题(“就你那半吊子水平,有问题你也发现不了好哇!!”)

看网页源代码,也没发现奇怪的js注入代码,但是在chrome里明明看到看到载入了很多弹窗推广的js啊!!这些js从哪儿跑出来的??

于是以为是插件问题,把插件都停掉,还是不行……

都搞了一通,最后,只有把目光放到唯一剩下的百度统计js代码上了,抱着试试看的心态,把统计代码删了……

于是,弹窗没了……

清空cookies,刷新,没弹窗……

目测是百度统计出问题了……

google一下,发现近期百度统计确实出问题了,据官方人士在百度统计贴吧上说明,是被人劫持了!!!

顿时囧了,这么大的互联网公司,就这么被人劫持了……尼玛洗洗睡吧~

自定义UITableViewCell的高度自适应

项目里需要实现UITableView的Cell的高度自适应,google后发现都是基于默认cell的处理,对于自定义的UITableViewCell没有效果,稍微研究了一下代码,发现,关键还是在计算UILabel的高度上,于是稍微对网上现成的代码做了写修改,实现了需要的功能。
要实现的效果如下:

donelist.png

自定义的cell也很简单,一排label,简单的表格效果:

celldemo.png

简单贴一下关键代码,做为备忘:

1、设置全局变量来保存每行高度,目的是避免重复计算高度

@property (nonatomic, retain) NSMutableArray *cellHeightList;
@synthesize cellHeightList;
- (void)viewDidLoad
{
    [super viewDidLoad];
    //初始化
    self.cellHeightList = [[NSMutableArray alloc] init];
}

<br/>
2、计算每行cell高度,并保存高度列表
<br/>

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    int row = [indexPath row];
    //设置字体信息
    UIFont *textfont15 = [UIFont systemFontOfSize:15];
    //选取几个可能内容比较多的label值
    Category *category = (Category *)[self.personList objectAtIndex:indexPath.section];
    NSDictionary *rowData = [category.list objectAtIndex:row];
    NSString *pnowContent = [rowData objectForKey:@"ppositionnow"];
    NSString *pfurContent = [rowData objectForKey:@"ppositionfur"];
    NSString *pcancelContent = [rowData objectForKey:@"ppositioncancel"];
    NSString *degreeContent = [rowData objectForKey:@"pdegree"];
    NSString *infoContent = [rowData objectForKey:@"potherinfo"];
    
    // 分别计算显示这些内容的几个label所需要的最小尺寸
    //169.0f;104.0f;145.0f为label的宽度
    CGSize pnowsize = [pnowContent sizeWithFont:textfont15 constrainedToSize:CGSizeMake(168.0f, 1000.0f) lineBreakMode:NSLineBreakByWordWrapping];
    CGSize pfursize = [pfurContent sizeWithFont:textfont15 constrainedToSize:CGSizeMake(168.0f, 1000.0f) lineBreakMode:NSLineBreakByWordWrapping];
    CGSize pcansize = [pcancelContent sizeWithFont:textfont15 constrainedToSize:CGSizeMake(168.0f, 1000.0f) lineBreakMode:NSLineBreakByWordWrapping];
    CGSize degsize = [degreeContent sizeWithFont:textfont15 constrainedToSize:CGSizeMake(104.0f, 1000.0f) lineBreakMode:NSLineBreakByWordWrapping];
    CGSize infosize = [infoContent sizeWithFont:textfont15 constrainedToSize:CGSizeMake(145.0f, 1000.0f) lineBreakMode:NSLineBreakByWordWrapping];

    //保存不同label高度值
    NSMutableArray *heightArray = [[NSMutableArray alloc] initWithCapacity:5];
    [heightArray addObject:[NSNumber numberWithFloat:pnowsize.height]];
    [heightArray addObject:[NSNumber numberWithFloat:pfursize.height]];
    [heightArray addObject:[NSNumber numberWithFloat:pcansize.height]];
    [heightArray addObject:[NSNumber numberWithFloat:degsize.height]];
    [heightArray addObject:[NSNumber numberWithFloat:infosize.height]];
    //初始化最大高度值
    NSNumber *max_height = [NSNumber numberWithInt:50];
    //比较,找出最大高度做为cell的高度
    for (int i=0;i<[heightArray count];i++){
        if ([[heightArray objectAtIndex:i] intValue]>[max_height intValue]) {
            max_height = [heightArray objectAtIndex:i];
        }
    }
        
    //保存cell高度到全局变量
    [self.cellHeightList addObject:[NSNumber numberWithFloat:[max_height floatValue]+30]];

    return [max_height floatValue]+30.0;    
    
}

<br/>
3、设置cell内UILabel的高度
<br/>

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ……

    NSDictionary *rowData = [category.list objectAtIndex:nowrow];
    NSString *pnameContent = [rowData objectForKey:@"pname"];
    NSString *pnowContent = [rowData objectForKey:@"ppositionnow"];
    NSString *pfurContent = [rowData objectForKey:@"ppositionfur"];
    NSString *pcancelContent = [rowData objectForKey:@"ppositioncancel"];
    NSString *genderContent = [rowData objectForKey:@"pgender"];
    NSString *degreeContent = [rowData objectForKey:@"pdegree"];
    NSString *birthContent = [rowData objectForKey:@"pbirth"];
    NSString *partyContent = [rowData objectForKey:@"pparty"];
    NSString *infoContent = [rowData objectForKey:@"potherinfo"];
    //获取当前cell高度
    float labelHeight = [[self.cellHeightList objectAtIndex:nowrow] floatValue];
    //当前label信息
    CGRect pnameFrame = cell.PersonNameLabel.frame;
    CGRect pnowFrame = cell.PositionNowLabel.frame;
    CGRect pfurFrame = cell.PositionFurLabel.frame;
    CGRect pcanFrame = cell.PositionCancelLabel.frame;
    CGRect genderFrame = cell.GenderLabel.frame;
    CGRect degreeFrame = cell.DegreeLabel.frame;
    CGRect birthFrame = cell.BirthLabel.frame;
    CGRect partyFrame = cell.PartyLabel.frame;
    CGRect otherFrame = cell.OtherLabel.frame;
    //修改label的高度
    pnameFrame.size.height = labelHeight;
    pnowFrame.size.height = labelHeight;
    pfurFrame.size.height = labelHeight;
    pcanFrame.size.height = labelHeight;
    genderFrame.size.height = labelHeight;
    degreeFrame.size.height = labelHeight;
    birthFrame.size.height = labelHeight;
    partyFrame.size.height = labelHeight;
    otherFrame.size.height = labelHeight;
    //更新label的信息
    cell.PersonNameLabel.frame = pnameFrame;
    cell.PositionNowLabel.frame = pnowFrame;
    cell.PositionFurLabel.frame = pfurFrame;
    cell.PositionCancelLabel.frame = pcanFrame;
    cell.GenderLabel.frame = genderFrame;
    cell.DegreeLabel.frame = degreeFrame;
    cell.BirthLabel.frame = birthFrame;
    cell.PartyLabel.frame = partyFrame;
    cell.OtherLabel.frame = otherFrame;
    //设置label内容
    cell.PersonNameLabel.text = pnameContent;
    cell.PositionNowLabel.text = pnowContent;
    cell.PositionFurLabel.text = pfurContent;
    cell.PositionCancelLabel.text = pcancelContent;
    cell.GenderLabel.text = genderContent;
    cell.DegreeLabel.text = degreeContent;
    cell.BirthLabel.text = birthContent;
    cell.PartyLabel.text = partyContent;
    cell.OtherLabel.text = infoContent;

    ……
}

<br/>
编译运行,搞定……

playframework2.0简单的自定义分页样式

过年在家,玩到提不起兴致写代码,更别说写博客了……罪过罪过……

于是今天把自己折腾的play!项目的分页整理完善了一下,做个简单记录,免得博客长草~

需求很简单,如下图所示:

分页样式

显示5个页码,其他的用省略号表示

代码如下:

@defining((pageNavMap("currentPageNum"), pageNavMap("totalPageNum"))) { case (page_curPageNum, page_totalPageNum) =>
<div class="page-navigation">
    @if(page_curPageNum > 1){
    <a href="/person/@userprofile.id">首页</a>
    <a href='/person/@userprofile.id/p/@(page_curPageNum-1)'>上一页</a>
    }
    @if(page_totalPageNum < 6){
    @for(i <- 1 to page_totalPageNum){
        @if(i == page_curPageNum){
        <span class="curPage">@page_curPageNum</span>
        }else{
        <a href='/person/@userprofile.id/p/@i'>@i</a>
        }
    }
    }else{
    @if(page_curPageNum < 4){
        @for(i <- 1 to 5){
        @if(i == page_curPageNum){
        <span class="curPage">@page_curPageNum</span>
        }else{
        <a href='/person/@userprofile.id/p/@i'>@i</a>
        }
        }
        <span class="pagebreak">…</span>
    }else{
    @if(page_curPageNum > (page_totalPageNum-2)){
    <span class="pagebreak">…</span>
    <a href='/person/@userprofile.id/p/@(page_curPageNum-3)'>@(page_curPageNum-3)</a>
    <a href='/person/@userprofile.id/p/@(page_curPageNum-2)'>@(page_curPageNum-2)</a>
    <a href='/person/@userprofile.id/p/@(page_curPageNum-1)'>@(page_curPageNum-1)</a>
    <span class="curPage">@page_curPageNum</span>
    @if(page_curPageNum != page_totalPageNum){
    <a href='/person/@userprofile.id/p/@(page_totalPageNum)'>@(page_totalPageNum)</a>
    }
    }else{
    <span class="pagebreak">…</span>
    <a href='/person/@userprofile.id/p/@(page_curPageNum-2)'>@(page_curPageNum-2)</a>
    <a href='/person/@userprofile.id/p/@(page_curPageNum-1)'>@(page_curPageNum-1)</a>
    <span class="curPage">@page_curPageNum</span>
    <a href='/person/@userprofile.id/p/@(page_curPageNum+1)'>@(page_curPageNum+1)</a>
    <a  href='/person/@userprofile.id/p/@(page_curPageNum+2)'>@(page_curPageNum+2)</a>
    <span class="pagebreak">…</span>
    }
}
    }
    
@if(page_curPageNum < page_totalPageNum){
    <a href='/person/@userprofile.id/p/@(page_curPageNum+1)'>下一页</a>
    <a href='/person/@userprofile.id/p/@page_totalPageNum'>末页</a>
    }

</div>
}

其中,“pageNavMap”是保存分页信息的Map,后台定义如下:

Map pageMap = new HashMap();
pageNavMap.put("totalPageNum", totalPageCount);
pageNavMap.put("currentPageNum", curPageNum>1?curPageNum:1);

这只是用于页面显示的代码,至于后台分页的代码,可以很简单的通过play!内的EBean自带的“ PagingList”接口搞定

PagingList的api地址:http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/PagingList.html

热评文章

最新文章

最近回复

归档

其它