Revision: 1354 http://stripes.svn.sourceforge.net/stripes/?rev=1354&view=rev Author: bengunter Date: 2010-11-17 03:50:55 +0000 (Wed, 17 Nov 2010)
Log Message: ----------- Fixed STS-771: Refactoring FormTag and WizardFieldsTag. I accepted the changes suggested by Iwao Ave. I only fixed a couple of code formatting things. Modified Paths: -------------- branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/FormTag.java branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/WizardFieldsTag.java Modified: branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/FormTag.java =================================================================== --- branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/FormTag.java 2010-11-13 17:05:18 UTC (rev 1353) +++ branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/FormTag.java 2010-11-17 03:50:55 UTC (rev 1354) @@ -247,24 +247,7 @@ } if (!isPartial()) { - // Write out a hidden field with the name of the page in it.... - // The div is necessary in order to be XHTML compliant, where a form can contain - // only block level elements (which seems stupid, but whatever). - out.write("<div style=\"display: none;\">"); - out.write("<input type=\"hidden\" name=\""); - out.write(StripesConstants.URL_KEY_SOURCE_PAGE); - out.write("\" value=\""); - HttpServletRequest request = (HttpServletRequest) getPageContext().getRequest(); - out.write(CryptoUtil.encrypt(request.getServletPath())); - out.write("\" />"); - - if (isWizard()) { - writeWizardFields(); - } - - writeFieldsPresentHiddenField(out); - out.write("</div>"); - + writeHiddenTags(out); writeCloseTag(getPageContext().getOut(), "form"); } @@ -302,6 +285,36 @@ } } + /** Write out hidden tags that are internally required by Stripes to process request. */ + protected void writeHiddenTags(JspWriter out) throws IOException, JspException { + /* + * The div is necessary in order to be XHTML compliant, where a form can contain only block + * level elements (which seems stupid, but whatever). + */ + out.write("<div style=\"display: none;\">"); + writeSourcePageHiddenField(out); + if (isWizard()) { + writeWizardFields(); + } + writeFieldsPresentHiddenField(out); + out.write("</div>"); + } + + /** Write out a hidden field with the name of the page in it. */ + protected void writeSourcePageHiddenField(JspWriter out) throws IOException { + out.write("<input type=\"hidden\" name=\""); + out.write(StripesConstants.URL_KEY_SOURCE_PAGE); + out.write("\" value=\""); + out.write(getSourcePageValue()); + out.write("\" />"); + } + + /** Get the encrypted value for the hidden _sourcePage field. */ + protected String getSourcePageValue() { + HttpServletRequest request = (HttpServletRequest) getPageContext().getRequest(); + return CryptoUtil.encrypt(request.getServletPath()); + } + /** * <p>In general writes out a hidden field notifying the server exactly what fields were * present on the page. Exact behaviour depends upon whether or not the current form @@ -320,6 +333,15 @@ * @throws IOException if the writer throws one */ protected void writeFieldsPresentHiddenField(JspWriter out) throws IOException { + out.write("<input type=\"hidden\" name=\""); + out.write(StripesConstants.URL_KEY_FIELDS_PRESENT); + out.write("\" value=\""); + out.write(getFieldsPresentValue()); + out.write("\" />"); + } + + /** Get the encrypted value of the __fp hidden field. */ + protected String getFieldsPresentValue() { // Figure out what set of names to include Set<String> namesToInclude = new HashSet<String>(); @@ -338,13 +360,7 @@ // Combine the names into a delimited String and encrypt it String hiddenFieldValue = HtmlUtil.combineValues(namesToInclude); - hiddenFieldValue = CryptoUtil.encrypt(hiddenFieldValue); - - out.write("<input type=\"hidden\" name=\""); - out.write(StripesConstants.URL_KEY_FIELDS_PRESENT); - out.write("\" value=\""); - out.write(hiddenFieldValue); - out.write("\" />"); + return CryptoUtil.encrypt(hiddenFieldValue); } /** Modified: branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/WizardFieldsTag.java =================================================================== --- branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/WizardFieldsTag.java 2010-11-13 17:05:18 UTC (rev 1353) +++ branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/WizardFieldsTag.java 2010-11-17 03:50:55 UTC (rev 1354) @@ -68,76 +68,18 @@ * @return EVAL_PAGE in all cases. */ @Override - @SuppressWarnings("unchecked") public int doEndTag() throws JspException { - // Figure out the list of parameters we should not include + // Get the current form. FormTag form = getParentTag(FormTag.class); - Set<String> excludes = new HashSet<String>(); - excludes.addAll( form.getRegisteredFields() ); - excludes.add( StripesConstants.URL_KEY_SOURCE_PAGE ); - excludes.add( StripesConstants.URL_KEY_FIELDS_PRESENT ); - excludes.add( StripesConstants.URL_KEY_EVENT_NAME ); - excludes.add( StripesConstants.URL_KEY_FLASH_SCOPE_ID ); - // Use the submitted action bean to eliminate any event related parameters - ServletRequest request = getPageContext().getRequest(); - ActionBean submittedActionBean = (ActionBean) request - .getAttribute(StripesConstants.REQ_ATTR_ACTION_BEAN); - - if (submittedActionBean != null) { - String eventName = submittedActionBean.getContext().getEventName(); - if (eventName != null) { - excludes.add(eventName); - excludes.add(eventName + ".x"); - excludes.add(eventName + ".y"); - } - } - - // Now get the action bean on this form + // Get the action bean on this form ActionBean actionBean = form.getActionBean(); // If current form only is not specified, go ahead, otherwise check that // the current form had an ActionBean attached - which indicates that the // last submit was to the same form/action as this form if (!isCurrentFormOnly() || actionBean != null) { - // Set up a hidden tag to do the writing for us - InputHiddenTag hidden = new InputHiddenTag(); - hidden.setPageContext( getPageContext() ); - hidden.setParent( getParent() ); - - // Combine actual parameter names with input names from the form, which might not be - // represented by a real request parameter - Set<String> paramNames = new HashSet<String>(); - paramNames.addAll(request.getParameterMap().keySet()); - String fieldsPresent = request.getParameter(URL_KEY_FIELDS_PRESENT); - if (fieldsPresent != null) { - paramNames.addAll(HtmlUtil.splitValues(CryptoUtil.decrypt(fieldsPresent))); - } - - // Loop through the request parameters and output the values - Class<? extends ActionBean> actionBeanType = form.getActionBeanClass(); - for (String name : paramNames) { - if (!excludes.contains(name) && !isEventName(actionBeanType, name)) { - hidden.setName(name); - try { - hidden.doStartTag(); - hidden.doAfterBody(); - hidden.doEndTag(); - } - catch (Throwable t) { - /** Catch whatever comes back out of the doCatch() method and deal with it */ - try { hidden.doCatch(t); } - catch (Throwable t2) { - if (t2 instanceof JspException) throw (JspException) t2; - if (t2 instanceof RuntimeException) throw (RuntimeException) t2; - else throw new StripesJspException(t2); - } - } - finally { - hidden.doFinally(); - } - } - } + writeWizardFields(form); } return EVAL_PAGE; @@ -158,6 +100,92 @@ } /** + * Write out a hidden field which contains parameters that should be sent along with the actual + * form fields. + */ + protected void writeWizardFields(FormTag form) throws JspException, StripesJspException { + // Set up a hidden tag to do the writing for us + InputHiddenTag hidden = new InputHiddenTag(); + hidden.setPageContext(getPageContext()); + hidden.setParent(getParent()); + + // Get the list of all parameters. + Set<String> paramNames = getParamNames(); + // Figure out the list of parameters we should not include + Set<String> excludes = getExcludes(form); + + // Loop through the request parameters and output the values + Class<? extends ActionBean> actionBeanType = form.getActionBeanClass(); + for (String name : paramNames) { + if (!excludes.contains(name) && !isEventName(actionBeanType, name)) { + hidden.setName(name); + try { + hidden.doStartTag(); + hidden.doAfterBody(); + hidden.doEndTag(); + } + catch (Throwable t) { + /** Catch whatever comes back out of the doCatch() method and deal with it */ + try { + hidden.doCatch(t); + } + catch (Throwable t2) { + if (t2 instanceof JspException) + throw (JspException) t2; + if (t2 instanceof RuntimeException) + throw (RuntimeException) t2; + else + throw new StripesJspException(t2); + } + } + finally { + hidden.doFinally(); + } + } + } + } + + /** Returns all the submitted parameters in the current or the former requests. */ + @SuppressWarnings("unchecked") + protected Set<String> getParamNames() { + // Combine actual parameter names with input names from the form, which might not be + // represented by a real request parameter + Set<String> paramNames = new HashSet<String>(); + ServletRequest request = getPageContext().getRequest(); + paramNames.addAll(request.getParameterMap().keySet()); + String fieldsPresent = request.getParameter(URL_KEY_FIELDS_PRESENT); + if (fieldsPresent != null) { + paramNames.addAll(HtmlUtil.splitValues(CryptoUtil.decrypt(fieldsPresent))); + } + return paramNames; + } + + /** Returns the list of parameters that should be excluded from the hidden tag. */ + protected Set<String> getExcludes(FormTag form) { + Set<String> excludes = new HashSet<String>(); + excludes.addAll(form.getRegisteredFields()); + excludes.add(StripesConstants.URL_KEY_SOURCE_PAGE); + excludes.add(StripesConstants.URL_KEY_FIELDS_PRESENT); + excludes.add(StripesConstants.URL_KEY_EVENT_NAME); + excludes.add(StripesConstants.URL_KEY_FLASH_SCOPE_ID); + + // Use the submitted action bean to eliminate any event related parameters + ServletRequest request = getPageContext().getRequest(); + ActionBean submittedActionBean = (ActionBean) request + .getAttribute(StripesConstants.REQ_ATTR_ACTION_BEAN); + + if (submittedActionBean != null) { + String eventName = submittedActionBean.getContext().getEventName(); + if (eventName != null) { + excludes.add(eventName); + excludes.add(eventName + ".x"); + excludes.add(eventName + ".y"); + } + } + return excludes; + } + + /** * Returns true if {...@code name} is the name of an event handled by {...@link ActionBean}s of type * {...@code beanType}. * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Beautiful is writing same markup. Internet Explorer 9 supports standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3. Spend less time writing and rewriting code and more time creating great experiences on the web. Be a part of the beta today http://p.sf.net/sfu/msIE9-sfdev2dev _______________________________________________ Stripes-development mailing list Stripes-development@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/stripes-development