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