好几年之前的项目,最近闲着无聊又拿起来研究一下,先做一下项目介绍,项目采用传统的SSH框架,MySQL数据库,不同于Spring MVC,SpringMVC有一个modelAndView可以把页面url(view)和页面需要的数据(model)放到值栈中,struts使用ActionContext.getContext.put()方法把页面需要的数据(model)放在值栈中,通过struts.xml配置文件中的result找到对应的页面,如下:
下面分析一下以上步骤:
第一步,在浏览器中输入role_lsit,根据这个配置文件struts会找到这个xml节点。
第二步,找到了这几节点后会进入这个类com.yilaiwen.cn.action.RoleAction,并且定位到这个类的list方法。
第三步,第二步中类的方法会把调用ActionContext.getContext.put()方法把页面需要的数据以key-value的形式放入值栈,并且方法返回一个“list”的字符串,这个字符串就是第 三步中描述的“list”。
第四部:然后页面定位到此页面,在前端页面中使用表达式把需要展示的信息展示出来。
以上就是struts页面跳转的简单步骤。
下面进入正题。。。
下图是role_list uri对应的页面,然后我点击岗位名称为项目经理那一行的删除,我预想的是只是删除项目经理这个角色,但是结果却是全部删除了,我刷新页面又和我预想的一样。
想了好久加查询资料才知道当 Struts 接收到一个 请求后,会先建立 Action 类的对象实例,每一个请求都对应一个Action的实例。看以下分析:
role_list对应一个实例
role_deled对应一个实例,但是在delete的方法中我只是做了删除操作,并没有把role重新查一遍放入值栈中,所以页面为空,给人一种全部删除的假象。
当然你刷新时又执行了role_list重新查一遍放入值栈中所以页面显示正常。
解决方案:
1:删除后重定向到role_list。
2:使用全局缓存,role_list查到对象放入缓存中,role_delete把缓存中对应的对象删除后放入值栈中。