views:

70

answers:

3

First of all, I did not use Spring MVC. :) :) Just want to get it out first. Now what I have is different JSP pages that making calls to different Servlets. All the pieces work great individually but I kind of need to link them together. If all of jsp pages make GET request then it would be easy, since I would just pass a type via the web address, and on my servlet side, I would just enumerated through all the parameter, determine which type is it, and delegate to the right servlet. But not all jsp pages make GET request, some make POST request via form. Let see example

 A.jsp
 $.getJSON('GenericServlet?type=A', ...

 GenericServlet.java
 String type = request.getParameter("type");    
 if(type.equals("A")){
     //Somehow delegate to Servlet A (Not sure how to do that yet :))
 }

but in B.jsp I would have something like this

 B.jsp
 <form action="GenericServlet" method="post">
    <table border=0 cellspacing=10 cellpadding=0>
        <tr>
            <td>User Name:</td>
            <td><input type="text" name="username" size=22/></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type="password" name="password" size=22/></td>
        </tr>
    </table>
    <input type="submit" value="Create User" />
</form>

It kind of hard for me to determine in GenericServlet.java that this need to go to servletB

A: 

In your GenericServlet just do:

  public void doPost(HttpServletRequest request,HttpServletResponse response) 
         throws ServletException, IOException {
    doGet(request, response);
  }

So the doPost() will delegate to doGet().

And have the same code for the doGet() as before.

Alexandru Luchian
A: 

You can also try to perform the servlet 'delegation' logic you have inside your jsp. You can do this much easier using the JSP Expression Language (EL) and JSTL tags.

Example:

<c:if test="${param.type == 'A'}>
   call servlet 1
</c:if>
<c:if test="${param.type == 'B'}>
   call servlet 2
</c:if>

Servlet 1 or 2 could implement either doGet() or doPost() as needed. Or you can go by Heavy Bytes' sugestion of having the doPost() delegate to doGet().

This way maybe you can do away with your GenericServlet.

idleworx
the problem is that you dont really know whether it is a type or not, since B.jsp communication with `GenericServlet` via POST request
Harry Pham
+2  A: 

The usual MVC approach is to override the HttpServlet#service() method and let the business logic depend on the request method as well, as obtained by HttpServletRequest#getMethod(). Also see this answer.

An alternative approach is indeed to let doGet() and doPost() do both the same logic, but I would not delegate the one to the other, I would rather delegate them both to the same independent method. E.g. (semi-pseudo):

protected void doGet(request, response) {
    process(request, response);
}

protected void doPost(request, response) {
    process(request, response);
}

private void process(request, response) {
    // Do your thing here.
}

As opposed to HttpServlet#service() method, this does not take the HTTP HEAD, TRACE, PUT, OPTIONS and DELETE request methods into account. You may namely want to ignore them and let the servletcontainer handle them the "default" way (i.e. returning HTTP 405 Method Not Allowed).

BalusC
Did you make any tutorial on this type of MVC approach, BalusC? like Spring MVC or Strut?
Harry Pham
@Harry: no, actually not. That's going to be a lot of writeup. You may find this articule useful: http://www.javaranch.com/journal/200603/frontman.html
BalusC
After reading the article, I feel that I gain some knowledge about the material, but dont really know how to implement it, since it does not really show u how to do it. However, good reference knowledge, thank you balusC
Harry Pham