From: Ian B. <ia...@co...> - 2001-07-10 23:02:35
|
"Tim Roberts" <ti...@pr...> wrote: > I'm pretty clear on how to implement the first two stages with > WebKit. I'm not so clear on common practice for the third. In the > past, I've just generated a simple HTTP redirect using the Refresh: > header. This has the downside of causing another round-trip to the > browser, but it does keep the browser's concept of the current URL > in sync with the page contents. It is also possible to have the > "page 1 validator" directly call the "page 2 displayer", but that > leads to confusion, for example, if the users presses refresh. The > browser still thinks it is handling page 1. One positive part of a redirect is that once the person has submitted the form successfully, they won't/can't reload the page and resubmit the form. Only by doing a redirect can you really do this. In many cases I find it's nice to redirect someone where I think they will want to go next, then put a confirmation message at the top of the page saying their action has succeded. For instance in a webmail app, when the person deletes a message you can take them back to the index (where they probably want to go) and give them a confirmation message ("Your messaage was deleted") at the top of that page. Ditto sending. I would use the session to store these messages until they are displayed. Otherwise, you can just put all the logic in one servlet, since that is often appropriate anyway -- asking what to do and doing it go together after all. You might do something like: def writeBody(self): if self.request().hasField('action'): self.checkForm() self.writeForm() def checkForm(self): correct = 1 errors = {} if not name: correct = 0 errors['name'] = "Please enter your name" # ... if correct: self.doForm() else: self.writeForm(errors) def writeForm(self, errors = {}): # actually write the form, using errors where appropriate. # Include a <input type="hidden" name="action" value="do"> too def doForm(): # do the action This way you just have one servlet. You could use the action field to hold information about stages if it's a wizard-type form. I've also written something to do some of the checking, and potentially the form generation, for you. It's somewhat rough and not terribly well documented, but it makes form generation somewhat easier, and considerably more robust. You can get it at: http://www.colorstudy.com/static/ianb/downloads/webware/Form-0.1.tar.gz If you do try it, I'd be very interested to get some constructive criticism on it. I'm pretty happy with the internals, but the way it interfaces with the servlet and its methods I'm not too happy with. Ian |