只学不做等于没学,只知不做等于无知。
目 录
前 序................................. - 1 -
md5加密 jQuery validate验证控件........... - 1 -
Apache + Tomcat负载均衡.................... - 2 -
防止同一用户多次登录....................... - 3 -
登录三次密码输入错误锁定用户................ - 4 -
定时器及定时任务.......................... - 4 -
HttpClient 业务描述........................ - 6 -
数据库连接池(c3p0,dbcp,BoneCP,proxool).... - 7 -
乱码问题的解决方案........................ - 10 -
国际化问题............................... - 12 -
验 证 码............................... - 13 -
多线程(单例)........................... - 13 -
SSO单点登陆............................. - 14 -
Ajax优点................................ - 16 -
CKEditor组件技术......................... - 17 -
Spring发送邮件技术....................... - 18 -
zTree树组件技术.......................... - 19 -
Ant技术................................. - 20 -
My97日期控件技术......................... - 21 -
JSTL、EL标签、Servlet.................... - 21 -
Ibatis的N+1问题......................... - 22 -
OSCache缓存技术.......................... - 23 -
Webservices缓存技术...................... - 24 -
SWFUpload 、AjaxUploadFile上传............ - 26 -
报表技术 (jasperReport、JFreeChart、POI).... - 27 -
SQL注入................................. - 29 -
跨站点脚本攻击(XSS)..................... - 30 -
各类框架整合的核心点...................... - 31 -
SVN版本管理技术.......................... - 35 -
lhgdialog 对话框组件技术.................. - 37 -
Lucene技术.............................. - 37 -
Tomcat调优技术........................... - 38 -
Velocity模板技术......................... - 39 -
jBPM工作流引擎........................... - 46 -
权限管理................................. - 48 -
后 记................................. - 49 -
md5加密 jQuery validate验证控件
业务描述:
记得在之前做的博客论坛项目中,客户向我们提出了一个业务需求说,随着公司的发展人员也随之增多,在客户注册时同名、个人信息安全等等问题越来越多,怎么才能解决这些问题呢?之后我们项目经理向我说明这一业务需求,因为之前我了解过关于md5加密技术和 jQuery validate验证控件。就单单拿用户注册来说吧,应用jQuery validate验证技术可以有效的在前台页面及时对注册同名、注册邮箱、注册电话号码以及个人生日的有效性等方面做出判断,有效的减少了对数据库的压力,提高了业务效率。还有就是个人信息安全的问题,一些网站或是论坛后台数据库存储信息或者一些文本信息时采用明文存储,这样安全隐患很大,一些不法分子钻空子,容易造成个人信息被恶意盗取,造成个人信息泄露,这时我想到了md5加密技术,md5加密技术采用逆向算法,安全性很高很难被反破解,这样个人信息及其其他信息就做到了真正的安全,提高了客户的体验度。
Apache + Tomcat负载均衡
技术点介绍及业务场景:
之前开发的一个北京市网络地址采集的项目,由于这个项目数据中数据量比较大如地址信息表,超过百万,而且访问相对来说比较频繁负载量也较大,甚至在有些时候造成了后台服务器宕机的现象,为了解决这个问题我便想到了 Apache+ Tomcat负载均衡技术,即对Apache的配置文件进行配置服务器更快高效的运行,提高了服务器的效率,节约了客户端访问的等待时间。
配置步骤:
(1). ①Windows环境下:修改 tomcat\bin\Catalina.bat,文件,
在%DEBUG_OPTS% 后面添加-Xms256m -Xmx512m
②Linux环境下:打开在Tomcat的安装目录的bin文件的 catalina.sh文件,进入编辑状态,在注释后面加上如 下脚本:
JAVA_OPTS='-Xms512m -Xmx1024m'
JAVA_OPTS="$JAVA_OPTS -server -XX:
PermSize=64M -XX:MaxPermSize=256m"
(2). Windows环境下查看系统最大支持内存命令: java -Xmx1024m -version
(3). 查看现有tomcat的内存大小情况
http://localhost:8080/manager/status ,并输入您在安 装tomcat时输入的用户与口令,如 admin ,密码 admin (密码是您在tomcat安装时输入的)
防止同一用户多次登录:
业务描述:
方法一:
在用户表中增加一个字段登陆状态、1表示已登录、0表示未登陆。默认值为0.在登陆验证时、先根据名查询这个字段、如果值等于1、则提示用户已经登陆、直接跳转到成功页面。如果用户为0、则继续验证密码等是否正确。如果登陆成功、更新登陆状态字段为1,退出登陆时、修改登陆状态为0。
方法二:
在用户登陆成功时,把用户名存入seSSIon中、退出时清空seSSIon。然后在登陆页面用jsp serverlet 判断如果seSSIon不为空、则跳转到成功页面。这样如果用户已经登陆、当用户再次访问登陆页面时,就会之间跳转到成功页面。
登录三次密码输入错误锁定用户:
业务描述:
在用户表中增加2个字段、一个errorcount字段(默认值为0)、一个locktime字段。登陆时,先验证用户名如果正确,判断,数据库中如果errorcount==3.并且“系统当前时间”减去“上锁的时间locktime”小于你想锁定的时间(如24小时)则提示用户被锁定并返回登录页面。否则,继续验证密码,如果验证密码错误、则errorcount加1,.然后更新到数据库中,判断(如果errorcount>3.,则errorcount =1(解锁以后、密码又错误),如果errorcount==3,则把当前系统时间赋值给locktime字段,存入数据库),返回到登陆页面。如果登陆成功时、把这个字段的值更新为0、
定时器及定时任务:
技术点介绍:
在业务中、我们在很多时候会需要用到定时器,常见的定时器
有Java定时器、Spring定时器、Quartz定时器。
一、Java定时器:
定时任务类继承Java.util.TimerTask。实现run方法。调用类(main方法):实例化Java.util.Timer类,调用它的schedule( )方法。传3个参数:(任务类、延迟启动时间、每隔多少时间执行一次)。
Java.util.Timer.cancEL()方法结束这个定时器。
二、Spring定时器:
在Spring框架中应用比较成熟的一种方式。Spring将定时任务的调用部分提到了配置文件当中,使定时器的触发条件变得更加灵活,Spring定时器的实现,仍然需要 继承 Java.util.TimerTask,实现run方法。
配置:1、要调度的任务类配置
2、配置触发器、及参数
3、总调度、启动定时器
三、Quartz定时器:
以上两种对于指定了具体的年月日时分秒而执行的任务还是不能解决。用Quartz可以。Quartz是基于Spring框架之上的更加强大的定时器,它不仅可以轻松的实现前面两种定时器的功能,还实现了非常繁复的时间触发执行的任务,Quartz有两种方式来调度定时任务,一是使用Spring提供的 MethodInvokingJobDetailFactoryBean 代理类,Quartz通过该代理类直接调度任务类的某个函数;二是任务类继承QuartzJobBean类或者实现org.quartz.Job接口,Quartz通过该父类或者接口进行调度。Quartz有两种方式来配置促发器,
1.scheduling.quartz.CronTriggerBean. 可以用cron表达式来指定具体时间触发的定时任务。
scheduling.quartz.SimpleTriggerBean 配置和Spring类似。
业务描述:
我以前做过一个网上商城的项目,在里边有个促销商品模块.,一些特定的商品、在特定的节假日期内要做促销、就像我们看一些购物网上“十一手机大促销”之类的促销信息。这些信息他只在特定的时间段显示(例如10月1日到10月7日),过了这个时间就会消失。当时我就想到了器、于是在网上复习了一下定时器、最后配置了一个Quartz定时定时器,在数据库里多加了一个字段,1表示展示、0表示不展示。开始时、设置成0.然后通过定时器每隔一段时间扫描一次当前系统时间、如果在10月1日到7日之间,就更新这个字段为1。不在则更新为0.这样就完美解决。
HttpClient 业务描述
技术点介绍及业务描述:
东软之前开发了一套位置服务基础业务管理平台即LBMP。LBMP的请求要求是这样的:
业务平台通过HTTP POST方式发送地理信息请求到GIS。请求行格式为:POST SP host SP HTTP/1.1 CRLF。 请求中必须包含实体头Content-length,请求的消息体是XML格式的请求消息,其长度由Content-length指定。LBMP每次升级后,都需要我们对其业务进行测试,所以以前写了个测试的小程序,从文件中读取XML内容,发送给LBMP服务,查看返回结果。 我以前程序请求LBMP服务一直用的是Java.net.HttpURLConnection,由于jdk库本身提供的功能不够丰富和灵活,随着LBMP不断的升级,我们需要高效的,最新的支持 HTTP 协议的客户端编程工具包,所以我们运用了HttpClient 重写了一下测试程序, 它支持 HTTP 协议最新的版本和建议…
数据库连接池(c3p0,dbcp,BoneCP,proxool)
技术点介绍及业务描述:
我们都知道,最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接并释放资源。由于频繁的打开和关闭连接对JVM包括数据库都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题。因此连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问,这样省略了创建连接和销毁连接的过程。当你初始化到数据库连接时,首先会查找连接池中是否存在连接,如果存在,则返回给你,你使用它就可以连接到数据库,当你用完以后,关闭连接,则该连接返回连接池,准备下一次使用。到数据库的连接并不会真正关闭,而是被暂时存储在连接池中。这样初始化连接的过程就变为从连接池“租借”连接,提高了性能。
我曾经接触的一个外网的购物商城项目时,考虑到会有大批量用户同时访问的可能,所以我们采用了数据库连接池以满足项目的需要:首先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,其实返回给连接池后这些连接并不会关闭,而是准备给下一个调用者进行分配。由此可以看出连接池节省了大量的数据库连接打开和关闭的动作,对系统性能提升的益处不言而喻。几个重要的参数是:最小连接--应用启动后随即打开的连接数以及后续最小维持的连接数;最大连接数--应用能够使用的最多的连接数;连接增长数--应用每次新打开的连接个数。
一、dbcp dbcp可能是使用最多的开源连接池,原因是因为配置方便,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。 使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控。
二、c3p0 c3p0是另外一个开源的连接池,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。 使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,此外不提供连接池监控。
三、BoneCP BoneCP是一个Java数据库连接池库,官方介绍它的速度非常快,测试值高出C3P0、DBCP很多,性能也非常出色,值得一用。
使用BoneCP有一些要求:
1)Google Guava library:是一个对Java Collections Framework 增强和扩展的一个开源项目
2)The SLF4J logging library
3)JDK1.5 or higher
四、proxool proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。 使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码在另外2个开源连接池中成功结束,但在proxool中出现异常退出。
乱码问题的解决方案
技术点介绍及业务描述:
接触乱码及三种编码格式:(1字节 = 8位):
UTF-8:一个汉字占3个字节。Ajax提交默认采用该编码格式, 且无法更改。
GBK:一个汉字占2个字节。
ISO-8859-1:1个字节。流传输采用的都是该编码格式。
★解决乱码问题方法A:(对于post方式提交)
1). 配置struts.xml文件:
<constAnt name="struts.i18n.encoding" value="ISO-8859-1"/>
2). 调用以前封装好的转码工具类的静态方法解决乱码问题;
①Ajax提交:EncodeUtil.encode(str, "ISO-8859-1", "UTF-8")
②form提交:EncodeUtil.encode(str, "ISO-8859-1", "GBK")
★解决乱码问题方法B:(对于post方式提交)
1)配置struts.xml文件:
<constAnt name="struts.i18n.encoding" value="ISO-8859-1"/>
2)使用过滤器,对Ajax提交的请求加上Ajax标识,非Ajax提 交的请求不加标识;然后在过滤器中进行判断,若存在Ajax 标识,则"ISO-8859-1" → "UTF-8";若不存在,则 "ISO-8859-1" → "GBK"
★解决乱码问题方法C:(对于post方式提交)
1)配置struts.xml文件:
<constAnt name="struts.i18n.encoding" value="UTF-8"/>
2)把所有.jsp文件的编码格式改为UTF-8
<%@ page language="Java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
</html>
</head>
国际化问题
技术点介绍及业务描述:
国际化:应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。
国际化相关的Java类
Java国际化主要通过如下3个类完成
Java.util.ResourceBundle:用于加载一个资源包
Java.util.Locale:对应一个特定的国家/区域、语言环境。
Java.text.MessageFormat:用于将消息格式化
国际化资源文件
为实现程序的国际化,必须提供程序所需要的资源文 件。资源文件的内容由key-value对组成。
资源文件的命名可以有3种格式:
basename_language_country.properties
basename_language.properties
basename_properties
验 证 码
技术点介绍及业务描述:
验证码是每个登录页面都有的信息,用户都感觉是多此一举,并且还很麻烦,但对于一个完整的系统来说验证码起着至关重要的作用。验证码就是将一串随机产生的数字和字符,生产一幅图片,图片里加一些干扰像素(防止OCR),输入表单提交网站验证,提交成功后才能使用某项功能。 验证码一般是防止有人利用机器人自动批量注册,对特定的注册用户用特定的程序暴力破解方式进行不断的登录、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。像百度贴吧未登录发贴要输入验证码大都是为了防止大规模匿名回帖的发生。
多线程(单例)
技术点介绍及业务描述:
一个进程可以有多个线程,多线程就是当你打开outlook收新邮件的同时,还可以查看已下载的邮件,这两件事情互不干扰 在大数据量访问数据库的时候,无疑会给数据库带来很大的压力,这时我们采用缓存方法,为了使用的灵活性,我自定义了一个缓存类,但在实际应用中发现每次查询时都不是一个实例,造成存储和取出的数据不一样,甚至出现取不到数据的情况,这样就还得从数据库重新获取数据。这是我就采用了单例模式来解决这一问题,首先单例至始至终只有一个实例,而且是自定义的,并且可供整个项目使用。但因为数据量大,很可能出现并发的现象,这时我使用了多线程的synchronized(同步),在缓存类的方法名上加上synchronized,就形成了类级锁,也就是说当这个类正在被访问时,类里的其他方法都不能被访问,这样肯定影响了系统无法正常运行。但要是把synchronized加在类内部具体的方法上,就形成实例锁,当方法被访问时只有这一个方法不能再被其他人访问,其他方法可以正常访问,最终将缓存成果实现。
SSO单点登陆
技术点介绍及业务描述:
在之前的公司,公司的客户向公司提出了一个业务需求,客户说,随着公司的发展,业务系统的数量在不断的增加,老的系统却不能轻易的替换,这会带来很多的开销。其一是管理上的开销,需要维护的系统越来越多。怎么能够使这些系统统一管理起来,之后项目经理向我们开发小组说明这一业务需求,因为之前了解过SSO单点登陆,所以我首先想到了用SSO单点登陆,首先单点登陆就是所有应用系统共享一个身份认证系统,认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,通过cookie记录登录信息, 系统应将这个cookie(ticket),返还给用户。另外,如果再访问其它的系统,应用系统能对cookie进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,如果已经登陆,判断其有效性,让用户只登录一次,单点登陆内的其它系统则无需登陆,可以直接访问系统的内部资源,如果没有登陆将直接跳到登陆界面,从而实现系统的集中管理,更加方便用户对系统的操作,管理,之后我向项目经理提出了用单点登陆来对这些系统进行集中管理,经过项目经理的确认,单点登陆确实完成当前的这种业务需求,之后项目经理就把这个任务交给了我,让我去和客户交谈,之后我到客户那之后发现客户的很多系统的 数据是相互冗余和重复的,数据的不一致性会给管理工作带来很大的压力。但是业务和业务之间的相关性很大,例如公司内部的OA系统 和财务系统,财务系统和人事 系统之间都不可避免的有着密切的关系。单点登陆正好能够解决当前的数据是相互冗余和重复,不一致性问题
我首先建了一个统一的用户表,一个服务认证系统,然后在OA系统,财务系统,人事系统中各做一个登陆界面,当用户登陆这里面的任何一个系统,登陆的用户名和密码都提交到统一的服务认证系统,服务认证系统调用数据库与客户端提交的用户名,密码比较验证,如果正确将用户名记录cookie,再访问其它系统直接调用cookie,而无需登陆就可以直接进入系统,最后就实现了这种业务功能,但是在实际的应用中发现这样存在着很大的安全风险,因为Cookie只是存了用户名,如果其他人知道用户的名字,然后模仿一个Cookie,同样也能够登录进去,这样对用户的信息有一定的安全隐患,我经过仔细研究决定把用户名和密码用MD5加密之后再存储Cookie,这样即使知道了用户名也登录不了系统,提高了用户信息的安全性,解决了上面的问题。
Ajax优点
技术点介绍:
Ajax优点:
1). 减轻服务器的负担。因为Ajax的根本理念是“按需取数据”,所以最大可能在减少了冗余请求和响影对服务器造成的负担;
2). 无刷新更新页面,减少用户实际和心理等待时间,增加用户体验度
业务场景:
沈阳理工大学自动化办公平台:考试成绩查询模块
考试过后,给位老师假期的憧憬之余,同时也为同学么考试分数查询而忙碌,传统纸品记录,不仅容易被别人篡改,而且容易丢失等。给老师们和同学们带来了不必要的麻烦。所以我们团队在设计此系统时,加入了这个模块,使用Ajax(,,,,)为核心技术,使用jQuery框架。原因大致有两点:第一学生查询考试分数时并发大,查询数据量大。 Ajax是局部刷新技术,当教师输入准考证号后,点击查询,只有一小部分被刷新,用来显示学生的考试分数,这样就降低了服务器的负载。同时由于不刷新页面,减少用户实际和心理等待时间,使学生和教师不必面对白屏而焦急等待,同时即使有效的提示用户操作,增加用户体验度,给本来单调烦躁工作的教师带来便利,提高了工作效率。
CKEditor组件技术
技术点介绍:
CKEditor优点:与纯文本形式的输入界面相比更具有活力提高 了用户体验度。
业务描述:
沈阳理工大学自动化办公平台:学校信息发布模块
在学校发布重要新闻通知时需要文本编辑器,为什么选择
CKEditor技术呢?传统的文本编辑器不仅字体字色单一,而且不支持写入图片。CKEditor技术解决了这些问题比较突出,重点的内容可以用字体,样式,字色的变化提醒读者重点,可以插入图片更加生动,形象。
Spring发送邮件技术
技术点介绍及业务描述:
Spring邮件发送是基于Spring内部的JavaMailSender发送JavaMail邮件(注意:本功能主要应用在外网),比如用户在要注册某个网站,在用户注册之后系统会发送一封邮件到用户指定的邮箱,由用户点击来激活帐号,说的更业务一点就是在用户注册是会指定用户输入一个邮箱,用来接收用户注册后的连接,方便激活帐号,在用户点击注册以后首先会将用户的一些基本资料存入数据库,在存入数据库的同时调用邮件发送,从而触发发送事件,但是发送邮件相对来说可能需要等待,如何时间过长会影响用户体验度,所以我们在邮件发送之前开启多线程,也就是在邮件发送的同时,也在浏览器上弹出对话框,提醒并引导用户去指定邮箱激活帐号,用户可以通过指定连接激活帐号状态!
zTree树组件技术
业务描述:
前段时间我们做了一个咱们市教育局做了一个档案管理系统,再这个项目有一个菜单模块和权限模块,当时因为考虑到这两个模块的关联性,我们就采用了zTree这个插件,这个插件拥有中文API,易懂易用,并且可以异步加载,如果没有这个异步加载的话,一次性从数据库访问过多的数据容易造成浏览器的假死,从而降低了用户体验度,因为我之前对这个zTree技术有所了解,加上有中文API,所以应用起来也相比比较轻松,菜单管理是一个树形结构,父节点包含子节点,首次进入系统会加载所有的父节点,用户可以根据自己的需求展开指定父节点,当用户点击指定父节点是会加载该节点下的所有子节点,并且我们在节点旁边添加了编辑、添加、删除按钮,从而方便了用户的业务需求,而权限模块关联到了5张表,角色表,用户表,菜单表(权限表),用户角色关联表,角色权限关联表,首先赋予某个角色某些权限,然后在指定某个用户为指定角色,通俗一点就是在给某些角色赋予某些权限的时候我们可以获取该节点或父节点的ID,然后把这个节点或父节点的ID和某角色的ID一并存入角色权限管理表,而从形成了角色和权限的关联,然后再将指定用户的ID和某个角色的ID一并存入用户角色关联表,也就形成了用户和角色的关联!然后就用zTree技术完成了这两个模块的基本业务!
Ant技术
技术点介绍:
Ant是一种基于Java的build工具。
与基于shell命令的扩展模式不同,Ant用Java的类来扩展。(用户)不必编写shell命令,配置文件是基于xml的,通过调用target树,就可执行各种task。每个task由实现了一个特定Task接口的对象来运行。 当开始一个新的项目时,首先应该编写Ant构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为build.xml,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。
业务场景:
比如我们在发布项目的时候,当你的项目在增加新的功能或者模块的时候,你不可能在客户那里安装开发工具,在客户那里写代码在编译发布 所以这时我们就要用到Ant了 他只需要你创建一个build.xml文件 然后在DOS命令窗口中输入Ant就可以重新编译项目发布项目,对项目进行打包等。
My97日期控件技术
技术点介绍及业务场景:
My97日期控件基于JS的一个非常好用的日期控件,功能非常优秀,它通过简单的引入就可以直接整合到我们所需要的任何地方,比如在注入用户时,可以用这个输入用户生日,在商品添加中,用来加入促销日期等等。
JSTL、EL标签、Servlet
技术点介绍及业务场景:
有时候,一些同事向你请教问题,当你发现他整个jsp页面充满了scriptlet让你眼花缭乱的时候,你就会想到JSTL标签与EL标签的作用是多么的强大,如迭代一个List用JSTL只需要一个<c:foreach>标签就能解决。同时,通过提供大多数 Web 应用程序常用功能的标准实现,JSTL标签有助于加速开发周期。与 EL标签结合起来,JSTL标签可以不需要对表示层程序编写代码,这极大地简化了JSP应用程序的维护。
Servlet在modEL+jsp+Servlet的MVC设计模式中处于控制层。同时Servlet为验证码的使用提供了极大的方便。Servlet通常用于jsp中,通过Servlet使内容和外观分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。
Ibatis的N+1问题
技术点介绍及业务场景:
当我们在进行一对多查询的时候,就会遇到所谓的N+1查询问题,即发送了N+1条sql语句(如:查询栏目极其相关列表信息,首先要发送一条查询栏目id的语句,然后再发送一条根据栏目id查询其下文章列表信息),对于一对多/多对多的问题,传统的办法是在一对多/多对多关联的属性上再做一次子查询,这个解决办法很简单易懂,但是有个缺点,会导致N+1 sELects,导致查询的性能瓶颈,在ibatis中,有一个更好的解决办法是sql做一个表连接,然后主表的resultMap配置上加“groupBy='...'”属性,这样一次查询就搞定,避免了N+1问题。
OSCache缓存技术
技术点介绍及业务场景:
之前我们做的网上商城系统,在测试的时候发现,系统的性能并不是很好,特别在高并发的时候,服务器的响应比较缓慢。我们经过探讨之后,决定使用OSCache技术。 OSCache是一个高效的J2EE缓存框架,能够很好的解决动态网站速度的问题。
首先,在页面上一些比较不太容易改变并且包含业务数据比较多的部分,比如商品的分类列表、页面公用部分等,加入了页面cache,可以使响应时间减少数秒,很好地减轻了服务器的压力。
其次,在业务逻辑层,我们创建了一个全局的公用缓存容器,通过单例模式,确保这个容器是唯一的,在首次请求数据时,会把从数据库查询得来的数据放到容器中,之后再次访问时,无需连接数据库即可得到数据,这样就减轻了数据库的压力。
OSCache还可以缓存2进制内容,比如图片和PDF文件,产生的图片和PDF文件在服务器加载的时候非常的耗时。通过使用OSCache,减轻了服务器读取这些内容时的性能消耗。
Webservices缓存技术
技术点介绍及业务场景:
(1). 一个xFire与Spring结合带安全的例子:
Webservices下面有很多实现,为什么我们当初采用的是xFire去实现呢?因为我们当初是用Java开发的项目,也得知调用接口的项目也是Java开发的,都是基于SSI框架。 我们当时项目中的一个资产管理模块中的数据在客户的另一个项目中也需要,在此需要我们在资产管理中提供一个接口,供调用。而我负责的是将接口公开,并向客户提供接口的url,接口和必要的jar包!我在公开接口的时候考虑到我们项目的安全性,所以加上了身份授权去验证,确保了程序安全性。接口的公开:首先在web.xml文件中去进行配置对应的servlet进行mapping去集成xFire.集成了spring,在applicationContext.xml文件中引入
<import resource="classpath:org/codehaus/xFire/spring/xFire.xml" />
下面进行配置,来公开接口。安全性考虑是基于soap header的安 全验证的方式,需要引入inhalers去指向授权的类,在 AuthenticationHandler.Java类中去对客户端的身份进行验证,此类 是继承AbstructHandler接口的。(服务端完成)
完成服务端我需要向客户提供访问的url和xFire的jar包,告诉他身份授权码和需要调用的接口。客户端向服务端传递信息验证的时候也需要一个类,ClientPasswordHandler.Java类是在客户端的也需要继承AbstractHandler接口,通过此类想服务端传送验证信息,传过去Header,username,password进行服务端的矫正。
(2). Axis2的实现,基于eclipse插件的实现
如果要实现不同语言之间的交互,无疑我们用AXIS2,它虽然依赖大量的jar包,但它能很好的保证不同语言和服务器之间的交互,性能好!
我们在完成华天药业一个项目时,里面的进销存的历史记录和产品名称需要去调用其他项目中的数据,而那个项目是.net开发的,我考虑到跨语言之间的调用从而跟我们项目经理商量,采用了axis2去实现。因为它是跨语言之间webservices接口调用的不二选择。客户向我提供了访问的url路径和eclipse插件生成的jar包,我调用了其接口来实现我们本项目中需要的业务请求。
我们在实现Axis2的时候是在eclipse中去集成插件来完成工作的,但是它也需要前提工作,首先需要 axis2-1.6.2-bin.zip,axis2-1.6.2-war.zip 包,将axis2-1.6.2-bin.zip配置到环境变量值(如不配置可能出现莫名其妙的错误)。axis2-1.6.2-war.zip需要放在 apache-tomcat-6.0.16\webapps下。我们在eclipse下集成插件后启动tomcat会在apache-tomcat-6.0.16\webapps下生成你启动的axis2文件,将生成的文件复制到服务端,(具体内容看下面网址:
http://www.lifeba.org/arch/Java_axis2_webservice.html)。在服务端web.xml文件配置axsi2的文件,和访问的路径。services.xml文件中去配置你要公开的接口。客户端要调用的时候不需要任何 配置,只需服务端用插件生成的一些类和必要的jar包进行调用!
SWFUpload 、AjaxUploadFile上传
技术点介绍及业务场景:
在之前的公司,公司的客户(宽带联通)向公司提出了一个业务需求,怎么能够让这些用户将自己的经典视频发布到自己的内网上,方便用户下载流畅的播放。之后项目经理向我们开发小组说明这一业务需求,因为之前了解过AjaxUploadFile上传,所以我首先想到AjaxUploadFile上传,在网站上导航上有一个影院的按钮就会跳转到一个新的页面上,里面有各种情节的视频,可以任意流畅在线观看、下载,还可以任意上传,上传模块我们为了增强用户体验度的采用了AjaxUploadFile上传,可以无刷新页面进行上传便让其它用户进行观看,在这个视频网运行了半年多,用户发现每次只能够上传一次,很麻烦,能不能在原有的基础修改一下,一次能不能上传、下载多个视频,这时我想到了SWFUpload上传,可以同时上传多个文件, 类似ajax的无刷新上传; 可以显示上传进度;有良好的浏览器兼容性。
报表技术 (jasperReport、JFreeChart、POI)
技术点介绍:
在众多Web系统中,数据统计分析报表往往是类Excel的二维表,这种报表样式不便于直观的比较和分析。为了更加适应企业需要,便于领导层做商业性的决策和分析,数据的体现形式由以往的单一形式发展为现在的直观图表形式, 目前生成基于浏览器的Web图表技术很多,一是通过VML(VectorMarkupLanguage)方式实现,它存在很多局限性,如受限于浏览器,且没有封装成完整的图表开发包;二是通过Applet产生图表,它对客户端要求较高,只适合一些局域网应用,而对于因特网的环境不太适合;三是通过服务端直接生成图表的图片,这种方式对客户端几乎没有什么要求,直接在Web服务器端生成好图表图片文件后发送给浏览器,它的缺点是加重了服务端的负担,对服务端要求就相对较高。综合以上分析比较,第三种服务器端直接生成图表的方式更适合于我们目前的需求。目前网上有很多关于服务器端直接生成图表的解决方案,如:
JFreeChart,ChartDirector,JReport,JsperIReport,EclipseBirt等。
(以上说不说自己拿捏,我感觉可以缩短下,根据自己理解,到面试的时候就当做是发表下自己对报表的见解)
业务场景:
有一次我们在开发某煤矸石热电厂管理信息系统中,该系统中存在一些报表需要由动态图表显示,为了将这些报表数据可视化,经过我们小组的讨论,最后我们选用了开源的、低成本的、易于维护的JFreeChart图表组件。这项技术能够根据报表数据动态生成多样化、直观化的年度、月度、日度等图形报表。不仅效果挺好,而且更加直观的可以看出结果,增强了用户的体验度和满意度。
SQL注入
技术点介绍:
SQL注入就是利用现有应用程序,将(恶意)的SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。开发人员在编写代码的时候,没有对用户的输入数据或者是页面中所携带的信息(如Cookie)进行必要的合法性判断,导致了攻击者可以提交一段数据库查询代码,根据程序返回的结果,获得一些他想得到的数据,这样就导致了用户信息的泄漏。
业务场景:
例如,在做一个登陆系统时在对文本框输入的值时没有对特殊字符进行过滤,在写SQL语句是有的也是使用的字符串拼接。在做完之后进行测试时,在文本框输入一些特殊字符,也可以进行登陆,这样就会导致用户信息的安全出现问题,还有就是在输入访问地址时输入一个参数,结果可获取用户的数据,这也导致用户信息的流失,所以在做项目时,一定要对客户输入信息进行过滤,尤其值对一些特殊字符的过滤,不要使用SQL动态拼接,尽量用“?”传参,不要使用管理员身份连接数据库,创建多个单独的用户,分别赋予不同权限,还有就是不要在数据库中直接存放用户的机密信息,对用户的机密信息进行加密处理,尽量用尽可能少的提示,对错误信息最好是自定义,采用一些专用的防SQL注入检测工具。
跨站点脚本攻击(XSS)
技术点介绍:
跨站点脚本攻击(XSS),就是通过在地址栏输入一些script脚本语言,在连接地址是就会出现别的页面,或者会造成页面混乱,达到对网站的攻击效果。 跨站点脚本攻击(XSS)是一种破坏安全的方法,它利用了动态生成的网页。在XSS攻击中,Web应用程序与脚本一起发送,当它被没有戒心的用户的浏览器阅读,或者被本身对交叉网站脚本不设防的应用程序阅读时该脚本被激活。由于动态网站依赖于用户的输入,恶意用户可以通过将恶意脚本藏在合法的请求中,将恶意脚本输入进网页。常见的使用方法包括搜索引擎对话框、在线论坛以及公众可以访问的博客网站。一旦发起XSS,攻击者可以改写用户设置、盗用账号、留下恶意代码的Cookie、暴露SSL连接、访问受限制的网站、甚至发假广告。避免XSS最简单的方法是给Web应用程序增加能使动态输入忽略某些命令标签的代码。
业务场景:
举个很简单的例子,就如我所使用的动态头像一样,在后台设置一个参数入口,用来接收可以扩展的数据,而这些数据就是攻击代 码。比如 http://10.1.206.86/ 存在一个 attack.asp,当然攻击者不会起一个这么暴露的名字,然后设置参数入口 sid ,看起来是不是很像什么帖子?后面加入参数 location.replace("123") ,就可以做到真实的效果。我再把 alert() 改成 open('') 呢?一秒钟之内就弹出无数个窗口,整个系统资源耗尽,连让你关闭进程的时间都没有。老老实实安安心心按复位键重起吧……不过 IE6 开始,浏览器发现这样的错误代码就会提示是否执行,你取消就可以躲过一劫了。
各类框架整合的核心点
技术点介绍:
一、Struts2+Spring+Hibernate
(1). 用到的jar包
struts-core-2.x.x.jar ----Struts核心包
xwork-core-2.x.x.jar -----身体ruts在其撒很难过构建
ognl-2.6.x.jar ----对象导航语言
freemarker-2.3.x.jar ------Struts2的ui标签的模板使用
commons-fileupload-1.2.x.jar ----文件上传组件 2.1.6版本后需加入此文件
struts-spring-plugin-2.x.x.jar ---用于Struts2继承Spring的插件
hibernate核心安装包:
hibernate2.jar
lib\bytecode\hibernate-cglib-repack-2.1_3.jar
lib\required\*.jar
Hibernate安装包下:
hibernate-annotations.jar
lib\ejb3-persistence.jar、hibernate-commons-annotations.jar
Spring安装包下的
dist\spring.jar
lib\c3p0\c3p0-0.9.1.2.jar
lib\aspecti\aspectjweaver.jar
aspectjrt.jar
lib\colib\cglib-nodep-2.1_3.jar
lib\j2ee\common-annotations.jar
vlib\log4j\log4j-1.2.15.jar
lib\jakarta-commons\commons_loggin.jar
(2). 核心点:
1)action层要继承ActionSupport类
2)没有struts-config.xml文件,多了个struts.xml 文件
3)核心包struts2-spring-plugin-2.x.x.jar,包里面 将action托管给Spring管理,
4)dao层要继承HibernateDaoSupport类
5)检查/WEB-INF/applicationContext.xml中mybiz的 路径是否正确
二、Struts1+Spring+Hibernate
(1). 核心点:
1) 比Struts2 整合里面多加了一个固定的 actionForm
2) 还有交给Spring管理的步骤是不一样的。Struts2是一个核 心包Struts1是把type里面的值写成:
org.springframework.web.struts.DelegatingActionProxy
①、action层得继承 DispatchAction
②、dao层得继承HibernateDaoSupport
③检查/WEB-INF/applicationContext.xml中mybiz的路径 是否正确
三、Struts2+Spring+Ibatis
Struts2是在webwork2基础发展而来的,也是属于mvc框架。尽管Struts2和Struts1在名字上的差距不是很大,但是Struts2和Struts1在代码编写风格上是不一样的,其全新的体系结构与sturts1的体系结构的差距巨大,如下图所示:
其实这种架构,和Struts+Spring+Hibernate架构差不多的,只是将持久层换成了Ibatis做为架构的持久层,Ibatis和Hibernate一个主要的不同就是:
(1) Hibernate是全自动的ORM持久层框架技术,而ibatis则 是一个半自动的ORM持久层技术.
(2) Ibatis需要手动进行sql语句的编写,而在Hibernate 中,sql是 又Hibernate生成的.
(3) 在SSH架构中,有对应的pojo类和.hbm.xml文件,并且进 行了相应的配置,而SSI这种架构,是需 要在xml文件中手写sql语句的.
(4)在配置文件中,applicationContext.xml文件,进行相应的 配置
①配置dataSource(连接数据库的连接字符串,用户 名和密码);
②配置sqlMapClient,将前面的dataSource注入给 sqlMapClient,其实这里的sqlMapClient相 SSH架构中的sessionFactory(会话工厂);
③定义事物管理;
④定义策略,拦截器,等等;
⑤根据Spring的IOC依赖注入的原则,将各个层进行注 入的操作,顺序和SSH架构中的注入是一样的。
1. 先将dao层注入给,sqlMapClient,这个 sqlMapClient相当于SSH中的sessionFactory;
2. 在将Service层注入给dao层;
3. 最后Action注入给Service业务层.
SVN版本管理技术
技术点介绍及业务场景:
SVN(subversion)是近年来崛起的版本管理工具,是CVS的接班人。目前,绝大多数开源软件都使用SVN作为代码版本管理软件。
所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上是不可以工作。
下面举例说明:
开始新一天的工作:
1. 从服务器下载项目组最新代码。
2. 进入自己的分支,进行工作,每隔一个小时向服务器自己 的分支提交一次代码(很多人都有这个习惯。因为有时 候自己对代码改来改去,最后又想还原到前一个小时的 版本,或者看看前一个小时自己修改了那些代码,就需 要这样做了)。
3. 下班时间快到了,把自己的分支合并到服务器主分支上, 一天的工作完成,并反映给服务器。
这就是经典的SVN工作流程,从流程上看,有不少缺点,但也有优点。
缺点:
1、 服务器压力太大,数据库容量暴增。
2、 如果不能连接到服务器上,基本上不可以工作,看上面 第二步,如果服务器不能连接上,就不能提交,还 原,对比等等。
3、不适合开源开发(开发人数非常非常多,但是
Google app engine就是用SVN的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
优点:
1、 管理方便,逻辑明确,符合一般人思维习惯。
2、 易于管理,集中式服务器更能保证安全性。
3、 代码一致性非常高。
4、 适合开发人数不多的项目开发。
lhgdialog 对话框组件技术
业务场景:
在以前的项目模块中经常用到对话框,客户反映说在进行操作时对话框提示太生硬,并且没有花样儿,对于这个问题我想到了现在网上流行的lhgdialog 对话框技术,因为lhgdialog 对话框是一功能强大的简单迷你并且高效的弹出窗口组件,调用简单,功能强大。它基于网络访问并且兼容IE等各种浏览器,客户使用起来更加新颖,一定程度上增强了客户的体验度。
Lucene技术
业务场景:
在之前做的电子商城项目中,搜索商品信息是至关重要的一个环节:用户可以在搜索栏里输入任意关键字来检索出他们需求的商品信息,从而方便购买商品。
由于电商项目并发访问量大,如果用户每次搜索都从数据库中获取数据,这不仅浪费资源而且效率低下,极易导致页面响应变慢,甚至出现浏览器假死的情况,针对这个问题,大可以考虑使用缓存技术来解决。但是,用户输入关键词搜索商品信息,这个关键词是模糊的,模棱两可的内容到了数据库中就需要进行模糊查询,然而模糊查询用到索引的条件是很苛刻的,这就导致每次查询都需要全表检索,这是相当浪费时间的。 那么,究竟该怎样解决搜索问题呢?此情此境,Lucene跃然眼前。作为一个实现全文检索的架构,Lucene提供了完整的查询引擎和索引引擎,可以方便地在系统中实现全文检索功能。 首先在服务启动后,从数据库中获取商品信息通过Lucene对其内容进行分词、创建索引,存放于硬盘中;当用户输入关键词进行搜索时,会直接读取索引文件、并将其与关键词进行匹配,然后返回相应的信息。对于需要即时更新的产品信息,当数据库中的对应字段修改的同时要更新硬盘中的索引;对于不需要即时更新的产品信息,则通过定时器进行定时更新索引。
Tomcat调优技术
技术点介绍及业务场景:
一、Tomcat设置最大连接(线程)数
在之前做的电子商城项目中,我们进行高并发量测试时,发现Tomcat总是当机,起初并不了解原因,后来使用jprofiler进行测试,发现是由于Tomcat最大线程数不够。在修改了Tomcat目录下server.xml文件中的相应配置信息后,该问题得到了解决。
二、 修改tomcat服务器的默认内存
在之前做的电子商城项目中,一个同事说他64位的Windows7系统,JVM的最大内存却不超过2G,这导致了Tomcat最大内存也不能超过2G。我过去帮忙,发现他虽然装了64位的jdk,但是配置的环境变量没有修改,JAVA_HOME还是指向以前的32位jdk,这导致进入DOS命令窗口用Java命令测试时使用的还是32位的jdk。
解决方法:
(1). 在DOS命令窗口测试时,要进入64位jdk的bin目 录下后再用java命令;
(2). 修改环境变量,使JAVA_HOME指向64位jdk,这 样直接在DOS命令窗口下使用java命令即可。
Velocity模板技术
技术点介绍及业务场景:
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。
当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。
基于 Java 的网站开发,很多人都采用 JSP 作为前端网页制作的技术,尤其在是国内。这种技术通常有一些问题,我试想一下我们是怎样开发网站的,通常有几种方法:
1:功能确定后,由美工设计网页的UI(界面)部分,然 后由程序员在其上加入代码显示逻辑(比如循环,判断显示数 据结果)。也就是通常的 jsp 页面制作,当然这部分可以由美 工完成模板,然后由 jsp 工程师再继续以它为原型创建相应 的 jsp 页面。
2:功能确定后,由美工设计网页的UI(界面)部分,然 后由网页制作人员在其上加入代码显示逻辑(比如循环,判断 显示数据结果),在这一步的 jsp 页面制作中,网页制作人员 (通常只懂得 javascript 和 html)在工程师的指导下学会如 何 嵌入 jsp taglib 标记,然后以美工的模板为原型制作 jsp 网 页。
显然后面一种方式要比前面一种方式分工明确,然后在很多小公司,或者项目很急的情况下,jsp 网页制作和后台程序开发都是同一个人。这样无疑加大了程序员的负担。 后一种情况虽然比前面的好,但是它有两个缺点: 一:网页制作人员必须学会如何使用 jsp taglib 的使用,这无疑加大了网页制作人员的负担。二:如果页面因为客户的要求从新设计,那么无论那种情况网页制作人员都要从新将显示逻辑从新嵌入 jsp 网页。
在这方面, jsp 做的并不好,虽然从性能角度和 taglib 的使用上来说,它比 php 和 asp 要强很多, 但是它在设计上很类似 php 这种服务器页面语言,也就是在页面中嵌入脚本语言的技术,虽然它比传统的基于 CGI 的脚本语言的开发模式速度快,但是它将后台程序逻辑与页面显示混淆了,所以从这个角度来说, 它是一种不太良好的设计。想想看,你看到的众多 php 程序是怎么样子的吧,在一堆 .php 文件中,你已经分不清楚那些是后台程序,那些只是用来显示页面的程序。
现在更多的网站制作采用一种 MVC 模式,也就是将网站制作工作分工,分别为M(Model, 模型),V(View 视图),C(Controller 控制器)。
M(Model, 模型)也就是后台的事务逻辑,真正处理事务的代码,商业逻辑等等。他们是整个网站最重要的工作部分,通常这部分代码相对来说比较稳定,不经常变动,就是有所变动也不会对前端的页面有什么影响。
V(View 视图): 也就是网页的显示部分,这个部分接受来自后台程序的结果或数据,进行显示,但是这个部分通常是变化比较大的部分,比如网站的界面更新是经常要要作的事情,每隔一段时间更新网页风格就会造成 View 视图部分的大量更改工作。
C(Controller 控制器). 在视图和模型之间传递控制,并根据要求调用相应的视图显示模型返回的数据,主要负责调度工作。
这种职责的分工到底有什么好处呢,它简化了软件开发过程中所有相关人员的工作, 使得不同的部分的修改通常不会影响的其他部分的工作,比如,我修改了后台某些程序的算法,并不影响前台的页面显示,前台页面修改不影响后台程序的开发。这种分工合作比起 jsp 混淆代码逻辑和显示层的做法要好的多。
所以越来越多的国外程序员在不断提出替代 jsp 的方案,在众多方案中, 一种基于 java 模板引擎的技术脱颖而出,最为著名的是 Velocity 和 Webmacro 两种模板技术。
模板引擎的设计思想最早是有 webmacro 提出的, 后来应用在一个著名的搜索引擎 www.altavista.com 上, 这种思想渐渐被 Apache 开发小组所采用,并作为一个子项目被提出来,这就是现在的 Velocity。模板引擎与MVC中视图这一部分的关系更为密切。它是经常作为一种 jsp 的替代技术出现在国外的一些论坛上的。但是 Velocity 可以应用在任何需要格式化数据显示的 java 程序中。
那么 Velocity 到底是什么呢?它的官方解释是: "Velocity 是一种基于 java 的模板引擎,它允许任何人使用简单而强大的模板语言来引用定义在 java 代码中的对象"。
你可能因为下面几种原因而使用 Velocity:
1:它很容易集成在各种各样的程序领域中;
2:它为网页制作人员提供了一种清晰而又简单的语法;
3:因为模板和代码是分离的,所以你可以分别独立的开发和 维护它们;
4:Velocity 引擎可以很容易的集成到一些 Java 运行环境, 特别是 Servlet;
5:Velocity 使得模板可以访问任何环境对象中的共有方法。
Velocity 的强大之处在于它严格的区分程序开发功能的职责划分。 它限制模板可能访问的对象(也就是后台程序允许它得到的对象)来实现这一点。这意味着,网页设计人员可以只把精力放在数据的显示部分(View 视图)而程序员则只要关注如何写好程序的控制层(Controller,控制器)和商业逻辑和数据管理(模型 Model), 这就是 MVC 开发模式。MVC 现在已经是广泛接受的一种开发模式,它简化了开发和日益复杂的应用和维护工作。
Velocity 最擅长做哪些方面的工作呢?
1: 基于 servlet 的网站制作;
2: Java 和 Sql 代码生成;
3: XML 处理和转换;
4: 文字处理,比如生成 TRF 文件。
不过 Velocity 用的最多的还是在基于 Java servlet 的网页程序中作生成网页的引擎,以替代 JSP 等技术。 除了比较容易使用外, 它提供了强大的模板语言以显示和操作数据,但是不是生成数据,这点很重要, 因为这个工作应该是程序逻辑的部分。 Velocity 非常适合在 J2EE (Java 2 Platform, Enterprise Edition) 的网站开发中充当替代 jsp 做输出页面的技术工作,虽然 JSP 包含在 j2ee 的规范中,其实 j2ee 本身并不需要 jsp .
Velocity 是如何工作的呢? 虽然大多 Velocity 的应用都是基于 Servlet 的网页制作。但是为了说明 Velocity 的使用,我决定采用更通用的 Java application 来说明它的工作原理。
Velocity 解决了如何在 Servlet 和 网页之间传递数据的问题,当然这种传输数据的机制是在 MVC 模式上进行的,也就是View 和 Modle , Controller 之间相互独立工作,一方的修改不影响其他方变动,他们之间是通过环境变量(Context)来实现的,当然双方网页制作一方和后台程序一方要相互约定好对所传递变量的命名约定,比如上个程序例子中的 site, name 变量,它们在网页上就是 $name ,$site 。 这样只要双方约定好了变量名字,那么双方就可以独立工作了。 无论页面如何变化,只要变量名不变,那么后台程序就无需改动,前台网页也可以任意由网页制作人员修改。这就是 Velocity 的工作原理。
你会发现简单变量名通常无法满足网页制作显示数据的需要,比如我们经常会循环显示一些数据集,或者是根据一些数据的值来决定如何显示下一步的数据, Velocity 同样提供了循环,判断的简单语法以满足网页制作的需要。Velocity 提供了一个简单的模板语言以供前端网页制作人员使用,这个模板语言足够简单(大部分懂得 javascript 的人就可以很快掌握,其实它比 javascript 要简单的多),当然这种简单是刻意的,因为它不需要它什么都能做, View 层其实不应该包含更多的逻辑,Velocity 的简单模板语法可以满足你所有对页面显示逻辑的需要,这通常已经足够了,这里不会发生象 jsp 那样因为一个无限循环语句而毁掉系统的情况,jsp 能做很多事情,Sun 在制定 Jsp 1.0 标准的时候,没有及时的限定程序员在 jsp 插入代码逻辑,使得早期的jsp 代码更象是 php 代码,它虽然强大,但是对显示层逻辑来说,并不必要,而且会使 MVC 三层的逻辑结构发生混淆。
jBPM工作流引擎
技术点介绍及业务场景:
就是它的业务逻辑定义没有采用目前的一些规范,如WfMC´s XPDL,BPML, ebXML, BPEL4WS等,而是采用了它自己定义的JBoss jBPM Process definition language (jPdl)。jPdl认为一个业务流程可以被看作是一个UML状态图。jPdl就是详细定义了这个状态图的每个部分,如起始、结束状态,以及状态之间的转换,通过图型化的流程定义,直观地描述业务流程。
jBPM的另一个特色是它使用Hibernate来管理它的数据库。Hibernate是目前Java领域非常流行的一种数据存储层解决方案,只要是 Hibernate 支持的数据库, jBPM 也就支持。通过Hibernate,jBPM将数据的管理职能分离出去,自己专注于业务逻辑的处理。
使用jBPM开发工作流的一般流程:
1). jBPM的运行需要数据库的支持,因此系统设计时要选定所用数据库。只要是Hibernate支持的数据库,jBPM就支持。数据库的初始化可以由jBPM自动完成,也可以通过ant generate.ddl任务生成SQL语句,在jBPM外部自己创建所需的表。
2). 使用jPdl定义工作流,生成processdinination.xml文件。可以采用GUI工具gpdl,但目前只支持jBPM1.0,而且bug很多。XML的DTD定义文件在jBPM下载包中。
3). Ant create.pde生成pde包的工作目录。
将processdinination.xml文件和其它需要的文件放在指定的目录下,使用ant build.precess.archives生成pde包。pde包的格式采用jar。
4). 更改pde工作目录/src/config/jBPM.properties的相关属性,主要是设定相关的数据库连接信息。注意要将数据库的JDBC驱动放在pde工作目录的lib目录下。
5). Ant deploy.process.archives将刚才生成的pde部署到数据库。实际上就是向数据库插入一些相关数据。
6). 利用jBPM API函数开发相应的工作流程。
jBPM举例:
表达了一个抽象的流程定义,之所以说是抽象,因为她没有表示确切的执行者,比如某借款人被具体化为张三,部门主管成为张三的部门经理李四,而财务明确为王五的时候,这个流程定义就被具体化,成为一个流程实例。此外过程中的相关人员我们称之为参与者Actor,过程需要参与者介入的环节称之为Task,每—个任务在流程实例中的具体化称之为任务实例,从一个任务结点到另一个任务结点转为叫做流转(Transition),在流程中,由程序预先设定的行为如发邮件,我们称之为活动Action。
权限管理
业务描述:
我们做的权限管理是属于Action(url)层的权限管理,也就是RABC角色权限控制。首先,我们在数据库里边建立五张表.即:用户表、权限表、角色表、用户角色关联表、角色权限关联表。首先,我们添加角色、再通过一对多的关系,给每个角色赋予不同的权限。然后建立用户表,同样通过一对多关系,给每一个用户赋予一个角色。这样几张表就联系了起来。在用户登录时,如果验证用户允许登录,则返回一个用户的角色id。然后,我们通过这个角色id再去查找用户的权限菜单列表。这样就可以实现不同的用户登录以后,看到不同的菜单。