Thanks Patrick, I'm interested to see how this will go, any light that Bob could shed would be useful.
dave On Wed, 2006-06-07 at 11:23 -0500, Patrick Lightbody wrote: > Dave, > I think you are thinking about this the same way we are. Bob Lee and I agreed > when we met up during JavaOne that there should be just one stack to handle > 90% of the needs of users. The actual logical differences in the stack (form > submit vs. "view") should be handled by conventions and/or configuration > (either XML or annotations). Your marker interface, Submittable, represents > that same line of thought. > > I'll ask Bob to comment on what his thoughts are around this. > > Patrick > > > Hello all, > > > > On this page: > > http://wiki.apache.org/struts/StrutsActionRelease200 > > > > There is, under the new features heading a reference > > to the > > validation/workflow issues brought up on this page: > > http://wiki.apache.org/struts/RoughSpots?action=show > > > > Under the main list, item number 16, and under > > Patrick's list, item > > number 4 and 5, there is discussion of the default > > workflow and its > > relation to the idea of view vs. update requests to > > the same action. > > > > I haven't seen any discussion of this on the dev > > list, and i'm wondering > > if anyone is actively working on this and what > > directions are being > > considered. In trying to work this out for myself, i > > came up with a > > simple solution for the main use case, and i would > > like to share it here > > and ask for comments. > > > > The main idea is that the Prepareable interceptor is > > used to setup the > > view, and another interceptor called > > SubmittableInterceptor is added to > > the end of the default interceptor stack and is used > > to determine if a > > form submission has occured. A marker interface > > called Submittable > > allows the user, via a boolean wasSubmitted method, > > to determine how the > > action will determine if a form submission has > > occured, whether it be > > the POST vs GET idea, the inclusion of a hidden flag > > field, or the > > presence of a submit or button parameter. It also has > > a "submit" method > > that can be used optionally to process the submission > > and return a > > result string. > > > > The SubmittableInterceptor will see if wasSubmitted > > returns true, and if > > so, run the submit method. If the submit method > > returns a result string, > > the interceptor returns that, otherwise the > > interceptor stack invocation > > continues. If the form was not submitted, the > > interceptor returns the > > INPUT result, displaying the form, which has been > > setup by Prepareable. > > > > My BaseAction extends ActionSupport and implements > > Submittable and > > allows for the inclusion of the > > SubmittableInterceptor into the default > > stack, with default behavior that does nothing. > > > > The Validate method of the action will also check > > wasSubmitted to > > determine if it should validate, this could be > > eliminated by either > > putting SubmittableInterceptor before the > > DefaultWorkflowInterceptor or > > by putting the SubmittableInterceptor logic in > > DefaultWorkflowInterceptor. > > > > The code: > > > > [code] > > public interface Submittable { > > > > boolean wasSubmitted(); > > String submit(); > > } > > [/code] > > > > SubmittableInterceptor intercept method: > > > > [code] > > public String intercept(ActionInvocation invocation) > > throws Exception { > > Object action = invocation.getAction(); > > if (action instanceof Submittable) { > > Submittable submittable = (Submittable) action; > > if (submittable.wasSubmitted()) { > > String submitResult = submittable.submit(); > > if (submitReturn != null && ! > > submitReturn.equals("")) { > > return submitResult; > > } > > else { > > return Action.INPUT; > > } > > return invocation.invoke(); > > > > > > public class BaseAction extends ActionSupport > > implements Submittable { > > > > public boolean wasSubmitted() { > > return true; > > } > > > > public String submit() { > > return null; > > } > > } > > > > public class TesterAction extends BaseAction > > implements Preparable, > > ServletRequestAware { > > > > private HttpServletRequest request; > > public void setServletRequest(HttpServletRequest r) > > { > > this.request = r; > > > > > > private String act = ""; > > private String name = ""; > > > > public String getAct() { > > return this.act; > > } > > public void setAct(String s) { > > this.act = s; > > } > > > > public String getName() { > > return this.name; > > } > > public void setName(String s) { > > this.name = s; > > } > > > > public void validate() { > > if (wasSubmitted()) { > > if (name.equals("")) { > > addFieldError("name", "required"); > > } > > } > > } > > > > public void prepare() { > > // setup view > > request.setAttribute("form_name", "Test Form"); > > } > > > > public boolean wasSubmitted() { > > if (act.equals("")) { > > return false; > > } > > else { > > return true; > > } > > } > > > > public String submit() { > > // allow execute to do business logic > > return null; > > } > > > > public String execute() throws Exception { > > // do business logic > > return SUCCESS; > > } > > } > > [/code] > > > > > > > > ------------------------------------------------------ > > --------------- > > To unsubscribe, e-mail: > > [EMAIL PROTECTED] > > For additional commands, e-mail: > > [EMAIL PROTECTED] > --------------------------------------------------------------------- > Posted via Jive Forums > http://forums.opensymphony.com/thread.jspa?threadID=33417&messageID=65333#65333 > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]