[username] = #username# and password = #password# </select>
逻辑层设计 (目录) 由于DAO模式已经实现了所有的数据库操作,业务逻辑主要是检查输入,调用DAO接口,因此业务逻辑就是一个简单的Facade接口:
public class FacadeImpl implements Facade { private AccountDao accountDao; private ArticleDao articleDao; private CategoryDao categoryDao; private FeedbackDao feedbackDao; private ImageDao imageDao; private LinkDao linkDao; private SequenceDao sequenceDao; }
对于普通的getArticle()等方法,Facade仅仅简单地调用对应的DAO接口:
public Article getArticle(int articleId) throws QueryException { return articleDao.getArticle(articleId); }
对于需要身份验证的操作,如deleteArticle()方法,Facade需要首先验证用户身份:
public void deleteArticle(Identity id, int articleId) throws DeleteException { Article article = getArticleInfo(articleId); if(article.getAccountId()!=id.getAccountId()) throw new AuthorizationException("Permission denied."); articleDao.deleteArticle(articleId); }
要分离用户验证逻辑,可以使用Proxy模式,或者使用Spring的AOP,利用MethodInterceptor实现,不过,由于逻辑很简单,完全可以直接写在一块,不必使用过于复杂的设计。 至此,我们的Blog已经实现了所有的后台业务逻辑,并且提供统一的Facade接口。前台Web层仅仅依赖这个Facade接口,这样,Web层和后台耦合非常松散,即使替换整个Web层也非常容易。
Web层设计 (目录) 使用MVC模式 (目录) 对于复杂的Web层,使用MVC模式是必不可少的。虽然Spring能轻易集成Struts,WebWorks等Web框架,但Spring本身就提供了一个非常好的Web框架,能完全实现MVC模式。 Spring使用一个DispatcherServlet,所有的特定请求都被转发到DispatcherServlet,然后由相应的Controller处理,Controller返回一个ModelAndView对象(因为Java语言的方法调用只能返回一个结果,而且不支持ref参数,所以将Model和View对象合在一起返回),Model是一个Java对象,通常是Map,View是视图的逻辑名字,通常是JSP文件名,但也可以使用Velocity等作为视图。返回的View通过viewResolver得到真正的文件名。 首先配置Spring的MVC,在web.xml中声明DispatcherServlet,处理所有以.c结尾的请求:
<web-app> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.c</url-pattern> </servlet-mapping> </web-app>
Spring会在WEB-INF下查找一个名为dispatcher-servlet.xml的文件,我们需要创建这个文件:
上一篇:minij2ee常见问题(FAQ)
下一篇:RMS高效编程指南
|