静态公私鈅对生成
Servlet3.0实现上传文件的获取
据说在以前的Servlet版本中,如果想要处理form中post过来的文件数据的话,那么还必须下载第三方的包,比如commons-fileupload等,很是麻烦。但是现在的Servlet版本中已经可以支持对file数据的直接处理,这里姑且记录下简单的用法。
Html端
前端中只要写一个正常提交的表单即可,比如下面这样:
1 | <form action="Display" method="post" enctype="multipart/form-data"> |
当然也可以用ajax的form来提交,这都无妨。
Servlet端
首先需要在Servlet类定义前加上@MultipartConfig
标注,然后在doPost方法里这么写:
1 | protected void doPost(HttpServletRequest request, HttpServletResponse response) |
这样就可以将客户上传的文件在本地保存下来了,非常简单方便(但是不知道的话还真的很麻烦)。
通常这样就足够了,但是有时候我们还需要知道文件的名字,这就稍微麻烦一点了,还得解析协议的header来获得文件名:
1 | protected void doPost(HttpServletRequest request, HttpServletResponse response) |
参考
利用jQuery异步上传文件的插件
现在想实现用ajax来上传文件的功能,但是却发现Jquery自带的ajax方法只能上传文件名,而不能上传文件;用form提交虽然能够上传文件,但是却要刷新页面。。。多方查找下找到了一个可用的jQuery插件,刚好可以满足异步上传文件的要求。
代码
用法
这个插件是基于表单提交的,我们只要正常的写一段提交文件的表单,如:
1 | <form id="myForm" action="comment.php" method="post" enctype="multipart/form-data"> |
然后在js中加上如下代码:
1 | <html> |
这样就可以监听表单的提交事件,把它变成ajax传送到后台,然后将后台返回的信息从data中获取。如此一来就可以用ajax通信来传输文件了。
路径匹配之单向距离OWD算法
简述
** OWD(One Way Distance)**算法也是一种描述两个路径之间相似度的方法,最早大概提出于06年左右。最朴素的OWD算法的思路也非常简单,就是把路径之间的距离转化为点到路径的距离再加以处理。这里只对这种算法做简要介绍,至于深层次的理论有空再研究论文。
定义
在定义路径间的距离$D_{owd}$之前,我们先定义点到路径的距离$D_{point}$:
对于点$p$和一个由多个点组成的路径$T$,定义他们之间的距离为$$D_{point}(p,T)=min_{q \in T} D_{Euclid}(p,q)$$
其中$D_{Euclid}(p,q)$表示$p.q$之间的欧式距离。
然后,我们定义路径$T_1$到路径$T_2$的单向距离$D_{owd}(T_1,T_2)$为:
$$D_{owd}(T_1,T_2)=\frac1{|T_1|}(\sum_{p\in T_1}D_{point}(p,T_2))$$
(对于非离散的路径,我们可以把他看成是一个积分过程)
很容易看出来,这个单向距离不具有对称性,即$D_{owd}(T_1,T_2)$与$D_{owd}(T_2,T_1)$不一定相等。那么为了得到一个对称的结果,我们定义一个新的度量标准:
$$D(T_1,T_2)=\frac12(D_{owd}(T_1,T_2)+D_{owd}(T_2,T_1))$$
这就是OWD距离中最终用来判定路径相似度的标准。
小结
从OWD距离计算的方式就可以看出,他能够很好的对不同长度的路径间距离进行归一化,而且对于噪声敏感度比较低。
参考
Bin Lin, Jianwen Su, One Way Distance: For Shape Based Similarity Search of Moving Object Trajectories. In Geoinformatica (2008)
基于Swing的简单文本编辑器
Java小作业,任务是写一个有改字体颜色大小的文本编辑器。其实相比windows自带的记事本功能还要弱,不过还是拿来练练手了。这里主要也就实现了简单的文件读写和字体等更改操作,还是非常简易的。
实现代码
1 | import java.awt.Color; |
运行截图
基于Swing的FontChooser对话框
不知道为什么,原生的Swing有JFileChooser,JColorChooser但是却没有JFontChooser。虽然网上有很多类似的实现,但是鉴于是作业,我还是自己写了一个简单的FontChooser来练练手。而且真正写起来也不是那么的顺畅,果然还是发现了很多的坑。。。
功能分析
- 既然是字体选择器,那么至少得能够选择“字体”,“样式”,“大小”。
- 这类的对话框一般得是“阻塞“的,即弹出该对话框后,本来的对话框应该是点不动的直到弹出的对话框结束。
- 仿照JFileChooser和JColorChooser,这类选择工具类的对话框设计为静态的比较好。
- 对话框默认的字体一般是待修改的字体。
- 选择成功得返回选择后的结果,选择退出得返回原先的结果。
实现代码
1 | import java.awt.BorderLayout; |
运行截图
Eclipse下WebService的发布和使用
前言
书上和网上有很多介绍WebService、WSDL、SOAP、UDDI概念的内容,大都说的云里雾里。尤其是书上介绍了WSDL、SOAP、UDDI的写法规范,写的天花乱坠,更是让人光看看就不想去了解这个东西了。我觉得这种东西还得实践一下才能知道WebService真正的意义以及WSDL等规范的存在价值。
OK,下面就是本人参照网上各种版本的教程捣鼓出来的WebService的编写和使用方法,不过由于我服务器上没有配置Tomcat、本机又没有域名,所以就没有在UDDI中进行注册。
开发环境
JDK1.8、Tomcat v8.0、Eclipse J2EE Mars.2
服务端
WebService的服务端其实就是一个普通的Java程序,不过需要注意的是新建项目的时候一定要选择Dynamic Web Project,文档树如下图所示:
我新建的项目名叫MyService,只有一个类,写了如下内容:
1 | import java.text.SimpleDateFormat; |
输出:2016-05-25 21:47:49
应作业要求我就写了一个显示本机时间的方法,这都不重要了。
到现在,整个项目就是一个简单的网页项目,下面我们就要用他来生成WebService。
新建项目,找到WebService:
点击Next弹出下面的选框:
注意左边这两个滚动条,第一个滑动条表示我要启动这个服务;第二个滑动条表示我要顺便生成一个与他对应的客户端(当然也可以暂时不生成而是等会用WSDL文件来生成)。然后在上面的Service Implementation里选择想要发布的类的名称,我这里就用上面的那个MyService类,最后下面勾上public the Web Service的选框表示我要用UDDI把它发布出去。
然后一路Next,最后选择Start Server。最后他就会弹出UDDI的注册界面让我们来注册这个服务:
先不管了,反正知道有这么个东西,等部署到服务器上的时候再来弄。
这样子我们的服务端的配置就算搞定了,那么问题来了,其他人该怎么来调用我写的这个类呢?
其实在上一步配置完WebService后,我们可以看到在WEB-INF目录下会生成一个子目录叫wsdl/,这个文件夹下有一个文件叫MyService.wsdl。没错,这个就是WSDL。用Eclipse打开会默认在Design界面显示成类似UML的东西(不知道是不是):
当然也可以在Source界面显示成xml代码的形式:
没错,这个就是书上介绍的恶心的WSDL文档,其实这东西完全不用自己写,都是可以由eclipse 帮我们生成。
最后,我们也可以中浏览器中打开这个文件:”http://localhost:8080/MyService/services/MyService?wsdl"。这就意味这只要本机能作为服务器,那么因特网上的任何一台主机都可以访问这个url,并且利用这个内容调用服务器中的服务。
下面就来介绍怎么远程调用这个服务。
客户端
新建项目,选择Web Service Client项目:
在框框中输入需要调用的WSDL文件。我这里调用的就是上面生成的那个URL。
不过需要注意的是我们需要新建一个Dynamic web project,并用他来替换箭头中指向的项目,即把客户端安装到这个项目中。
一路next就可以在目标项目中生成下面的一堆文件:
这就是我们获得的客户端文件了,打开看看才知道,这些东西其实是用RMI写的。。。。。。
然后我们在这个项目中新建一个测试类Test:
1 | package test; |
这样就可以像在本机调用MyService类一样的调用那个getTime函数了,最终也返回了正确的结果。
参考资料
Julia集的win32+GDI演示
虽然不是第一次win32来写窗口程序,但是最近python和java用惯了,还真用不惯win api繁琐的调用方法,光是一个模版就好难理解。
事实上,那些模版的玩意写上去就好了,我们只要在他的消息循环的处理里添加绘图的函数即可。
至于绘图,我用的是GDI库最简单的用法,不加缓冲直接逐像素点打印。效率很低,而且会出现刷屏的现象。正确的做法应该是在内存中创建一张Image,向这个里面写再一次性输出。(这样弄效率高但是在网上找了半天没找到傻瓜式的代码模版。。。)
代码
1 | #include <windows.h> |