1.0          其他語言
 
 

3.2 控制器 Controller

 
 

org.velocityweb.controller.Controller 是一個純 Java 類。使用 VelocityWeb 的應用程式應該寫一個 Controller 類的子類。在 VelocityWeb 中有另一個類是 org.velocityweb.controller.Controller 的子類,類名叫 org.velocityweb.controller.impl.SimpleController。新的應用程式應該寫一個新類,比如,PetStoreController,讓它成為 SimpleController 或者 Controller 的子類。一般地,新的控制器應該覆蓋以下函數︰

protected Object getDataSource()
public boolean initApplication()
public Object getSessionUser(HttpServletRequest request)
public void setSessionUser(HttpServletRequest request, Object user)
public boolean hasAccessRight(LeafDispatcher leafDispatcher, HttpServletRequest request)
public boolean needLogin(LeafDispatcher leafDispatcher, HttpServletRequest request)
public Template getTemplate(String fileName, String templateHtmlCharsetName)
public void destroyApplication()

在 VPetstore 中有一個現成的例子,PetStoreController 使用 JNDI 來尋找資料源,這也是 Web 應用程式正常執行的工作方式︰

 
    public class PetStoreController extends SimpleController {
        protected Object getDataSource() {
                //some J2EE container need jndi name begin with "java:comp", others not
                Object dataSource = getDataSource("java:comp/env/jdbc/vpetstore");
                if (dataSource == null) {
                        dataSource = getDataSource("jdbc/vpetstore");
                }
                log.debug(dataSource);
                log.debug(dataSource.getClass());
                return dataSource;
        }

        ...

         public Object getSessionUser(HttpServletRequest request) {
                  HttpSession session = request.getSession(false);
                  if (session == null) {
                           return null;
                  }
                  Object user = session.getAttribute(USER_KEY_IN_SESSION);
                  return user;
         }

        public void setSessionUser(HttpServletRequest request, Object user) {
                  HttpSession session = request.getSession(true);
                  session.setAttribute(USER_KEY_IN_SESSION, user);
         }

        public boolean hasAccessRight(LeafDispatcher leafDispatcher, HttpServletRequest request) {
                  // default all user can access all pages
                  return true;
         }
        
        ...

}
 
   

 

對于單元測試,我們需要寫一個新的控制器,覆蓋函數 getDataSource()。比如,我們可以使用 Apache DBCP 來提供資料源︰

 

 
    public class TestPetStoreController extends PetStoreController {
        private Log log = LogFactory.getLog(this.getClass());

        protected Object getDataSource() {
                log.debug("getDataSourceByDBCP");
                BasicDataSource dataSource = new BasicDataSource();
                dataSource.setUrl("jdbc:postgresql:jpetstore");
                dataSource.setDriverClassName("org.postgresql.Driver");
                dataSource.setUsername("postgres");
                dataSource.setPassword("postgres");
                return dataSource;
        }
}
 
   

 

函數 getDataSource() 是 protected,是為了防止 DAO 類之外的代碼呼叫它。我們將這個 Datasource 物件放入到 AppContext 物件中,然後會從 web 層的分發器 dispatcher 傳到 DAO 層中。