From now on,开始我的菜鸟手记,记录一名菜鸟程序媛的成长过程。
 Today,公司昆哥给我的任务是看epp项目的数据流向,先起个blog头,晚上go on。
 Here we go !
 今天学习了SSH (struts+spring+hibernate )框架的基本业务流程,带教人曾在我刚进部门的时候就给了我一个miniweb的项目,让我研究,对于一个仅培训过几天Java的我来说,左看右看上看下看也看不出什么感觉,直到今天,在一位同事的针对我们正着手做的项目的一个小模块,带着我将流程又细细走了一遍之后才有了初步的体会。我把研究了一整天的流程贴出来。
 首先,整个流程总体来说是,在表示层中,通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给Web层的相应Action处理,接着,在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性,最后,在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。
 假设以在页面上显示一个下拉菜单为例子。
 1.表示层的jsp页面
    <td class="tdName">下拉菜单:</td>
      <td>
         <s:select  name="refundXiaLaId"   id="refundXiaLaId" cssClass="inputSelt"  list="xiaLaDtoList" headerKey="" headerValue="请选择" listKey="id" listValue="xiaLaName"  value="%{XiaLaId}" theme="simple"/>
      </td>
  客户端:http://localhost:8888/my-project/mypack/myFile/my-test-file!myfunc.action
   
   
  (2)WEB层(要依据浏览器URL中的类和方法寻找相应的类和方法)
  MyTestFileAction.java
  @Namespace("/pm/myFile")
          public String myfunc() throws Exception {
          initMyList();
          setDefaultNamedTemplate(MYFILE_MYFUNC);
          return SUCCESS;
  }
   
      private void initMyList() {
          myList = new ArrayList<KeyValue>();
          Map<String, String> myMap = XXX.MY_MAP2;
          Set<String> keyList = myMap.keySet();
          for (Iterator<String> it = keyList.iterator(); it.hasNext();) {
              String key = it.next();
              String value = myMap.get(key);
              myList.add(new KeyValue(key, value));
          }
          xiaLaDtoList = myRuleExtBiz.queryXiaLaInfo().getXiaLaDtoList();
  }
  或者
   
   public String queryXiaLasInfo() throws Exception {
          com.my.myproject.web.Page page1 = new com.my.myproject.web.Page ();
          page1.setPageSize(1000);
          page1.setCurrentPage(1);
          System.out.println("queryXiaLasInfo()");
          //保存结果返回
        
          List<XiaLaDto> xiaLasInfoList = myRuleExtBiz.queryXiaLaInfo().getXiaLaDtoList();
          setDefaultNamedTemplate(MYFILE_MYFUN);
          rootJson.put("xiaLasInfoList", xiaLasInfoList);
          return JSON;
  }
   
  (3)BIZ层(需要依据上一层的myRuleExtBiz.queryXiaLaInfo().getXiaLaDtoList())
   
  3.1 biz接口 (在MyRuleExtBiz.java中)
  /**
       * 查询所有信息
       */   
 public MyResult queryXiaLaInfo();
  3.2 biz实现 (在MyRuleExtBizImpl.java中)
  @ServiceAnnotation
      public MyResult queryXiaLaInfo() {
          MyResult myResult = new MyResult();
          List<XiaLaDto> dtoList = new ArrayList<XiaLaDto>();
          List<XiaLa> list = null;
          try {
              list = xiaLaService.queryAllXiaLa();
          } catch (Exception e) {
              logger.debug("查询所有-调用查询服务异常,错误信息:{}", e.getMessage());
              logger.error("查询所有-调用查询服务异常", e);
              myResult.fail("query all XiaLas had exception", "调用查询所有服务异常");
              return myResult;
          }
          if (CollectionUtils.isNotEmpty(list)) {
              for (XiaLa xiaLa : list) {
                  dtoList.add(changeXiaLaToXiaLaDto(xiaLa));
              }
          }
          myResult.setCompanyChangeDate(DateUtil.getDefinableDateStr(companyChangeDate));
          myResult.setXiaLaDtoList(dtoList);
          return myResult;
  }
   
 3.3 Service(根据上面的 xiaLaService.queryAllXiaLa() )
  
 3.3.1 声明(在MyRuleExtBizImpl.java中)
  public class MyRuleExtBizImpl implements MyRuleExtBiz {
  @Autowired
   private XiaLaService     xiaLaService;
  }
  3.3.2 实现( 在XiaLaService.java中)
  @Service("xiaLaService")
  public class XiaLaService {
   
      @Autowired
      XiaLaDao xiaLaDao;
      public List<XiaLa> findAllOnlineXiaLa() {
          return this.xiaLaDao.queryAllOnlineXiaLa();
  }
   
  (4)DAO(根据上一层的 xiaLaDao.queryAllOnlineXiaLa() )
  
 4.1接口 (在XiaLaDao.java中)
  public interface XiaLaDao extends GenericDao<XiaLa> {
      List<XiaLa> queryAllOnlineXiaLa();
  }
   
  4.2 实现 (在XiaLaDaoHibernate.java)
  @SuppressWarnings("unchecked")
      public List<XiaLa> queryAllOnlineXiaLa() {
          String hql = this.queryBuilder.getQueryString("hqlQueryAllXiaLa", null);
          return super.queryListByHql(hql);
  }
   
  5.去xml文件中看(ctrl+H)找hqlQueryAllXiaLa.xml
   <bean id="hqlQueryAllXiaLa" class="java.lang.String">  ,即 beans-pp-hql.xml文件
         <constructor-arg>
             <value><![CDATA[
           from XiaLa xiaLa where xiaLa.parentId=50 and xiaLa.my='1' order by xiaLa.sortId asc
          ]]></value>
         </constructor-arg>
      </bean>
  6.从4.2中的return super.queryListByHql(hql); 处操作完依次返回 
  
 注:找数据库的表名字可以再在DMO找,如myproject-my-dmo的XiaLa.java中开头有注解
  @Entity
  @Table(name = "T_CHANNEL")