记录下自己在理解新项目时的思路,以便日后修改和整理:
项目使用G4Studio+Struts+Spring+iBatis+Extjs+Oracle等技术。
理解代码顺序:由JSP-->JS-->action-->service--->dto--->sqlmap--->oracle。
以其中一个功能:移动LTE手机助手举例。
第一步:通过IE浏览器访问应用。右击查看页面属性。获取http请求的URL地址,如:http://localhost:8080/buss/ltehelper.ered?reqCode=ltehelperInit&menuid4Log=012201。
这是点击LTE助手菜单后,页面请求URL地址。
第二步:根据URL地址,与Struts的配置文件匹配,由于Struts的配置文件分了多个配置文件。该功能使用的是struts-config-buss.xml。因此在该配置文件中找到<action>标签中path属性为ltehelper的配置:
<action name="commonActionForm" path="/ltehelper" scope="request" validate="false" parameter="reqCode" type="zj.chinamobile.brace.buss.phoneborrow.web
.LtehelperAction">
<forward name="ltehelperView" path="/phoneborrow/ltehelper.jsp" />
</action>
找到配置后找到该功能的Action文件,也就是action标签中type属性的值zj.chinamobile.brace.buss.phoneborrow.web.LtehelperAction。
第三步:将请求交给action处理,该action继承BaseAction,BaseAction继承DispatherAction.相应的action获得相应的service实现。
private LtehelperService ltehelperService = (LtehelperService) getService("ltehelperService");service需要在Spring的配置文件app.service.xml注册。Spring配置文件中注册的bean标签的id就是相应的service,实现则是class属性的值zj.chinamobile.brace.buss.phoneborrow.service.imp.LtehelperServiceImpl。LtehelperService继承G4Studion的BizService,将操作进行dto封装,
如LtehelperService插入 public Dto save(Dto pDto);
实现类LtehelperServiceImpl实现save方法,参数是sqlmap配置中的命名空间.操作的id。第二个参数为service的dto。
public Dto save(Dto pDto) {
appDao.insert("Ltehelper.insertLtehelper",pDto);
return null;
}。实现调用service的dto
<!-- 移动lte助手 -->
<bean id="ltehelperService" parent="baseTransactionProxyApp">
<property name="target">
<bean class="zj.chinamobile.brace.buss.phoneborrow.service.imp.LtehelperServiceImpl">
<property name="appDao" ref="appDao" />
</bean>
</property>
</bean>
在执行action的时候还会转发,相应的action执行URL中reqCode请求的方法ltehelperInit方法。在.LtehelperAction中找到该方法。该方法的实现通过session获取用户ID,帐号和部门,如果有则返回,没有则创建一个。使用request的setAttribute的方法,将用户信息放到request中。使用return mapping.findForward("ltehelperView");转到到struts-config-buss.xml中<forward>标签中name=ltehelperView对应的path的/phoneborrow/ltehelper.jsp页面。
/**
* 初始化页面
*/
public ActionForward ltehelperInit(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String userid = super.getSessionContainer(request).getUserInfo().getUserid();
String account = super.getSessionContainer(request).getUserInfo().getAccount();
String deptid = super.getSessionContainer(request).getUserInfo().getDeptid();
request.setAttribute("userid", userid);
request.setAttribute("account", account);
request.setAttribute("deptid", deptid);
return mapping.findForward("ltehelperView");
}
第四步:找到phoneborrow路径下的ltehelper.jsp,在该JSP中引入对应的js文件。
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ include file="/common/include/taglib.jsp"%>
<eRedG4:html title="移动LTE助手" uxEnabled="true">
<eRedG4:import src="/buss/phoneborrow/js/ltehelper.js" />
<eRedG4:ext.myux uxType="datatimefield"/>
<eRedG4:ext.myux uxType="monthpicker"/>
<eRedG4:body>
<eRedG4:script>
var userid = '<eRedG4:out key="userid" scope="request"/>';
var account = '<eRedG4:out key="account" scope="request"/>';
var deptid = '<eRedG4:out key="deptid" scope="request"/>';
</eRedG4:script>
</eRedG4:body>
</eRedG4:html>
该JS为<eRedG4:import src="/buss/phoneborrow/js/ltehelper.js" />
第五步:执行/buss/phoneborrow/js/ltehelper.js。该JS使用EXTJS3.1。
js中的数据通过url : 'sale.ered?reqCode=queryCountyList'再次去struts-config-buss.xml中查找,找到action标签的path值为sale的配置。
var qu_city = new Ext.data.Store({
// 获取数据的方式
proxy : new Ext.data.HttpProxy({
url : 'sale.ered?reqCode=queryCountyList'
}),
reader : new Ext.data.JsonReader({}, [{ name : 'value' } ,{ name : 'text' } ]
)
});
qu_city.load();
<action name="commonActionForm" path="/sale" scope="request" validate="false" parameter="reqCode" type="zj.chinamobile.brace.buss.phoneborrow.web.AppSaleAction">
<forward name="manageNormalSaleView" path="/phoneborrow/sale.jsp" />
</action>
该请求执行的是zj.chinamobile.brace.buss.phoneborrow.web.AppSaleAction。方法是reqCode=queryCountyList的方法,也就是AppSaleAction中的queryCountyList方法。返回的值在load();的时候返回ActionFoward。在当页返回值。该方法使用CommonActionForm的getParamDto(request)方法,获取dto。也就把request中的信息赋给了dto.dto是iBatis进行的封装。调用appReader的queryForList方法,参数是sqlMap中的命名空间AppSale对应的操作的Id。这样就进行和数据库的交互。返回一个list,再将返回的list的值转化成json数据。通过super.write(jsonString,response)给相应。将数据返回给页面。
public ActionForward queryCountyList(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
CommonActionForm aForm = (CommonActionForm) form;
Dto dto = aForm.getParamAsDto(request);
List list = appReader.queryForList("AppSale.queryCountyList", dto);
String jsonString = JsonHelper.encodeObject2Json(list);
super.write(jsonString, response);
return mapping.findForward(null);
}
注:JS中,不同的操作对应不同的sqlmap的配置。执行不同的事物处理。