You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Kevin HaleBoyes <kc...@yahoo.com> on 2002/07/05 16:21:22 UTC

RequestWrapper question

It is a common problem that I'm tying to solve.

I have a web application that has a fill-in form.  The user
fills in some of the fields and submits it to a servlet for
processing.  The servlet verifies the input request parameters
either directly or using (EJ) Beans.  If the input data is not
valid then the form is redisplayed with the previously submitted
values filled in ready for corrections.

It is this last step that I'm now working on.  I'd like to use
JSTL (core) tags in my form and I'll probably have my servlet
directly validate the data (acting as the model and controller).

Consider the following simple fill-in form: fif.jsp

    <%@ taglib uri="http://java.sun.com/jstl/core"
            prefix="c" %>

    <html><head><title>Test Fill-in Forms</title></head>
    <body>
    <form method="post" action="TestServlet">
       <input type="text" name="inputstr"
                    value="<c:out value='${inputstr}'/>">
       <input type="submit" value="Do">
    </form>
    </body></html>


When the servlet receives the request it looks at the value of
request.getParameter("inputstr") and determines that it is not
correct so it forwards the request back to the fif.jsp page.


public class TestServlet extends HttpServlet
{
    public void doPost( HttpServletRequest request,
                        HttpServletResponse response )
                        throws ServletException, IOException {
        String inputstr = request.getParameter("inputstr");
        // ... but it is not valid
        getServletContext().getRequestDispatcher("/fif.jsp").
                forward(request, response);
    }
}

This doesn't work because <c:out> will call
PageContext.findAttribute() which looks for attributes and
not parameters.
Section 3.2 of the JSTL spec says of identifiers:
  "searches for the named attribute in page, request,
  session (if valid), and application scope(s) in order
  and returns the value associated or null"

I don't think I should set the attribute at the application or
the session levels as they don't seem to belong there.
I dont' know how to set attributes in the
page context so I had a look at the request level.

I need to add attributes to the request before I forward it but 
the setAttribute() method isn't defined for HttpServletRequest.

So, I have to wrap the request and override the Attribute 
related method calls.  There seems to be a good example of how
I might do this in the core code of catalina -
  org.apache.catalina.core.Application[Http]Request.

Then I can change TestServlet to use the wrapper and set the
'inputstr' attribute before forwarding the request.

public class TestServlet extends HttpServlet
{
    public void doPost( HttpServletRequest request,
                        HttpServletResponse response )
                        throws ServletException, IOException {
        String inputstr = request.getParameter("inputstr");
        // ... but it is not valid

        // use my own implementation of catalina's core
        //  Application[Http]Request classes
        ApplicationHttpRequest appreq =
                         new ApplicationHttpRequest(request);
        appreq.setAttribute("inputstr", inputstr);


        getServletContext(). getRequestDispatcher("/fif.jsp").
                forward(appreq, response);
    }
}


That is what I'm thinking of doing but I wanted to ask a few
questions.

Does any of the proceeding explanation make sense?

It doesn't have to be the best way, but
 is it one of the possible ways of solving the problem?

Most of the examples that I've found on RequestWrapper have
been to do with Filters.  Any reason why that would be?

This is a very common problem and many have come before me.
What improvements could I make?  What are the other solutions?



Thanks for your help,
Kevin.


__________________________________________________
Do You Yahoo!?
Everything you'll ever need on one web page
from News and Sport to Email and Music Charts
http://uk.my.yahoo.com

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: RequestWrapper question

Posted by Arshad Mahmood <ar...@compuvision.co.uk>.
----- Original Message -----
From: "Craig R. McClanahan" <cr...@apache.org>
To: "Tomcat Users List" <to...@jakarta.apache.org>
Sent: Friday, July 05, 2002 7:30 PM
Subject: Re: RequestWrapper question


> Redisplay of pages with input errors is one of the things that application
> frameworks like Struts deal with <http://jakarta.apache.org/struts>.  You
> might want to take a look at that, instead of rolling your own for every
> single form.
>
> Craig
>
>
> On Fri, 5 Jul 2002, Kevin HaleBoyes wrote:
>
> > Date: Fri, 5 Jul 2002 15:21:22 +0100 (BST)
> > From: Kevin HaleBoyes <kc...@yahoo.com>
> > Reply-To: Tomcat Users List <to...@jakarta.apache.org>
> > To: tomcat-user@jakarta.apache.org
> > Subject: RequestWrapper question
> >
> > It is a common problem that I'm tying to solve.
> > Consider the following simple fill-in form: fif.jsp
> > This doesn't work because <c:out> will call
> > PageContext.findAttribute() which looks for attributes and
> > not parameters.
> > Section 3.2 of the JSTL spec says of identifiers:
> >   "searches for the named attribute in page, request,
> >   session (if valid), and application scope(s) in order
> >   and returns the value associated or null"
> >
> > I don't think I should set the attribute at the application or
> > the session levels as they don't seem to belong there.
> > I dont' know how to set attributes in the
> > page context so I had a look at the request level.
> >
> > I need to add attributes to the request before I forward it but
> > the setAttribute() method isn't defined for HttpServletRequest.

These methods are inherited from ServletRequest, they're not
HttpServletRequest specific.
So you can use request.setAttribute and then use pageContext.findAttribute
as you
intended.

Struts would provide much of this and more. But that depends on how you want
to structure your application.

Regards.




--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: RequestWrapper question

Posted by "Craig R. McClanahan" <cr...@apache.org>.
Redisplay of pages with input errors is one of the things that application
frameworks like Struts deal with <http://jakarta.apache.org/struts>.  You
might want to take a look at that, instead of rolling your own for every
single form.

Craig


On Fri, 5 Jul 2002, Kevin HaleBoyes wrote:

> Date: Fri, 5 Jul 2002 15:21:22 +0100 (BST)
> From: Kevin HaleBoyes <kc...@yahoo.com>
> Reply-To: Tomcat Users List <to...@jakarta.apache.org>
> To: tomcat-user@jakarta.apache.org
> Subject: RequestWrapper question
>
> It is a common problem that I'm tying to solve.
>
> I have a web application that has a fill-in form.  The user
> fills in some of the fields and submits it to a servlet for
> processing.  The servlet verifies the input request parameters
> either directly or using (EJ) Beans.  If the input data is not
> valid then the form is redisplayed with the previously submitted
> values filled in ready for corrections.
>
> It is this last step that I'm now working on.  I'd like to use
> JSTL (core) tags in my form and I'll probably have my servlet
> directly validate the data (acting as the model and controller).
>
> Consider the following simple fill-in form: fif.jsp
>
>     <%@ taglib uri="http://java.sun.com/jstl/core"
>             prefix="c" %>
>
>     <html><head><title>Test Fill-in Forms</title></head>
>     <body>
>     <form method="post" action="TestServlet">
>        <input type="text" name="inputstr"
>                     value="<c:out value='${inputstr}'/>">
>        <input type="submit" value="Do">
>     </form>
>     </body></html>
>
>
> When the servlet receives the request it looks at the value of
> request.getParameter("inputstr") and determines that it is not
> correct so it forwards the request back to the fif.jsp page.
>
>
> public class TestServlet extends HttpServlet
> {
>     public void doPost( HttpServletRequest request,
>                         HttpServletResponse response )
>                         throws ServletException, IOException {
>         String inputstr = request.getParameter("inputstr");
>         // ... but it is not valid
>         getServletContext().getRequestDispatcher("/fif.jsp").
>                 forward(request, response);
>     }
> }
>
> This doesn't work because <c:out> will call
> PageContext.findAttribute() which looks for attributes and
> not parameters.
> Section 3.2 of the JSTL spec says of identifiers:
>   "searches for the named attribute in page, request,
>   session (if valid), and application scope(s) in order
>   and returns the value associated or null"
>
> I don't think I should set the attribute at the application or
> the session levels as they don't seem to belong there.
> I dont' know how to set attributes in the
> page context so I had a look at the request level.
>
> I need to add attributes to the request before I forward it but
> the setAttribute() method isn't defined for HttpServletRequest.
>
> So, I have to wrap the request and override the Attribute
> related method calls.  There seems to be a good example of how
> I might do this in the core code of catalina -
>   org.apache.catalina.core.Application[Http]Request.
>
> Then I can change TestServlet to use the wrapper and set the
> 'inputstr' attribute before forwarding the request.
>
> public class TestServlet extends HttpServlet
> {
>     public void doPost( HttpServletRequest request,
>                         HttpServletResponse response )
>                         throws ServletException, IOException {
>         String inputstr = request.getParameter("inputstr");
>         // ... but it is not valid
>
>         // use my own implementation of catalina's core
>         //  Application[Http]Request classes
>         ApplicationHttpRequest appreq =
>                          new ApplicationHttpRequest(request);
>         appreq.setAttribute("inputstr", inputstr);
>
>
>         getServletContext(). getRequestDispatcher("/fif.jsp").
>                 forward(appreq, response);
>     }
> }
>
>
> That is what I'm thinking of doing but I wanted to ask a few
> questions.
>
> Does any of the proceeding explanation make sense?
>
> It doesn't have to be the best way, but
>  is it one of the possible ways of solving the problem?
>
> Most of the examples that I've found on RequestWrapper have
> been to do with Filters.  Any reason why that would be?
>
> This is a very common problem and many have come before me.
> What improvements could I make?  What are the other solutions?
>
>
>
> Thanks for your help,
> Kevin.
>
>
> __________________________________________________
> Do You Yahoo!?
> Everything you'll ever need on one web page
> from News and Sport to Email and Music Charts
> http://uk.my.yahoo.com
>
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>
>
>


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>