基于struts2的web系统中的返回功能
2013-12-09 17:09
501 查看
存储的BackForm
form操作的工具类
配置velocity中toolbox.xml的tool类
Struts2的拦截器
页面上使用时
列表页面的Action
列表vm页面中,跳转到操作页面的ActionUrl为:operate.action?id=XXX&formId=$!{formId} //此处formId为调用createForm中设置的formId
进入的操作Action对应操作页面中,返回为 ${form.backUrl} //form为配置的toolbox中tool的key,实际调用的时FormTool.getBackUrl()方法
public class BackForm implements Serializable { /**当前formId*/ private String formId; /**当前form如果返回之后formId*/ private String backId; private Map<String, Object> formParams; /**表单的Url*/ private String formAction; /** form返回的action*/ private String backAction; }
form操作的工具类
public class FormUtil { /**返回的表单Id*/ public final static String BACK_FORM_ID = "backId"; /**表单Id*/ public final static String FORM_ID = "formId"; /** 返回 */ public final static String BACK_CONTEXT = "backFormContext"; /**缓存*/ private static MemcachedOperate memcachedOperate = new MemcachedOperateImpl(); /**表单缓存key*/ private final static String FORM_KEY = "back_form_"; /**超时时间 2天*/ private final static int FORM_EXP_TIME = 2 * 24 * 60; /** * 创建baseAction的Form * * @param baseAction * @return */ public static BackForm createForm(BaseAction baseAction) { BackForm backForm = null; //如果是返回的情况,把上一次所在的form加载处理啊 if (StringUtils.isNotBlank(baseAction.getBackId())) { backForm = getBackForm(baseAction.getBackId()); if (backForm != null) { Map<String, Object> formParams = ActionContext.getContext().getParameters(); //当前返回可能带了一些参数,覆盖原来的 if (formParams != null) { for (String key : formParams.keySet()) { if (!FORM_ID.equals(key) && !BACK_FORM_ID.equals(key)) { backForm.getFormParams().put(key, formParams.get(key)); } } //替换原来的 setBackForm(backForm); } ServletActionContext.getContext().getContextMap().put(BACK_CONTEXT, backForm); return backForm; } } backForm = createForm(); baseAction.setFormId(backForm.getFormId()); return backForm; } /** * 创建struts2的form * * @return */ public static BackForm createForm() { HttpServletRequest request = ServletActionContext.getRequest(); String action = request.getServletPath(); BackForm backForm = new BackForm(); backForm.setFormAction(action); Map<String, Object> formParams = ActionContext.getContext().getParameters(); if (formParams == null) { formParams = new TreeMap<String, Object>(); } backForm.setFormParams(formParams); //此时提交之后 上一个Form的formId为返回之后的form Object back = formParams.get(FORM_ID); String backId = null; if (back != null && back.getClass().isArray() && ((Object[]) back).length > 0) { backId = String.valueOf(((Object[]) back)[0]); } else if (back != null && !back.getClass().isArray()) { backId = String.valueOf(back); } if (StringUtils.isNotBlank(backId)) { BackForm form = getBackForm(backId); if (form != null) { backForm.setBackId(form.getFormId()); backForm.setBackAction(form.getFormAction()); } } backForm.setFormId(UUID.randomUUID().toString().replace("-", "")); //储存 ServletActionContext.getContext().getContextMap().put(BACK_CONTEXT, backForm); setBackForm(backForm); return backForm; } /** * 得到form * * @param formId * @return */ public static BackForm getBackForm(String formId) { return (BackForm) memcachedOperate.gets(FORM_KEY + formId); } /** * 存到缓存 * * @param backForm */ public static void setBackForm(BackForm backForm) { memcachedOperate.setWithNoReply(FORM_KEY + backForm.getFormId(), FORM_EXP_TIME, backForm); } /** * 得到struts2的提交的Form * * @return */ public static BackForm getBackForm() { return (BackForm) ServletActionContext.getContext().getContextMap().get(BACK_CONTEXT); }
配置velocity中toolbox.xml的tool类
/** * 页面使用的velocity,封装一些页面上操作使用的方法 * 表单处理,这个范围域为request,没一次请求都会初始化一次 * * @author wy */ public class FormTool { /** 当前action的 表单*/ private BackForm backForm; private final Map<String, BackForm> backFormMap = new HashMap<String, BackForm>(); public FormTool() { } /** * 获取当前的表单Id * * @return */ public String getFormId() { BackForm backForm = this.getBackForm(); if (backForm != null) { return backForm.getFormId(); } return null; } /** * 获取返回的form * * @return */ public BackForm getBackForm() { if (backForm == null) { backForm = FormUtil.getBackForm(); } return backForm; } /** * 获取返回的form * * @param formId * @return */ public BackForm getBackForm(String formId) { BackForm form = backFormMap.get(formId); if (form != null) { return form; } form = FormUtil.getBackForm(formId); backFormMap.put(formId, form); return form; } /** * 获取跳转的url * * @return */ public String getBackUrl() { BackForm backForm = this.getBackForm(); return getBackUrl(backForm); } /** * 根据表单Id获取跳转的url路径 * * @param formId * @return */ public String getBackUrl(String formId) { BackForm backForm = this.getBackForm(formId); return getBackUrl(backForm); } /** * 获取调整的url * * @param backForm * @return */ public String getBackUrl(BackForm backForm) { if (backForm == null || StringUtils.isBlank(backForm.getBackId()) || StringUtils.isBlank(backForm.getBackAction())) { return null; } return backForm.getBackAction() + "?backId=" + backForm.getBackId(); } }
Struts2的拦截器
public class FormParametersInterceptor extends ParametersInterceptor { /** * 这里获取参数在com.opensymphony.xwork2.interceptor.ParametersInterceptor已经处理了,这里不再进行处理,如果formParam找不到,直接返回null * * @param ac * @return */ protected Map<String, Object> retrieveParameters(ActionContext ac) { Map<String, Object> map = ac.getParameters(); if (map == null) { return map; } //获取返回的ID,如果存在,表示返回 Object back = map.get(FormUtil.BACK_FORM_ID); if (back == null) { return null; } String backId = null; if (back.getClass().isArray() && ((Object[]) back).length > 0) { backId = String.valueOf(((Object[]) back)[0]); } else if (!back.getClass().isArray()) { backId = String.valueOf(back); } if (backId == null) { return null; } BackForm backForm = FormUtil.getBackForm(backId); if (backForm != null) { //处理掉新的参数 替换原来的 Map<String, Object> formParams = backForm.getFormParams(); Iterator<String> it = formParams.keySet().iterator(); while (it.hasNext()) { String key = it.next(); if (!FormUtil.FORM_ID.equals(key) && !FormUtil.BACK_FORM_ID.equals(key) && map.containsKey(key)) { it.remove(); } } return formParams; } return null; } }
页面上使用时
列表页面的Action
/**表单Id*/ protected String formId; /**返回*/ protected String backId; //列表Action public String xxx() { FormUtil.createForm(this); return SUCCESS; }
列表vm页面中,跳转到操作页面的ActionUrl为:operate.action?id=XXX&formId=$!{formId} //此处formId为调用createForm中设置的formId
进入的操作Action对应操作页面中,返回为 ${form.backUrl} //form为配置的toolbox中tool的key,实际调用的时FormTool.getBackUrl()方法
相关文章推荐
- Smobiler基于.NET框架开发移动应用内部系统—工作单功能(开发日志七)
- 基于Web的RSS阅读器,新增加“加入收藏夹”功能,欢迎试用。
- 基于nodejs开发的web工程开启代理转发功能
- Android调用系统短信功能,点击返回键返回短信列表而不返回app的问题!
- Struts2 遍历输出WEB-INF文件目录,并提供下载功能
- 基于Web的系统测试方法
- 基于红帽6.4(64位系统)web服务器的又一利器Nginx 推荐
- 基于系统级触发器的审计功能
- 自定义leftBarButtonItem时,解决无法恢复系统侧滑返回功能
- 开发中如何最简单有效的给项目添加系统右滑返回功能-----简单有效的UINavigationController分类
- Android拍照和相册+系统裁剪功能返回图片
- 让 Nginx 支持 WAF 防护功能web防火墙 - 沧海一粟 - Web系统架构与服务器运维,php开发
- 如何在Linux上配置基于Web的网络流量监控系统
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
- python基于selenium+PhantomJS实现用提交表单,并点击按钮功能,获取返回的页面源码和ur等信息l。
- 从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)
- 基于Web的系统测试分析与测试方法(一)
- 如何在Linux上搭建一个基于Web的轻型监控系统
- 基于Web的系统测试方法
- 基于Web的系统测试