您的位置:首页 > 编程语言 > Java开发

基于struts2的web系统中的返回功能

2013-12-09 17:09 501 查看
存储的BackForm

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()方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐