国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

基于 J2EE 體系實現多層結構 Blog 平臺(2)

2019-11-18 12:28:12
字體:
來源:轉載
供稿:網友

  六、配置iBatis
  接下來,使用iBatis實現O/R Mapping。首先從http://www.ibatis.com下載iBatis 2.0,將所需的jar文件復制到web/WEB-INF/lib/目錄下。iBatis使用xml配置數據庫表到java對象的映射,先編寫一個sql-map-config.xml:
  
  <?xml version="1.0" encoding="utf-8" ?>
  <!DOCTYPE sqlMapConfig
   PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
   "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
  <sqlMapConfig>
   <settings cacheModelsEnabled="false" enhancementEnabled="true"
    lazyLoadingEnabled="true" maxRequests="32"
    maxsessions="10" maxTransactions="5"
    useStatementNamespaces="false"
   />
   <transactionManager type="JDBC">
    <dataSource type="JNDI">
     <property name="DataSource" value="jdbc/blog" />
    </dataSource>
   </transactionManager>
   <!-- 假如有其他xml配置文件,可以包含進來 -->
   <sqlMap resource="Account.xml" />
  </sqlMapConfig>
  
  將sql-map-config.xml放到web/WEB-INF/classes/目錄下,iBatis就能搜索到這個配置文件,然后編寫一個初始化類:
  
  public class SqlConfig {
    PRivate SqlConfig() {}
    private static final SqlMapClient sqlMap;
    static {
      try {
        java.io.Reader reader = Resources.getResourceAsReader ("sql-map-config.xml");
        sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
      } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException("Error initializing SqlConfig. Cause: " + e);
      }
    }
    public static SqlMapClient getSqlMapInstance () {
      return sqlMap;
    }
  }
  
  SqlMapClient封裝了訪問數據庫的大部分操作,可以直接使用SqlConfig.getSqlMapInstance()獲得這個唯一實例。
  
  七、使用DAO模1式
  為了分離邏輯層和數據庫持久層,定義一系列DAO接口:AccountDao,CategoryDao,ArticleDao……其實現類對應為SqlMapAccountDao,SqlMapCategoryDao,SqlMapArticleDao……這樣就使得邏輯層完全脫離了數據庫訪問代碼。假如將來需要使用其它的O/R Mapping方案,直接實現新的DAO接口替代現有的SqlMapXxxDao即可。以SqlMapAccountDao為例,實現一個login()方法是非常簡單的:
  
  public int login(String username, String passWord) throws AuthorizationException {
    try {
      Map map = new HashMap();
      map.put("username", username);
      map.put("password", password);
      Integer I = (Integer)sqlMap.queryForObject("login", map);
      if(I==null)
        throw new RuntimeException("Failed: Invalid username or password.");
      return I.intValue();
    }
    catch(SQLException sqle) {
      throw new RuntimeException("Sql Exception: " + sqle);
    }
  }
  
  在Account.xml配置文件中定義login查詢:
  
  <select id="login" parameterClass="java.util.Map" resultClass="int">
   select [accountId] from [Account] where
   [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的文件,我們需要創建這個文件:
  
  <?xml version="1.0" encoding="utf-8"?>
  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
   "http://www.springframework.org/dtd/spring-beans.dtd">
  <beans>
  </beans>
  
  用到的所有的Java Bean組件都要在這個文件中聲明和配置,以下是配置URL映射的Bean:
  
  <bean id="urlMapping"
   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
      <props>
        <prop key="/article.c">articleController</prop>
      </props>
    </property>
  </bean>
  
  凡是匹配/article.c的Request都會被名為articleController的Bean處理,同樣需要聲明這個articleController:
  
  <bean id="articleController" class="example.ViewArticleController">
  </bean>
  
  ViewArticleController處理請求,然后生成Model,并選擇一個View:
  
  public class ViewArticleController implements Controller {
    private Facade facade;
    public void setFacade(Facade facade) { this.facade = facade; }
  public ModelAndView handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception {
      // 獲得參數:
      int articleId = Integer.parseInt(request.getParameter("articleId"));
      // 使用facade處理請求:
      Article article = facade.getArticle(articleId);
      // 生成Model:
      Map map = new HashMap();
      map.put("article", article);
      // 返回Model和視圖名“SKIN/blueskysimple/article”:
      return new ModelAndView("skin/blueskysimple/article", map);
    }
  }
  
  最后,skin/bluesky/article視圖會將結果顯示給用戶。
  
  我們注重到,ViewArticleController并不自己查找或者創建Facade,而是由容器通過setFacade(Facade)方法設置的,這就是所謂的IoC(Inversion of Control)或者Dependency Injection。容器通過

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平顶山市| 四子王旗| 黔西| 富川| 合水县| 瑞昌市| 广河县| 米泉市| 福建省| 丹寨县| 民勤县| 娄烦县| 同江市| 隆尧县| 塘沽区| 深州市| 彭山县| 高阳县| 鲁甸县| 通州市| 潞城市| 威海市| 尉犁县| 七台河市| 保康县| 体育| 温州市| 松潘县| 金沙县| 施秉县| 夏邑县| 龙泉市| 柳河县| 永清县| 青神县| 米泉市| 米泉市| 都江堰市| 赤城县| 泰来县| 莲花县|