部门管理—页面跳转
部门管理是本项目中的一个独立开发模块,在制作时按照单表操作的思想进行,后期如果存在有关联关系进行二次开发,再追加关联关系。
1. 功能入口为部门维护连接
2. 创建出部门相关的后台模块包层次结构,并初始化表,类,接口,配置文件
Create table ‘tbl_dep’(
‘uuid’ bigint(20) NOTNULL auto_increment,
‘name’ varchar(30)NOT NULL COMMENT’部门名称’,
‘tele’ varchar(30) NOT NULL COMMENT’部门电话’,
PROMARY KEY(‘uuid’)
)ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
3. 设置连接地址为访问的depAction中的list方法,设置跳转部门列表页面
Main.jsp中修改跳转链接
<tr>
<td><aclass=”hei” target=” main” href=”dep_list.action”></a></td>
</tr>
DepAction类中定义访问方法
Publicclass DepAction extends BaseAction{
Public DepModel dm=newDepModel();
Public DepQueryModel dqm= newDepQueryModel();
//注入
private DepEbi depEbi;
public void setDepEbi(DepEbi depEbi){
this. depEbi= depEbi;
}
//跳转到部门列表页
public String list(){
return “list”;
}
}
Structs.xml 中设置跳转页面,并拷贝页面
<action name=”dep_*” class=”depAction” method=”{1}”>
<resultname=”list”>/WEB-INF/jsps/dep/list.jsp</result>
</action>
4. 重启服务器,刷新页面,测试功能
此类步骤,有后不再重复。
[开发技巧]
1. 制作实体模型类时,模型在不是必须使用某关联关系时,不要急于配置关系,否则会关联查询出很多不必要的数据,在使用OpenSessionInView后,关联数据将被延迟加载,并且要兼顾数据更新问题(在角色与资源中出现此问题),所以能不配置尽量不要配置。当然配置后也不会出错。
2.每次页面进行修改后,千万要区分链接入口是否修改,如果修改,一点要刷新页面,否则可能新的修改没有被应用,浪费大量调试时间。
部门管理—添加新部门
1. 功能入口为新建按钮
业务分析:进入部门添加页面是否需要进行后台数据获取,如需要获取必须转入Action
执行流程,否则可以使用页面跳转格式进行。此处跳转无需获取后台数据,选用页面跳转格式。
2. 设置页面跳转为转入添加部门页面
页面访问设置为pages_dep_input.action,也可以省略.action后缀。前提是web.xml中拦截所有请求。
<a href=”page_dep_input.action”>
<imgscr=”images/can_b_02.gif” boeder=”0”/>
</a>
Structs.xml中添加通用的页面跳转action配置
<actionname=”pages_*_*”>
<result>/WEB-INF/jsps/{1}/{2}.jsp</result>
</action>
此处不能配置成page_XXX的格式,否则将与前面的模块产生配置冲突
由于部门模块业务比较简单,添加时无需获取其他数据,因此可以使用上述形式完成。实际开发过程中,进入部门添加时,还需要加载其他数据。因此需要通过后台方法完成。建议通过input方法完成此操作,参看修改功能设计。通过是否存在uuid传值对添加功能与修改进行区分。
3. 重启服务器,刷新页面,测试功能。
4. 修改input页面为structs标签格式
<s:form action=”dep_save” method=”post”>
5. 为保存按钮添加form表单事件(jquery格式)为保存连接添加id=”commit”
<a href=”javascript:void(0)” id=” commit” >
<imgsrc=”image/order_tuo.gif” border=”0”/>
</a>
为id为commit的组件绑定jquery提交表单事件。
$(function(){
$(“#commit”).click(function(){
$(“form:first”).submit();
});
});
6. 后台完成save方法的三层调用及持久化
Action
//添加部门
public String save(){
depEbi.save(dm);
return list();
}
Ebo
public void save(DepModel dm){
depDao.save(dm);
}
Impl
public void save(DepModel dm){
this.getHibernateTemplate().save(dm);
}
7. 重启服务器,刷新页面,测试功能
由于目前已经绑定了Session登陆校验,当服务器重启后Session中无登陆用户数据,因此在进行任何操作,强制跳转登陆界面。
登陆后验证功能
由于目前list页面数据为静态数据,无法查看功能是否完成,暂时使用查看数据库的方式验证。
功能测试成功
[知识总结]
Structs通过属性驱动的方式从页面收集传递的参数,此种方法相对于模型驱动灵活性强,并且一个页面中收集的数据不可能全部收集到一个实体类对象中。推荐使用属性驱动方式设计。
属性驱动与模型驱动参考:http://www.cnblogs.com/jbelial/archive/2013/09/01/3294520.html
[开发技巧]
登陆校验可以保证登陆人信息必然存在,不推荐将其功能取消,否则后期因为未登陆造成的问题将不易被察觉,导致后期数据任务失败。
[扩展业务]
业务层数据校验
部门管理--部门信息列表
部门信息列表中的数据目前是静态数据,需要将其修改为动态数据。
1. 修改Action中数据获取并将后台业务进行实现。
Action
//跳转到部门列表
Public String list(){
List<DepModel>depList=depEbi.getAll();
//将数据放入指定范围
ActionContext.getContext.put(“depList”,depList);
return “list”;
}
Ebo
public List<DepModel> getAll(){
returndepDao.getAll();
}
Impl
Public List<DepModel> getAll(){
String hql=”fromDepModel”;
Returnthis.getHibernateTemplate().find(hql);
}
2. 修改页面格式为加载动态数据
<s:iterator value=”depList”>
<tr align=”center”bgcolor=”#FFFFFF”>
<td width=”13%”height=”30”>${uuid}</td>
<td>${name}</td>
<td>${tele}</td>
</tr>
</s:iterator>
说明:获取数据时,可以使用#depList的格式获取,也可以使用depList格式获取,两种格式均正确,为了输入方便,省略掉#。
3.刷新页面,重启服务器
功能完成,但是页面上显示多余信息。该数据是为了避免无数据可显示的时候,页面无提示造成的误解。以为程序出问题,为其添加判定,当无数据可显示时才显示出来。
<s:if test=”#depList.size()==0”>
<centr>
<spanstyle=”font-size:20px;color:#96D34A;font-weight:bold”>
没有查到满足条件数据
</span>
</center>
</s:if>
<s:else>
<tablewidth=”100%” border=”1” cellpadding=”0” cellspacing=”0”>
</table>
</s:else>
说明:此处test表达式中,不能省略#号,否则无法获取。
PS:项目中所有模块均参照以上流程制作,后面将不再重复此类笔记内容。
[知识总结]
1. 关于Action中在request与session范围内存取值。
2. Structs的if标签中test属性使用的OGNL表达式,参看OGNL规则。
[开发技巧]
页面获取后台存放的数据,可以使用的方式有很多,实际开发应该使用最简化风格,或者标准格式。此处使用最简化风格。