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

  存储的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()方法

你可能感兴趣的:(web系统返回)