Browse Author

jason

关于jsessionid来源的研究

java开发中偶然是会遇到,系统登陆的各种问题。比如有的浏览器能登陆有的不能登陆,这时候就需要人工去在具体的环境中找寻原因。首先要找的就是跟踪登陆时候session的状态。那么浏览器中sessionid到底是在哪里看又在哪里生成呢。大多数人只知道session的作用但是没研究过的工作原理。首先session有两种模式进行工作,1.浏览器自动cookie模式。这种模式一般情况session名字是叫做jsessionid,这应该是一个规范。具体不同的服务器可能名字不一样。反正tomccat就是jsessionid;2.url重构的方式来实现这种情况需要每个url后面都需要追加当前sessionid,这是针对有浏览器被禁用cookie的时候使用的方式。所以一旦出现登陆不能成功的时候就要记得注意检查是不是浏览器禁用了cookie,如果cookie没有被禁用的时候,再看下跟踪下后台,看下后台有没有接收到该sessionid。在没有手动管理session的系统中跟踪session时不要想着找sessionid在哪里创建的,是没有意义的。这些都是servlet完成,而且tomcat容易会自动进行cookie标示存到浏览器,浏览器下次请求也能自动传递该域下的cookie并且tomcat会自动关联响应的session。你只需要查看当前session和浏览器对应的是不是同一个id,有没有过期即可。

iframe无法自适应高度问题

在给iframe的onload方法对iframe进行自适应高度时,遇到不能正常适应的情况,页面总是保持最大的高度。其后的页面不管多小,都保持最大的高度,页面底部会有大片空白。用户体验很不好。找了网上很多代码都未曾有效适应。后来经过测试发现iframe每次加载新的url如果高度足够内容展示,容器的高度就不会改变。解决方法是在iframe加载新页面之前手动将iframe的高度设置为一个最小值,但是不要设置为0,因为为0用户体验不好,页面会特别闪眼。预先设置好高度后再次加载时候就会重新按照新的高度进行撑开了。具体怎么自适应就自行百度吧

ORA-00911: 无效字符问题和解决

当捕捉到这个异常ORA-00911,后首先相当的是把sql放到sqlplus等软件中测试一下,结果发现在那边是可以执行的,而且没有报错。

然后再回去看sql因为sql太长不太好找具体哪里有无效字符,而且报错定位不明显。这个时候一般情况是sql中有分号导致的。如果你的sql结尾处没有分号,那么hibernate执行的异常中一般是会告诉哪个字符是非法字符的。只有这一种情况最恶心,异常太不明显了。不知道的人要想一个个排查查半天都查不出所以然。

安卓activity上手写

做安卓开发经常会有一些办公性质的系统会要求手写签批功能。比如需要针对一些办理信息进行手写标注,或者对一些word,pdf等等信息进行编辑等功能。其中针对word和pdf的技术往上可以找到,而且技术比较成熟。现在我将要介绍的是在手机所见即所得的页面上进行签批的功能实现。首先当我初步遇到这个需求的时候是先去网上找有没有相关的已经实现的技术来做参考,结果找了很久没有找到,于是开始自己想办法来做实现。首先安卓在activety上面直接进行绘制的技术不好做实现,或者可以通过自定义一个view的方式来实现,但是实现起来应该会特别复杂,而且会影响现有activety的滑动事件。 所以我就想有没有办法做一个低侵入式的方式来实现,尽量不干扰当前活动。后来想到了一个方案,我把需求拆分了两步来实现,首先对当前获得进行截图,缓存改截图文件,然后跳转到另一个专门做签批的activety在图片上进行签批操作。这样1.对原来的activety没有任何影响,2.对activety进行截屏的技术很好实现,3.图片上进行书写签批也有成熟的技术实现。思路理清了事情也就完成了百分之80了。接下来我来仔细和大家讲解下具体实现;大家先把代码下载:URL

首先是搞一个截屏的工具类ScreenShot.java有两种类型的截屏:当前显示内容截取,滚动截取;可以根据需求进行选择用哪种方式实现。这里我们就用shoot方法;shoot方法参数为当前活动上下文,最终结果是将截屏保存到指定位置并返回该位置。这里测试就用根目录做缓存位置

public static String shoot(Activity a) {
ScreenShot.savePic(ScreenShot.takeScreenShot(a), “sdcard/xx.png“);
return “sdcard/xx.png”;
}

截屏工具搞完了接下来就是在需要截屏的active中绑定触发截屏的实现。可以直接注册一个按钮来触发即可

String sdcardpath= ScreenShot.shoot (ProjectDetailActivity.this);  //截屏

截屏之后将图标路径传递到签批的activity

Intent intent1 = new Intent(ProjectDetailActivity.this, JasonDrawActivity.class); intent1.putExtra(“JasonImg”, sdcardpath);        startActivity(intent1);

其中JasonDrawActivity.java就是我们的主角,最终签批的活动。这里呢我使用的是国外的一个开源项目SignaturePad,这个手写效果是我找了很多中最满意的,自带笔锋效果。但是该项目的源码是基于android studio创建的,我要用到的项目是eclispe创建的,没办法直接用,后来我把SignaturePad转换为eclispe模式的。有需要在eclispe实现的朋友可以联系我邮箱。不过大部分人应该都转android studio了。下载下来之后直接作为库项目就可以引入到你自己的项目就行了。JasonDrawActivity中注册的几个按钮就是各种操作的入口。大家自己就能看懂。接下来我来提供示例项目给大家;

下拉框多选功能实现

这里要介绍的是一个开源插件multiple-select  github地址为https://github.com/wenzhixin/multiple-select    插件提供 的 文档本身就很全面,而且一般的主流浏览器都能够支持。

依赖的js有  jquery,bootstrap,multiple-select ;css有bootstrap,multiple-select

使用方法:给select元素设置multiple=”multiple”属性。然后通过$(‘#id’).multipleSelect();对改元素进行渲染即可;为了更能适应中文使用环境可以把js中的部分英文状态改成中文,比如全选的状态等等。可以通过全局搜索定位到相应的位置进行修改。该插件的效果很简洁大方,在我看来是比较美观的。

树形选择框实现

找了很久关于树形选择框的插件。大部分都是ztree来自己实现,虽然能用但是对代码侵入性太高,往往实现一个功能要写大量js,终于在网上被我找到了一个侵入比较低的实现方式,原博客地址为URL。但是呢大神实现后由于时间比较久只有js没有css。我重新给加了css做实现,并且对js做了调整,但是和原效果图还是有区别的,因为重在功能实现,样式大家可以自己参照我写的,做自己对应的调整即可。js下载地址 css下载地址

插件依赖:jquery,ztree

使用方法为:

<input id="simple-select" name="test" />
注册一个input框来进行绑定下拉框只需要一个id即可渲染。name是你自己最终的表单项名称
$(function(){
  var data={items: ${testArray}
  $("#simple-select").drawTree(data);
}
没错就这么简单。超低的侵入性。其中${testArray}为json数组,格式为[  {code:'root',name:'根节点',pid:-1}, 
    {code:'node',name:'二级节点',pid:'root'} ]
可以从后台获取。ajax获取或者直接从作用域中获取都行。