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")