Search code examples
spring-mvcglassfishrequest-mappingxml-configuration

Browser URL error in Spring MVC request mapping


Please do not reject this question as I have gone through many related questions and couldn't find the specific problem I am trying to solve. Pardom me for any shortcomings in the post as I have only started to post questions. I am facing an issue with URL's submitting a form or navigating from one page to another causing error 404. I am using glassfish server 4.1.1. I have a welcome page containing a hyperlink/form at :

`http://localhost:8080/2_ReadingFormData`.

When I try to Navigate to another page by manually typing the url as follows it works :

`http://localhost:8080/2_ReadingFormData/showForm`

But when I try to navigate to the page using a hyperlink/form, the URL doesn't include my project directory resulting 404 error :

`http://localhost:8080/showForm`

I wasn't able to find the reason why this occurs. In some cases of form submission it seems to work fine. In this particular example, the form does work but the hyperlink doesn't because of the reason described above. What is the reason behind this odd behavior?

FormController.java

package spmvcform;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class FormController {

    @RequestMapping //or @RequestMapping("/")
    public String showMainPage()
    {
        return "mainpage";
    }

    @RequestMapping("/showForm")
    public String showForm()
    {
        return "myform";
    }

    @RequestMapping("/processForm")
    public String processForm()
    {
        return "helloworld";
    }

}

mainpage.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head> 
    <body>
        <h1>This is the main page</h1>
        <a href="showForm">Next</a>
    </body>
</html>

myform.jsp

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Form Page</h1><br/>
        <form action="processForm" method="get">
            <input type="text" name="uname"
                   placeholder="what's your name?"/>

            <input type="submit" name="Next"/>

        </form>
    </body>
</html>

helloworld.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Hello World</title>
    </head>
    <body>
        <h1>Student name : ${param.uname}</h1>
    </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>

</web-app>

dispatcher-servlet.xml

<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
            </props>
        </property>
    </bean>

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <!--
    The index controller.
    -->
    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />

</beans>

applicationContext.xml

<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                           http://www.springframework.org/schema/tx 
                           http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/mvc 
                           http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"
       xmlns:context="http://www.springframework.org/schema/context" 
       xmlns:mvc="http://www.springframework.org/schema/mvc">


    <!-- Add support for component scanning-->
    <context:component-scan base-package="spmvcform"/>

    <!-- Add support for conversion, formatting and validation support-->   
    <mvc:annotation-driven/>

</beans>

I am using netbeans 8.2 with Glassfish server 4.1.1.


Solution

  • This is happening because you are giving relative path instead of absolute path.so adding slash before showForm like <a href="/showForm">Next</a> should work fine.

    OR

    You can add context path like below.

    <a href="${pageContext.request.contextPath}/showForm">Next</a>
    

    OR

    put context path in one variable and use it throughout the page like below.

    // somewhere on the top of your JSP
    <c:set var="contextPath" value="${pageContext.request.contextPath}"/>
    
    ...
    <a href="${contextPath}/showForm">Next</a>
    

    See difference-between-relative-path-and-absolute-path-