亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

基于 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。容器通過

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲韩国日本中文字幕| 亚洲女人天堂色在线7777| 亚洲电影第1页| 亚洲精品网址在线观看| 欧美在线精品免播放器视频| 欧美美女15p| 久久精品国产96久久久香蕉| 国产极品jizzhd欧美| 91九色蝌蚪国产| 亚洲欧美在线一区二区| 精品性高朝久久久久久久| 欧美日韩免费在线| 色综合五月天导航| 超薄丝袜一区二区| 欧美久久精品午夜青青大伊人| 国产69精品久久久久9999| 欧美性高跟鞋xxxxhd| www.亚洲一二| 久久久噜久噜久久综合| 69**夜色精品国产69乱| 亚洲精品mp4| 日韩人体视频一二区| 97在线观看免费| 亚洲香蕉av在线一区二区三区| 亚洲欧美色婷婷| 不卡在线观看电视剧完整版| 国产精品免费久久久久影院| 欧美丝袜一区二区| 欧美成人精品在线视频| 成人免费自拍视频| 91久久精品在线| 欧美性感美女h网站在线观看免费| 久热爱精品视频线路一| 国产综合色香蕉精品| 精品久久久久久久久中文字幕| 青青精品视频播放| 午夜精品久久久久久久男人的天堂| 亚洲色图欧美制服丝袜另类第一页| 九九热r在线视频精品| 自拍视频国产精品| 欧美黑人性生活视频| 久久久久久网站| 中文字幕日本精品| 精品香蕉一区二区三区| 在线丨暗呦小u女国产精品| 日本亚洲欧洲色| 中文字幕亚洲欧美| 久久久久久久一区二区三区| 国产精品爽爽ⅴa在线观看| 国产精品一二三视频| 亚洲欧美国内爽妇网| 国产亚洲美女久久| 精品中文字幕在线观看| 欧美片一区二区三区| 色悠久久久久综合先锋影音下载| 久久精视频免费在线久久完整在线看| **欧美日韩vr在线| 久久精品91久久香蕉加勒比| 国产精品一区二区电影| 91久久国产综合久久91精品网站| 日韩美女中文字幕| 日韩精品免费视频| 欧美丰满片xxx777| 国产日韩欧美综合| 亚洲最新中文字幕| 国内精品久久久久影院 日本资源| 成人免费在线视频网址| 国产精品自拍偷拍| 欧美日韩亚洲天堂| 日韩美女视频免费看| 色777狠狠综合秋免鲁丝| 亚洲一区二区三区四区视频| 成人写真福利网| 国产三级精品网站| 福利精品视频在线| 91精品久久久久久久久| 久久影视电视剧免费网站清宫辞电视| 精品一区二区三区四区在线| 黑人巨大精品欧美一区二区一视频| 久久天天躁狠狠躁夜夜躁2014| 精品女同一区二区三区在线播放| 久久五月天综合| 庆余年2免费日韩剧观看大牛| 亚洲精品国精品久久99热一| 97精品欧美一区二区三区| 久久精品国产精品| 国产亚洲精品美女久久久| 亚洲人成网站免费播放| 久久亚洲精品小早川怜子66| 欧美日韩成人在线视频| 欧美日韩国产123| 国产脚交av在线一区二区| 97视频在线观看网址| 色黄久久久久久| 亚洲欧美在线一区二区| 亚洲一区二区三区四区视频| 久久99精品久久久久久青青91| 亚洲激情视频网| 精品亚洲aⅴ在线观看| 国产精品户外野外| 国产精品伦子伦免费视频| 国产成人综合久久| 亚洲综合一区二区不卡| 日韩av第一页| 91国内在线视频| 亚洲精品午夜精品| 亚洲人精品午夜在线观看| 国产精品一香蕉国产线看观看| 久久精品中文字幕一区| 久久精品99无色码中文字幕| 26uuu另类亚洲欧美日本一| 91精品久久久久久综合乱菊| 亚洲国产精品美女| 国模精品系列视频| www.久久撸.com| 久久精品国产亚洲一区二区| 亚洲第一天堂av| 久久资源免费视频| 九九久久久久久久久激情| 久久精品免费播放| 亚洲网站在线观看| 91网站免费看| 红桃av永久久久| 日韩电影免费观看中文字幕| 高潮白浆女日韩av免费看| 97不卡在线视频| 欧美最顶级的aⅴ艳星| 海角国产乱辈乱精品视频| 大量国产精品视频| 国产成人精彩在线视频九色| 麻豆成人在线看| 亚洲国产精品专区久久| 欧美一级淫片丝袜脚交| 欧美一级高清免费| 成人疯狂猛交xxx| 欧美性videos高清精品| 久久久久国产精品免费网站| 国产激情综合五月久久| 精品久久久久久中文字幕| 一本色道久久88综合亚洲精品ⅰ| 国产精品第七影院| 日韩欧美在线第一页| www日韩中文字幕在线看| 2019国产精品自在线拍国产不卡| 成人黄色影片在线| 亚洲成色999久久网站| 久久人人爽亚洲精品天堂| 亚洲高清久久久久久| 最近2019年好看中文字幕视频| 成人a级免费视频| 久久久国产精彩视频美女艺术照福利| 91成人天堂久久成人| 97在线精品视频| 草民午夜欧美限制a级福利片| 亚洲qvod图片区电影| 欧美亚洲成人精品| 一本色道久久综合狠狠躁篇的优点| 久久99青青精品免费观看| 日本午夜精品理论片a级appf发布| 欧美亚洲另类激情另类| 91国产美女视频| 最近2019年好看中文字幕视频| 亚洲精品电影网| 国产女精品视频网站免费|