user1065604
user1065604

Reputation:

JSP - Servlet calling goes wrong

I have a problem with my practice project. Maybe I'm blind, but i can not solve the riddle. Hopefully this is not just another duplicate.

  • 1. There is a list inside a jsp to present objects in an abstract way. From that I link each to a servlet with a <a href>.

           <c:forEach var="object" items="${dealer.objectList}" varStatus="status">
                  <div class="changableElement">
                            <jsp:include page="/Object/objectDetails.jsp"></jsp:include>
                            <a href="/MyProjekt/ObjectResolverServlet/${object.id}" id="send">Change</a>
                  </div>
           </c:forEach>
    

    This works fine.

  • 2. The ObjectResolverServlet gets the object again from background and puts it in the request as an attribute.

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws      ServletException, IOException {
           System.out.println("Mark #1");
           String objectId = request.getPathInfo().substring(1);
           MyObject obj = dbHandler.getMyObjectById(objectId );
           System.out.println(obj);
           request.setAttribute("objectDetails", obj);
           response.setContentType("text/html");        
           getServletContext().getRequestDispatcher("/MyObjectChangePage").forward(request, response) ;
    }
    

    On MyObjectChangePage the user is able to manipulate details of obj.

  • 3. MyObjectChangePage consists mainly of a form, textfields and submit buttons that directs to another servlet.

    <form id="object_change_values_form" action="ObjectChangeServlet" method="post" >
        <div>
            <label for="name">Name:</label><br> 
            <input id="name" name="name" type="text" value="${obj.name}" />
            <span id="nameDetails"bla bla ..</span>
        </div>
    
        <div>
            <label for="origin"Origin:</label><br>
            <input id="origin" name="origin" type="text" value="${obj.origin}" />
            <span id="originDetails">bla bla ../span>
        </div>
    
        <div>
            <label for="year">Bitte Jahrgang eingeben!</label><br>
            <input id="year" name="year" type="text" value="${obj.year}" />
            <span id="yearDetails">bla bla ..</span>
        </div>
    
        <div>
            <label for="description">Description</label><br>
            <textarea name='description' id='description'>${obj.description}</textarea>
            <span id="descriptionDetails">bla bla ..</span>
        </div>
    
        <div>
            <label for="priceSelling">Price</label><br>
            <input id="priceSelling" name="priceSelling" type="text" value="${obj.priceSelling}" />
            <span id="priceSellingDetails">bla bla ..</span>
        </div>
    
        <input id="send" type="submit" value="Change" name = "button"/>                     
        <input id="send" type="submit" value="Cancel" name = "button"/>
    </form>
    

  • 4. ObjectChangeServlet is never called - instead the output Mark #1 from ObjectResolverServlet and in a new line null is printed. I found that from 'ObjectResolverServlet' the doPost method is called. Guess i made a weired mistake.

    Parts of my web.xml here:

      ....
      <servlet>
        <servlet-name>ObjectChangeServlet</servlet-name>
        <servlet-class>impl.servlets.ObjectChangeServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>ObjectChangeServlet</servlet-name>
        <url-pattern>/ObjectChangeServlet</url-pattern>
      </servlet-mapping>
    
      <servlet>
        <servlet-name>ObjectChangePage</servlet-name>
        <jsp-file>/Object/object_change_values.jsp</jsp-file>
      </servlet>
      <servlet-mapping>
        <servlet-name>ObjectChangePage</servlet-name>
        <url-pattern>/ObjectChangePage</url-pattern>
      </servlet-mapping>
    
      <servlet>
        <description>Gets the object by id</description>
        <servlet-name>ObjectResolverServlet</servlet-name>
        <servlet-class>impl.servlets.ObjectResolverServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>ObjectResolverServlet</servlet-name>
        <url-pattern>/ObjectResolverServlet/*</url-pattern>
      </servlet-mapping>
      ....
    

  • Upvotes: 0

    Views: 845

    Answers (1)

    user1065604
    user1065604

    Reputation:

    Found the solution thanks to the good clues in the comments above. It's simply that the action in <form .. > tag must point to the processing servlet in a absolute manner, so my first attempt in 3. was absolute wrong

    wrong <form id="object_change_values_form" action="ObjectChangeServlet" method="post" >

    but the correct solution is
    <form id="object_change_values_form" action="/MyProjekt/ObjectChangeServlet" method="post" >

    Upvotes: 1

    Related Questions