great thanks!!!
tibi Dustin Pearce wrote: > When you want to modify just a "part" of an object, you need to be > sure that you load the model from the database *before* you apply the > parameters posted from your web form. What is happening is that your > form is creating a *new* user instance and populating the fields from > your small form (id, name, etc) and then updating the database. > > Typically, this is done using the Preparable interface on your action > in Struts. In prepare() you look for the id of the object and you > try and load it from the database. The tricky part has to do with > Struts2 interceptors. The two interceptors we are concerned with are > params and prepare. If you look at struts.xml you will see a list of > interceptors defined as a "stack". In this list you will see prepare > and then you will see params later on. The prepare interceptor checks > to see if your object implements Preparable and calls prepare() if it > does. The param interceptor takes the parameters posted in the > request and applies them to the various setters on your action. What > makes this tricky is that we have a setter called setId() that we need > to be called *before* prepare in order to know what object to load. > The solution is to add another reference to params interceptor before > prepare. The net effect is that Struts will apply all the parameters > from your post, then call prepare and load the object from the > database (overwriting the post values), and then Struts will write the > post values again, only overwriting what you have posted and keeping > the older values from the database. In this example you can also look > for user.getId() in prepare, but you'd have to check to see if user is > null. > > So that is how it was done in Struts for thousands of years. Now in > the lastest versions of Appfuse, Matt has come with a rather nice > solution using prepare. In his example you don't need to add the > extra run of the params interceptor before prepare because he works on > the raw request. This is some nice code, that gets around a rather > painful pattern in Struts. The only complaint I would have is making > your action http dependent. Its is considered bad form to have your > action work with HTTP elements like HttpServletRequest or > HttpServletSesssion directly. There are plans to correct this in the > near future by using Struts built in support like RequestAware or > SessionAware that return a plain map connected by Struts to the HTTP > object. > > public void prepare() { > if (getRequest().getMethod().equalsIgnoreCase("post")) { > // prevent failures on new > if (!"".equals(getRequest().getParameter("user.id"))) { > user = > userManager.getUser(getRequest().getParameter("user.id")); > } > } > } > > > So the moral is follow Matt's pattern. Unless you plan to submit > EVERY SINGLE field for a model when you save or update then its a good > idea to get this prepare() pattern to be part of your muscle memory. ;-) > > > > > > > On Apr 1, 2008, at 3:12 AM, tibi wrote: > >> hi list, >> >> im not sure how to update an user when i only want to update one or two >> fields. >> using struts spring hibernate >> >> lets say i only want to change the name. >> i make a form with hidden field with id and a normal field with name. >> >> when i enter my save method i have a user with only an id and name. and >> the other fields like password version etc. are empty. >> >> should i get the old userfrom the db and copy the name from the new one >> to the old one and update it?? >> should i put all fields hidden in my form? >> should i save the user into the session? >> >> thanks, >> >> tibi >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> <mailto:[EMAIL PROTECTED]> >> For additional commands, e-mail: [EMAIL PROTECTED] >> <mailto:[EMAIL PROTECTED]> >> > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]