目标:
利用当前流行框架DWR、Spring和Hibernate创建一个简单的WEB实例,力求简单却又能充分体现上述框架各自特性和重要技术。
业务简述:
1、注册新用户,新用户注册时需要输入用户名称和用户密码;
2、用户登录,登录时需要输入用户名称和用户密码;
3、登录用户可以修改EMail信息;
系统架构及框架应用简述:
DWR最显著的一个特性是能够将服务器端的Java对象以JS对象的形式暴露给浏览器,使得远程通讯变得非常简单方便。
例如:服务器端有个名为UserManager的公开服务对象,提供用户登录、用户注册、用户修改信息方法。
public interface UserManager {
public User login(User user,HttpSession session) throws SystemException;
public User regist(User user,HttpSession session) throws SystemException;
public User modify(User user,HttpSession session) throws SystemException;
}
在WEB-INF目录下,创建dwr.xml文件,部分内容如下:
<dwr>
<allow>
<create creator="new" javascript="userManager">
<param name="class" value="demo.service.UserManager" />
<include method="regist" />
<include method="login" />
<include method="modify" />
</create>
<convert match="demo.model.*" converter="bean"></convert>
</allow>
</dwr>
该配置指定DWR框架公开服务器端的demo.service.UserManager对象并自动生成文件名为userManager.js的JavaScript脚本,提供名为“regist”、“login”、“modify”几个方法的访问方法。
同时为demo.model包下的所有bean声明转换器,使得JavaScript对象和Java对象通讯时能够正确识别demo.model包下的所有bean。
修改web.xml文件配置好DWR框架,部分内容如下:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
该配置指定了DWR中的一个服务Servlet,开启debug模式,debug模式下URL在上下文后面加上 /dwr/ 就可以访问DWR自动生成debug页面。
浏览器端访问通过userManager.js脚本,访问服务器端的UserManager对象的方法的代码片断如下:
<td><a href="" onClick="showLogin();">登录</a></td>
function login() {
var user = checkNameAndPWD();
if(user != null) {
userManager.login(user,loginCB);
}
}
访问服务器提交数据告别了传统的表单提交方式,好处是非常明显的。
DWR配置好后,浏览器端可以获得DWR自动生成的engine.js和util.js,它们提供了很多系统设置和页面操作的方法。
DWREngine.setErrorHandler 可以为浏览器设定全局的错误处理句柄,为发生错误及服务器端抛出异常提供统一的处理入口,本实践充分滥用了该方法,系统错误和业务错误我都使用了该方法。
如果希望自己定义的XXXException能够被客户端脚本错误处理句柄处理,需要在dwr.xml中声明该异常的转换器,如下所示:
<convert match="demo.service.SystemException" converter="bean"></convert>
如果只定义了该异常转换器,可能会导致服务器端出现报告
严重: No converter found for 'java.lang.StackTraceElement' 的错误,
解决方法是继续增加异常的转换器,如下所示:
<convert match="java.lang.StackTraceElement" converter="bean"/>
或者
<convert match="java.lang.Exception" converter="exception">
<param name='include' value='message,lineNumber' />
</convert>
DWR 1.0中还提供了warningHandler,2.0中增加了textHtmlHandler。
AJAX应用中通常容易忽视安全问题,某些业务逻辑的方法应该是以认证的用户才能使用的,可以定义AOP的Advisor进行处理。
其它方法及DWR的其它特性,这里不再赘述。
Sping的特性很多,本实践大致利用了它以下几个特性:
1、Bean的注入;
2、DAO的包装;
3、事务管理;
4、AOP;
Hibernate这里就更不用说了,ORM的好玩意。
IDE:
Eclipse3.3 IDE 平台
WTP2.0 J2EE 插件
Hibernate tools Eclipse IDE plugin 3.2.0 beta 10
Spring IDE
框架:
DWR
Hibernate
Spring
参考资源:
DWR:http://getahead.org/dwr
Hibernate & Hibernate tools Eclipse IDE plugin 3.2.0 beta 10:www.hibernate.org
Spring IDE for Eclipse在线安装网址:http://springide.org/updatesite/
本案例lib目录下所需Jar比较大,就不上传了,清单如下:
mysql-connector-java-5.0.7-bin.jar
dwr.jar
spring.jar
spring-jdbc.jar
hibernate3.jar
spring-orm.jar
dom4j-1.6.1.jar
jta.jar
commons-collections.jar
cglib-2.1.3.jar
asm.jar
antlr-2.7.6.jar
aopalliance.jar
commons-logging.jar