struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Raghu Kanchustambham <kra...@gmail.com>
Subject Re: Validator framework hijacks requests! :(
Date Tue, 15 Nov 2005 16:38:22 GMT
Thanks Laurie. It works with the way you suggested. But it makes a lot of
things clumsy..

1. I need to have different action class mappings potentially for each of
the CRUD operations... though all of them use the same dispatch action
class.

2. I still havent figured out a way where you need to pass some "state"
information as a part of the URL to an action... something like
StudentEnquiry.do?studentId=32 .... let us say that is the URL for the input
parameter of the action mapping.. how do i dynamically get the number "32"
there.

But it works for the time being.


On this piece of actionform things are working.

Having said that ..something seems to go wrong with a similar piece of
action form.

I dont know what I am doing wrong .. can you please tell me what I am doing
wrong in the following:
<action attribute="studentEnrollmentForm" name="studentEnrollmentForm"
path="/StudentEnrollment" scope="request" validate="true" type="
com.tuningfork.student.action.StudentEnrollmentAction" parameter="operation"
input="/StudentEnrollmentPre.do?operation=preCreate&amp;postTo=
StudentEnquiryUpdate.do">
<forward name="preCreateSuccess"
path="/student/StudentEnrollment.jsp?nextOperation=create"/>
<forward name="viewSuccess" path="/student/StudentEnrollment.jsp"/>
<forward name="createSuccess" path="home"/>
</action>

<action attribute="studentEnrollmentForm" name="studentEnrollmentForm"
path="/StudentEnrollmentPre" scope="request"
validate="false" type="com.tuningfork.student.action.StudentEnrollmentAction"
parameter="operation">
<forward name="preCreateSuccess"
path="/student/StudentEnrollment.jsp?nextOperation=create"/>
<forward name="preUpdateSuccess"
path="/student/StudentEnrollment.jsp?nextOperation=update"/>
</action>



/StudentEnrollmentPre.do is the operation with validation set to false.

My quesiton: Is this good enuf for me to redirect to input parameter on
errors ?
Is setting validate="true" and input="/StudentEnrollmentPre.do" to turn on
server side validation?

when javascript validation is enabled through the <html:javascript> ... it
does client side validation and is able to figure out all the clientside
required fields with a "popup".

However, I expect it to return back and show the form again from the server
side if my validation fails. But after the client side validation (which it
successfully detects that required fields are missing with a pop-up).. it
just proceeds as if no errors were there on the page.
In a nutshell the input tag is not being used

Since javascript side is working fine I think validation.xml has no errors.
I will post it if you think you need to look at it too.


On a side note, I have been chatting with one of the senior users of struts.
His opinion is that Struts framework creates lot more problems than it
solves. What is your opinion on it? Atleast this thing is really taking a
lot of my effort to get it going... but may be its too early for me to
comment on the validator framework as I am new to it.

Thanks in advance.

Regards,
Raghu


On 11/14/05, Laurie Harper <laurie@holoweb.net> wrote:
>
> The easiest way is probably to split your action mapping out into two
> mappings, one for the operations that should have validation applied and
> one for the setup operations that shouldn't. Set validate="false" on the
> mapping for the setup operations, and make it the input for the other
> mapping which will have validate="true".
>
> L.
>
> Raghu Kanchustambham wrote:
> > Thanks Laurie for the suggestion.
> > >>>> Then set the 'input' attribute for your validating actions to point
> to
> > the pre-population action >>>> (so when validation fails, Struts
> forwards to
> > preCreate, not directly to the JSP).
> > That explains why the request variables are getting wiped off! :-) I
> > realize I am pointing directly to the JSP page. I changed it now to
> point to
> > preCreate.
> > However, I have only one action class for all these operations. I just
> > have various operations/functions inside that action class to handle
> them. I
> > use the dispatch action servlet and not the action servlet and
> preCreate,
> > create etc are various parameterized function calls on this dispacth
> action
> > class.
> > How would you achieve setting false and true on validations based on
> each
> > operation in dispatch action?
> > I am posting some relevant portions of my struts-config.xml. The minute
> I
> > changed validate="true", I am getting an exception. And I think I can
> > explain it. It is validating before the user inputs anything. Naturally
> it
> > fails. Then it redirects to the same "input" page. Again fails
> validation...
> > its just going into an endless loop. :(
> > Please suggest whats the best way to work around this?
> >
> > <form-bean name="studentEnquiryForm" type="
> > org.apache.struts.validator.DynaValidatorForm">
> > <form-property name="studentEnquiry" type="
> > com.tuningfork.student.businessobject.enquiry.StudentEnquiry "/>
> > <form-property name="contactAddress" type="
> > com.tuningfork.student.businessobject.enquiry.StudentAddress"/>
> > <form-property name="permanentAddress" type="
> > com.tuningfork.student.businessobject.enquiry.StudentAddress "/>
> > <form-property name="educationDetails" type="
> > com.tuningfork.student.businessobject.enquiry.StudentEducationDetail[]"
> > size="4"/>
> > <form-property name="workExperience" type="
> > com.tuningfork.student.businessobject.enquiry.StudentWorkExperience"/>
> > <form-property name="enquiryCentreId" type="java.lang.Integer"/>
> > <form-property name="enquiryCourseId" type=" java.lang.Integer"/>
> > <form-property name="studentEnquiryId" type="java.lang.Integer"/>
> > <form-property name="newsPaperIds" type="int[]"/>
> > <form-property name="discoverySourceIds" type="int[]"/>
> > <form-property name="centreTimePreferences" type="
> >
> com.tuningfork.student.businessobject.enquiry.StudentCentreTimePreference
> []"
> > size="3"/>
> >
> > <form-property name="studentEnquiryFilter" type="
> > com.tuningfork.student.businessobject.enquiry.StudentEnquiryFilter"/>
> > </form-bean>
> >
> > <action attribute="studentEnquiryForm" name="studentEnquiryForm"
> > path="/StudentEnquiry" scope="request"
> > validate="false" type="
> com.tuningfork.student.action.StudentEnquiryAction"
> > parameter="operation" input="/StudentEnquiry.do?operation=preCreate">
> > <forward name="preCreateSuccess"
> > path="/student/StudentEnquiry.jsp?nextOperation=create"/>
> > <forward name="preUpdateSuccess"
> > path="/student/StudentEnquiry.jsp?nextOperation=update"/>
> >
> > <forward name="viewSuccess" path="/student/StudentEnquiry.jsp"/>
> > <forward name="createSuccess" path="home"/>
> >
> > <forward name="initFilterForUpdateSuccess"
> > path="/student/StudentSearch.jsp?nextOperation=prepareListForUpdate"/>
> > <forward name="prepareListForUpdateSuccess"
> > path="/student/StudentSearch.jsp?nextOperation=prepareListForUpdate"/>
> > <forward name="updateSuccess"
> > path="/student/StudentEnquiry.jsp?nextOperation=update"/>
> >
> > </action>
> >
> >
> > On 11/13/05, Laurie Harper <laurie@holoweb.net> wrote:
> >
> >>The trick is to only include validation on the data processing actions,
> >>not on the pre-display actions ( i.e. use validate="false" on your
> >>preCreate action mapping, and only put validate="true" on the action you
> >>submit the form to). Then set the 'input' attribute for your validating
> >>actions to point to the pre-population action (so when validation fails,
> >>Struts forwards to preCreate, not directly to the JSP).
> >>
> >>You don't need to use session scope for anything if you don't want to,
> >>you just have to make sure that you always display your JSP via your
> >>preCreate action.
> >>
> >>If that doesn't make sense, post your action mappings from
> >>struts-config.xml so we can see how you have things setup.
> >>
> >>L.
> >>
> >>Raghu Kanchustambham wrote:
> >>
> >>>I think I can explain it now.
> >>>I hit the action servlet first invoking preCreate function. This
> >>
> >>function
> >>
> >>>populates various lists of beans needed for dropdowns and put these
> >>
> >>lists in
> >>
> >>>the request object and forward to a JSP. The JSP reads these lists and
> >>>displays the dropdowns. So far so good!
> >>>preCreate --->request object populated with lists ---> JSP reads from
> >>>request for dropdown lists
> >>>Now... enter the Validation framework! I think it is hijacking this
> >>
> >>series!
> >>
> >>>preCreate ---> request populated with lists ---> Validator framework
> >>
> >>--->
> >>
> >>>JSP
> >>>Now the jump from Validator framework to JSP means that all request
> >>
> >>scope
> >>
> >>>objects (the lists) are lost! :(
> >>>How should I architect ? Should I make these lists session scope? I
> >>
> >>somehow
> >>
> >>>dont like to make them session scope, because they are really request
> >>
> >>scope!
> >>
> >>>Can someone comment on my explanation / help me with a solution ??
> >>>Thanks much.
> >>>Regards,
> >>>Raghu
> >>>
> >>>
> >>>On 11/12/05, Martin Gainty <mgainty@hotmail.com> wrote:
> >>>
> >>>
> >>>>I didnt see the contents E.G. <tag> </tag> for your c.tld
??
> >>>>Martin-
> >>>>----- Original Message -----
> >>>>From: "Raghu Kanchustambham" <kraghu@gmail.com>
> >>>>To: "Struts Users Mailing List" < user@struts.apache.org>
> >>>>Sent: Saturday, November 12, 2005 10:37 AM
> >>>>Subject: Re: Fw: Validator framework introduces errors
> >>>>
> >>>>
> >>>>Hi Martin,
> >>>>I do something like:
> >>>>request.setAttribute("centreList",DataAccessManager.getCentres());
> >>>>before invoking the jsp.
> >>>>The strange part is, the minute i remove validation.xml from the
> >>
> >>validator
> >>
> >>>>path, effectively removing the validation framework, every thing works
> >>>>just
> >>>>fine! Just cant explain it ! :(
> >>>>Thanks again in advance to anyone who can explain this!
> >>>>Please find the StudentEnquiry.jsp attached.
> >>>>----------------------------------------
> >>>>
> >>>><%@ page import="
> >>>>com.tuningfork.student.businessobject.enquiry.StudentEducationDetail
> "%>
> >>>><%@ page language="java" %>
> >>>><%@ taglib uri="/WEB-INF/struts- bean.tld" prefix="bean" %>
> >>>><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
> >>>><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
> >>>><%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
> >>>><%@ taglib uri="/WEB-INF/struts-layout.tld" prefix="layout" %>
> >>>>
> >>>><layout:html>
> >>>><head>
> >>>><title>Student Enquiry</title>
> >>>>
> >>>><link rel="stylesheet" type="text/css" href="../mystyle.css" />
> >>>><SCRIPT>function set(target) { document.forms
> >>>>[0].operation.value=target;}</SCRIPT>
> >>>></head>
> >>>><body>
> >>>><h2>Student Enquiry</h2>
> >>>><html:errors/>
> >>>><c:set var="operationVar">
> >>>><%= request.getParameter("nextOperation")%>
> >>>></c:set>
> >>>>
> >>>><c:set var="readOnlyForm"> false </c:set>
> >>>>
> >>>><c:if test="${operationVar=='null' || operationVar=='ok'}"> <!--
view
> >>>>doesnt
> >>>>have a Next operation -->
> >>>><c:set var="readOnlyForm"> true </c:set>
> >>>></c:if>
> >>>><html:form action="StudentEnquiry.do"
> >>>>onsubmit="validateStudentEnquiryForm(this);">
> >>>><input type="hidden" name="operation"
> >>>>value="<%=request.getParameter("nextOperation")%>"
> >>>>/>
> >>>><table width="100%">
> >>>><tr>
> >>>><td rowspan="2">
> >>>><%@include file="StudentDemographics.jsp"%>
> >>>></td>
> >>>><td>
> >>>><layout:grid cols="2">
> >>>><layout:select property="enquiryCentreId" size="${selectBoxSize}"
> >>>>key="Enquiry Centre">
> >>>><layout:options collection ="centreList" property="id"
> labelName="name"
> >>
> >>/>
> >>
> >>>></layout:select>
> >>>><layout:select property="enquiryCourseId" size="${selectBoxSize}"
> >>>>key="Enquiry Course">
> >>>><layout:optionsCollection name="courseList" value="id" label="name"/>
> >>>></layout:select>
> >>>></layout:grid>
> >>>>
> >>>></td>
> >>>></tr>
> >>>>
> >>>>
> >>>><tr>
> >>>><td>
> >>>></td>
> >>>><td align="center">
> >>>><html:submit>${operationVar} </html:submit>
> >>>><html:cancel>cancel</html:cancel>
> >>>></td>
> >>>></tr>
> >>>>
> >>>></table>
> >>>>
> >>>>
> >>>></html:form>
> >>>>
> >>>></body>
> >>>></layout:html>
> >>>>------------------------------------------------
> >>>>
> >>>>
> >>>>On 11/12/05, Martin Gainty <mgainty@hotmail.com> wrote:
> >>>>
> >>>>
> >>>>>I did'nt see the (StudentEnquiry.jsp) jsp page which references
> >>>>
> >>>>centreList
> >>>>
> >>>>
> >>>>>bean?
> >>>>>I also dont see the code for centreList bean?
> >>>>>
> >>>>>Martin-
> >>>>>
> >>>>>----- Original Message -----
> >>>>>From: "Raghu Kanchustambham" <kraghu@gmail.com>
> >>>>>To: "Struts Users Mailing List" < user@struts.apache.org>
> >>>>>Sent: Saturday, November 12, 2005 9:40 AM
> >>>>>Subject: Validator framework introduces errors
> >>>>>
> >>>>>
> >>>>>Hi,
> >>>>>The minute I introduced Validator framework in my application .....
> >>>>>it started giving me the following error when I accessed the JSP
....
> >>>>>centreList is used as a parameter for the dropdown. The minute I
> remove
> >>
> >>>>>the
> >>>>>validation.xml from the path... the application runs fine again!
:(
> >>>>>very strange and i am not able to explain this behavior .. can
> someone
> >>>>>help?
> >>>>>Thanks much in advance.
> >>>>>Regards,
> >>>>>Raghu
> >>>>>
> >>>>>javax.servlet.jsp.JspException: Cannot find bean centreList in any
> >>
> >>scope
> >>
> >>>>>org.apache.struts.util.RequestUtils.lookup(RequestUtils.java :938)
> >>>>>fr.improve.struts.taglib.layout.field.OptionsCollectionTag.doStartTag
> (
> >>>>>OptionsCollectionTag.java:115)
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>
> org.apache.jsp.student.StudentEnquiry_jsp._jspx_meth_layout_optionsCollection_0
> >>
> >>>>>(StudentEnquiry_jsp.java:1088)
> >>>>>org.apache.jsp.student.StudentEnquiry_jsp._jspx_meth_layout_select_2
> >>>>>(StudentEnquiry_jsp.java:1062)
> >>>>>org.apache.jsp.student.StudentEnquiry_jsp._jspx_meth_layout_grid_1
> >>>>>(StudentEnquiry_jsp.java:1028)
> >>>>>org.apache.jsp.student.StudentEnquiry_jsp._jspService
> >>>>>(StudentEnquiry_jsp.java:258)
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>My validation.xml (very simple one):
> >>>>>
> >>>>><!DOCTYPE form-validation PUBLIC
> >>>>>"-//Apache Software Foundation//DTD Commons Validator Rules
> >>>>>Configuration 1.0//EN"
> >>>>>"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
> >>>>>
> >>>>>
> >>>>><form-validation>
> >>>>><formset>
> >>>>><form name="studentEnquiryForm">
> >>>>><field property="studentEnquiry.firstName" depends="required">
> >>>>><arg0 key=" firstName.mandatory"/>
> >>>>></field>
> >>>>></form>
> >>>>></formset>
> >>>>></form-validation>
> >>>>>
> >>
> >>---------------------------------------------------------------------
> >>To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >>For additional commands, e-mail: user-help@struts.apache.org
> >>
> >>
> >
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message