我所理解的框架:为了让编码结构更加清晰,牛人总结出了MVC架构(可以理解为一种思想),又有一批牛人写了一些java代码,封装成jar包,可以理解为对MVC架构的具体实现,我们在编程时,通过引入这些jar包,再添加一些配置文件,就搭建起我们自己工程的框架,然后按照每一层的任务,编写相应层的代码即可。
1、框架介绍
公司所用框架为ssi框架,即:struts2,spring,ibatis。他们负责各层之间的交互与协作,从而实现整个web端的功能实现与整合。
struts:主要负责数据传递与控制,最形象的页面跳转就是由struts控制的。例如Action中return “success”跳转到哪个页面,return “list”跳转到哪个页面。这些是在struts中配置。
spring:主要负责依赖注入。初步理解:把特定的类根据条件注入到相应类中。公司主要把DaoHelper注入到Action类中。
ibitas:主要对工程要连接的数据库进行了一些参数配置,sql语句编写等。
2、5层类
公司写页面,主要用5层,action,busi,bo,po,dao。
bo:页面里的参数全部存储在bo类里,传到后台进行计算。
po:查询结果存储类,例如:从数据库里查询一条记录,则记录的相应字段存储在po类的成员变量里。
Action:action 里的每个方法,针对页面的一个功能,可以理解为action主要是与页面进行数据交互和spring的依赖注入也是注入到action。
busi:都说busi叫业务逻辑层,我理解主要是对action和dao传过来的数据进行加工和处理。
dao:与数据库进行交互,对数据库实现增删改查等操作。
3、具体框架配置
struts 配置:
<struts>
<!--每个package代表一个独立的模块,后面的namespace代表这个package模块,应用于工程中的什么位置,或者哪个文件夹下面,可以根据需要进行配置,name也可以根据需要填写,extends是继承的意思,extends=“default”表示继承了一批默认的拦截器,是struts预先封装好的-->
<package name="beaf-secdev_datamonitor" extends="default" namespace="/secdev/datamonitor">
<!--action就是针对package里namespace下面的某个Action类进行配置,class是制定针对哪个Action进行配置(根据具体路径进行填写),name是对这个class进行重命名-->
<action name="downDetail" class="DownDetailAction">
<!--下面两个interceptor-ref是配置了两个拦截器-->
<interceptor-ref name="fileUploadStack"/>
<interceptor-ref name="crudStack"/>
<!--result中的name表示针对上面的Action中的某个方法return的结果,如果和某个方法 return “success”,则跳转到DownDetail.jsp页面和数据传递(jsp的路径根据具体情况填写)。dispatcher 是一种默认的结果类型,也是最常用的结果类型-->
<result name="success" type="dispatcher">
<param name="location">DownDetail.jsp</param>
</result>
<result name="list" type="dispatcher">
<param name="location">DownDetail-list.jsp</param>
</result>
</action>
</package>
</struts>
ibitas配置:
ibitas配置包括数据库的参数信息(应该是一个XXX.properties文件),sqlmap-config.xml,sqlmap-XXXX.xml。
数据库参数信息(XXX.properties),在工程新建时就被配置,而且只需配置一次,所以初期工作可以直接忽略。
sqlmap-config.xml文件主要配置了我们所写的sql语句的位置。
示例:
<!-- 下发明细页面,resource为相应sql语句的位置(根据需求修改) -->
<sqlMap resource="sqlmap-DownDetail.xml"/>
sqlmap-XXX.xml中为我们所写的sql语句。
示例:
<!--namespace为改sqlmap的名字空间,编程时会用到namespace来查找具体sql-->
<sqlMap namespace="downDetail">
<!--id会在编程时和namespace结合使用,来确定所执行的sql,parameterClass为往sql语句中传的参数的类型, resultClass为sql执行后结果类型-->
<select id="downDetail" parameterClass="DownDetailBo" resultClass="DownDetailPo" >
<!--此处填写具体的select语句,如果sql需要根据参数进行判断,则会用到一些ibitas动态标签-->
</select>
</sqlMap>
spring配置:
把daoHelper类注入到Action中。
<bean id="downDetail" class="DownDetailAction">
<!--daoHelper是公司自己封装的一个类,我理解类似于SqlMapClient类,主要是用来对数据库进行操作的类。-->
<property name="daoHelper" ref="daoHelper" />
</bean>
在公司的工程中,web.xml文件中,配置了一些过滤器和监听器,也属于ssi框架的配置,如果只为工作,这里不多做讨论,以后可以细细学习。
4、页面加载流程
某个页面的链接应该为XXXX.action,点开这个链接后,程序会根据链接找到相应的action(程序首先进入的是action,而不是jsp),进入action后,程序会自动找到execute( )函数并开始执行,执行完后,根据最后的return跳转到相应页面,这里跳转是struts中配置的,例如,如果return “success”,根据上面的struts配置,会跳转到DownDetai.jsp页面,页面被加载出来后,再根据jsp中的js代码,执行jQuery()里面包含的函数。
所以,如果要想在页面被加载后默认执行某些方法,可以再Action函数中的execute( )方法中编写,或者在js的jQuery()中编写。
5、代码流程
上图描述了Action,busi,dao三个类中的成员变量关系,我们会在action类中实例化bo,dao,busi三个类,而busi中就不用实例化bo和dao,只需要声明即可,然后使用busi.setBo(bo),busi.setDao(dao) 使busi中声明的bo,dao分别指向action中的bo,dao对象,这样,在后续的busi中对bo的操作,在action中也会有变化,因为他们两个指向的是同一个对象实体。
dao中没有数据,也要进行传递,是因为daoHelper在spring的配置里是注入到action中的,所以要通过action将dao传递过去。(是不是可以在bean的配置中,直接将daoHelper配置在Dao类中,有待验证。)
6、部分代码
action:
public void init(){
if(bo==null){
bo=new DownDetailBo();
}
if(dao==null){
dao=new DownDetailDao();
}
if(busi==null){
busi = new DownDetailBusi();
}
dao.setDaoHelper(getDaoHelper());
busi.setBo(bo);
busi.setDao(dao);
}
public String execute() {
init(); //init()方法单独写出来,是因为在每个action的方法中,都要执行初始化操作。所以单独写出来。
return "success"; //根据struts配置,跳转到相应页面
}
busi:
public void getDownDetail(){
//在bo中设置了List<Po> result用来存储查询结果
bo.setResult(dao.getList(bo));
}
dao:
public List<Po> getList(bo){
//"downDetail.downDetail"找到制定的sql,bo为参数
//daoHelper为公司封装,但应该是继承了一些别的类,queryForList是可以再网上查到的,还有很多类似的方法如queryForMap,可以根据需要学习调用。
Lsit<Po> list=daoHelper.queryForList("downDetail.downDetail",bo);
return list;
}
bo的result中已经存储了操作结果,在函数return“list“后,我们在downDetail-list.jsp页面中可以直接使用。
声明:以上所有言论,皆为本人自己的认知理解,很多东西理解的不是很深刻,如果错误之处,希望批评指正,交流学习。