You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Johan Compagner (JIRA)" <ji...@apache.org> on 2008/04/10 15:52:06 UTC

[jira] Assigned: (WICKET-1450) Ajax Re-render does not work after AbstractRestartResponseException()

     [ https://issues.apache.org/jira/browse/WICKET-1450?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Johan Compagner reassigned WICKET-1450:
---------------------------------------

    Assignee: Ate Douma  (was: Johan Compagner)

> Ajax Re-render does not work after AbstractRestartResponseException()
> ---------------------------------------------------------------------
>
>                 Key: WICKET-1450
>                 URL: https://issues.apache.org/jira/browse/WICKET-1450
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.2
>         Environment: Windows XP Java 1.6.0_05-b13
>            Reporter: Matthew Young
>            Assignee: Ate Douma
>             Fix For: 1.3.4
>
>
> To handle possible exception in Model#getObject(): I do
> 1) make note of exception has occurred (and subsequently only return some error value and not cause exception thrown again),
> 2) register an error feedback message,
> 3) calll page.detach()  (for clean up and reset?, I'm not sure but I know this makes FeedbackPanelErrorMessage reload message from session) and
> 4) throw new AbstractRestartResponseException() to re-render response with the new error message from the model shown.
> I'm finding that this works perfectly in non-Ajax.  But in Ajax, there are 2 problems:
> 1) the error message register in step 2) above is not rendered in the FeedbackPanel
> 2) the Ajax response is incomplete, it's missing the label component in my test case and missing the </ajax-response> closing tag.
> Test case below:  if you enter "blowup" in the text field, the label's model will do the steps outline above.  Run this in non-Ajax and you will see two error messages as expected.  Run in Ajax, you will see the problem (open Wicket Ajax Debug panel to see).
> = = = =     HomePage.html:
> <html>
> <head></head>
>     <span wicket:id="message">message will be here</span>
>     <form wicket:id="form">
>         <input type="text" wicket:id="word"/>
>         <input type="submit" value="Enter" wicket:id="submitButton"/>
>     </form>
>     <span wicket:id="feedback">FEEDBACK</span>
> </html>
> = = = = =  HomePage.java:
> public class HomePage extends WebPage {
> 	private static final long serialVersionUID = 1L;
> 	private String word;
> 	
>     public HomePage(final PageParameters parameters) {
>         add(new FeedbackPanel("feedback") {
>         	private static final long serialVersionUID = 1L;
>         	@Override protected void onBeforeRender() {
>         		System.out.println("= = = = FeedbackPanel onBeforeRender()");
>        			System.out.println("         FeedbackbackMessageModel = " + getFeedbackMessagesModel().getObject());
>         		super.onBeforeRender();
>         	}
>         }.setOutputMarkupPlaceholderTag(true));
>         // if the word "blowup" is entered,
>         //this register a error message and throw 
>         IModel model = new Model() {
>         	private static final long serialVersionUID = 1L;
> 			@Override public Object getObject() {
> 				if (word != null && word.equals("blowup")) {
> 					word = "-w-e-b-l-e-w-u-p-";
> 					HomePage.this.fatal("[2/2]This message is from Model.");
> 					getPage().detach();
> 					System.out.println("! ! ! ! ! throwing  new AbstractRestartResponseException()");
> 					throw new AbstractRestartResponseException() {
> 						private static final long serialVersionUID = 1L;
> 					};
> 				} else {
> 					return "The word is: \"" + (word == null ? " n u l l " : word) + "\"";
> 				}
> 			}
>         };
>         add(new Label("message", model) {
>         	private static final long serialVersionUID = 1L;
>         	@Override protected void onBeforeRender() {
>         		System.out.println("= = = = Label onBeforeRender(), model = " + getModel().getObject());
>         		super.onBeforeRender();
>         	}
>         }.setOutputMarkupId(true));
>         Form form = new Form("form", new CompoundPropertyModel(this));
>         add(form);
>         form.add(new TextField("word").setRequired(true));
>     	AjaxFallbackButton submitButton = new AjaxFallbackButton("submitButton", form) {
>     		private static final long serialVersionUID = 1L;
>         	@Override protected void onSubmit(AjaxRequestTarget target, Form f) {
>         		if (word != null && word.equals("blowup")) {
>         			HomePage.this.error("[1/2]This message is from onSubmit. There should also be a message from model");
>         		}
>             	if (target != null) {
>             		target.addComponent(HomePage.this.get("feedback"));		// clear error feedback if any
>             		target.addComponent(HomePage.this.get("message"));
>             	}
>         	}
>         	
>         	@Override protected void onError(AjaxRequestTarget target, Form f) {
>         		target.addComponent(HomePage.this.get("feedback"));		// show updated error feedback
>         	}
>         };
>         form.add(submitButton);
>     }
> }
> = = = = =  WicketApplication.java:
> public class WicketApplication extends WebApplication
> {    
> 	public WicketApplication() {
> 	}
> 	
> 	public Class<? extends WebPage> getHomePage() {
> 		return HomePage.class;
> 	}
> 	
> 	
> 	@Override public RequestCycle newRequestCycle(Request request, Response response) {
> 		return new WebRequestCycle(this, (WebRequest) request, (WebResponse) response) {
> 			@Override public Page onRuntimeException(Page page, RuntimeException e) {
> 				// page can be null
> 				if (page == null) {
> 					return super.onRuntimeException(page, e);
> 				}
> 				return page;
> 			}
> 		};
> 	}
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.