现在的位置: 首页 > 综合 > 正文

============2005-08-19======================

2013年08月05日 ⁄ 综合 ⁄ 共 7174字 ⁄ 字号 评论关闭

============2005-08-19======================

架构中在dao这层,包括一系列的接口,以DAO结尾,并且都集成了一个基础BaseDAO接口。
还包括一个impl文件夹,里面各个文件都是以Hibernate结尾的,是上面所述各个接口的实现。其中有一个AbstractDAOHibernate,所有Hibernate文件都继承该类。
总之一句话,就是dao中主要是对数据库进行操作的,而且操作的表是同一个表。没有对多表进行的操作。
这里有一个需要注意的地方就是:在这种查询语句中,比如   
List list = getHibernateTemplate().findByNamedQuery("find.flightcriteria.user.desccityid.srccityid.startdate.airlinecode",new Object[] { user, destCity, srcCity, startDate, airCode });
引号中的字段是在其相应的.hbm.xml中定义的,例如这里的定义是:
<query name="find.flightcriteria.user.desccityid.srccityid.startdate.airlinecode"><![CDATA[
   select fc from FlightCriteria as fc where fc.user=? and fc.destCity=? and fc.srcCity=? and  fc.srcStartdate=? and fc.airlineCode=?
 ]]></query>
 
 
 
model模块主要是对应于数据库中各个表的字段值,以及相应的set和get方法。
有一个BasePO,其他的都继承这个BasePO,主要的作用是相当于upcast。当在dao中调用各个函数,返回值时,由于很多都是在BaseDAO中定义的函数,所以里面的返回值写的
都是BasePO,这样在具体使用时,再将其强制转换为所需要的类型。
具体到各个类的时候,里面还包括: public boolean equals(Object other),用来判断两个对象是否相等。
public int hashCode() ,得到hashcode
public String toString() ,将各个字段格式化,便于在debag中输出。“TODO 这个方法还不太清楚,需要进一步的分析。”

service模块,里面有一个AbstractManager,对所有的DAO都定义了一个实例,还有其set方法。里面有一个createCachekey方法,似乎是要完成建立一个缓存key,通过调用Constants里面的静态变量的值得到,
而且Constants似乎是要完成格式定义之类的事情。
public void setip2p(IP2Province ip2p)是要实现从ip到城市地址的转换 。

以FlightManager为例 ,
FlightManagerImpl继承了AbstractManager
里面首先是定义了一个变量private static final Log LOGGER = LogFactory.getLog(FlightManagerImpl.class);“TODO 应该是要用来写日志用的,具体的作用还要确定。”
然后定义了一个UserManager类型的对象
里面的各种方法基本上都是调用了FlightDAO里面的方法来实现的。各种具体的细节这里先不考虑

下面开始看看大概的调用流程是什么样子的
web.xml的作用还不是很明确,“TODO:这里就先不说了”
看看hibernate.cfg.xml的作用,首先是关于数据库连接方面做了一些配置
<session-factory>
  <!--property name="connection.datasource">java:comp/env/jdbc/wp</property-->
  <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/businessbible?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=GBK</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password"/>
  <property name="show_sql">true</property>
  <property name="jdbc.fetch_size">50</property>
  <property name="jdbc.batch_size">25</property>
  <!--property name="jdbc.use_scrollable_resultset">false</property-->
  <property name="transaction.factory_class">
             net.sf.hibernate.transaction.JDBCTransactionFactory
        </property>
  <property name="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</property>
然后是一些映射文件的位置,
<mapping resource="com/sincetimes/businessbible/model/City.hbm.xml"/>
  <mapping resource="com/sincetimes/businessbible/model/FlightCriteria.hbm.xml"/>
  <mapping resource="com/sincetimes/businessbible/model/Guestbook.hbm.xml"/>
  <mapping resource="com/sincetimes/businessbible/model/HotelCriteria.hbm.xml"/>
  <mapping resource="com/sincetimes/businessbible/model/LoyaltyPointHistory.hbm.xml"/>
  <mapping resource="com/sincetimes/businessbible/model/User.hbm.xml"/>
  <mapping resource="com/sincetimes/businessbible/model/UserCity.hbm.xml"/> 

dispatcher-servlet.xml的作用还不很清楚,不过有一个作用是制定页面的处理所要使用的Controler
例如,
   <property name="mappings">
            <props>
                <prop key="/fq.do">flightQueryController</prop>
                <prop key="/fh.do">flightHistoryController</prop>
                <prop key="/hh.do">hotelHistoryContriller</prop>
                <prop key="/hq.htm">hotelQueryController</prop>
                <prop key="/bbs.htm">displayBBSController</prop>
                <prop key="/gd.do">childBBSController</prop>
                <!--
                <prop key="/pt.htm">postBBSController</prop>
                -->
                <prop key="/index.do">viewController</prop>
                <prop key="/survey.do">surveyController</prop>
                <prop key="/*.do">viewController</prop>
                <prop key="/*.htm">viewController</prop>

            </props>
        </property>
例如/fq.do的处理Controler的ID是flightQueryController,而ID的定义是以下面的方式指定的
  <bean id="flightQueryController" class="com.sincetimes.businessbible.web.controller.FlightQueryFormController">
        <property name="formView">
            <value>flight</value>
        </property>
        <property name="successView">
            <value>fl</value>
        </property>
        <property name="validator">
            <ref local="flightValidator"/>
        </property>
        <property name="commandName">
            <value>flight</value>
        </property>
        <property name="commandClass">
            <value>unibrowser2.util.FlightBean</value>
        </property>
        <property name="bindOnNewForm">
            <value>true</value>
        </property>
        <property name="pageItemNumber">
            <value>100</value>
        </property>
        <property name="flightmanager">
            <ref bean="flightManager"/>
        </property>
    </bean>
    当页面初始化的时候会调用”formView“标签中指定的jsp文件,当执行命令,比如submit成功之后,会调用"successView"中的文件
   
   
在工程里面有一种.wml的文件,我还不清楚是做什么的,不过打开了一个index.wml,“TODO:看起来是这种样子
   <p>
   <!--<img src="pix/flight.png" alt="航班查询"/>-->
   <a href="/fq.do">航班查询</a>
   <br/>
   ……………………
   </p>
   好像应该只是在界面上的一些显示的处理而已
   
在FlightQueryFormController中的protected Object formBackingObject(HttpServletRequest request)throws Exception
方法中还用到了一个FlightBean,位置在D:/projects/businessbible/src/java/unibrowser2/util/FlightBean.java,里面定义了如下变量:
   public String                  startCityCode = "PEK";
    public String                  termCityCode = "SHA";
    public String                  date;
    public String                  period       = "0"; //全天
    public String                  airwaysCode  = "ALL";
    public int                     orderType    = 1; //The order of final query results.
   
这个类中又调用了一个TravelSkyAppMsgPackager,位置在D:/projects/businessbible/src/java/unibrowser2/communication/TravelSkyAppMsgPackager.java
它是针对“航信”相关通讯的协议处理器。包括:TicketQuery、TicketPrice,”具体的作用我还不清楚“
它继承了Packager类,这个类是针对通讯协议处理器的基础类。<br>包含对低层socket通讯的使用,以及通用的接口。利于使用者统一操作/处理。

这两个文件都在unibrowser2下,似乎这个文件夹里面的类是用来进行webservice类似的处理的。
在unibrowser2的Util下有一个ToolForKJava类,主要完成的是时间及字符串等的格式转化方面的东西。

unibrowser2的communication下的MsgHeader类主要完成对得到的信息头部的处理,近来的是一个字符串数组,处理过后的是被解析过的类的各个属性的的值
unibrowser2的communication下的MsgData类是包含一个消息的数据结构,是通讯协议格式里出去包头之后的部分! 不需要考虑单个消息包的最大长度限制
unibrowser2的communication下Constants类定义了公共的通用变量。各个消息类型的ID,各个协议包的长度
unibrowser2的ContantsCity定义了城市的名称和对应的编号代码

关于FormController的调用机理,"TODO:看了书以后再详细叙述。"
对于这个项目的话,是这样的,首先根据dispatcher-servlet.xml中的配置找到相应的Controller,然后在页面初始化时,会调用protected Object formBackingObject(HttpServletRequest request)throws Exception 方法。在这个方法里面可以做相应的读取数据库之类的操作,在这里把关于城市地址之类的查询单独拿出来作为一个函数 , bindCommand

FlightBean用来和界面进行交互时候的Bean
JSP界面主要完成参数显示工作啦
“TODO:  回去可以考虑一下关于ex扩展标签的问题,因为这样对jsp的要求比较高呀,回去看看先 ”

根据查询条件去远程调用
 avResult = flightmanager.queryFlight(user, flight, beginTime, endTime);
 其实现是在FlightManagerImpl的 public AvResult queryFlight(User user, FlightBean flight, String beginTime,String endTime) throws IllegalStateException, IllegalArgumentException方法中
 首先要将用户查询航班的信息保存起来
  storeFlightCriteria(flight, user, flight.period);
然后如果缓存中没有信息,则需要查询 
avResult = TicketAgentForCtrip.query(flight.startCityCode,flight.termCityCode, flight.date, flight.airwaysCode,beginTime, endTime);
businessbible/src/java/com/sincetimes/bs/server/ticket/TicketAgentForCtrip.java下的TicketAgentForCtrip类
businessbible/src/java/com/sincetimes/ctrip/AV.java类实现根据查询条件去协程网查询
businessbible/src/java/com/nf/newscenter/NewsSourceAdapter.java类
从URL得到需要的信息的方法是  private void getBytesFromUrl()

抱歉!评论已关闭.