2014-12-01 3 views
6

좋아요. 같은 문제가있는 게시물이 20 개는 있지만 그 중 누구도 나를 도와주지 않는 것으로 알고 있습니다. 따라서이 게시물은 중복 될 수 있지만 다른 모든 게시물 및 그들 중 누구도 내 문제를 해결하지 못했습니다. 그래서 내가 잘못하고있는 것이 있거나 앞에서 언급 한 질문의 답에서 올바른 수정을하지 않을 것입니다.spring RequestMapping 404 status

저는 스프링을 사용하여 작은 응용 프로그램을 만들려고 노력하고 있습니다. 아직 실험 중이지만, 잘못된 것을 파악하기 위해 4 일을 보냈습니다. 나는 컨트롤러에서 jsp를 다시 얻으려고 할 때마다 여전히 HTTP Status 404를 얻는다.

@Controller 
public class WebAppController { 

    @RequestMapping(value="/login", method = RequestMethod.GET) 
    public String login() { 
     System.out.println("You have entered the login maprequest"); 
     return "test1"; 
    } 

} 

의 web.xml :

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <display-name>Hotel Application</display-name> 
    <servlet> 
     <servlet-name>WebApp</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>WebApp</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>login.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

webApp.xml :

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 
    <context:component-scan base-package="com.iquestgroup" /> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/jsp/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 
</beans> 

이 구성 작품 톰캣을 통해 404 개 상태, 아무것도 ...

WebAppController하지만 아무것도 위에서 언급 한 것만으로 간단한 maven 프로젝트에서. 문제는 3 모듈 (persistence, service, webapp)을 가진 maven 프로젝트에서 똑같은 일이 일어나지 않는다는 것입니다. webapp에서 똑같은 것을 복사했고 서버에서 실행하면 404 http status를 얻습니다 ... 비록 모듈이 성공으로 구축되고 있지만.

L.E. 수락 된 답변의 첫 번째 부분은 Spring으로 시작하는 사람들이 작성한 일반적인 서블릿 매핑 실수입니다. 내 문제는 그것과 관련이 없었고 나는 처음 대답 후에 그것을 제거했다.

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 
+0

문제의 '/ *'문제를 편집했습니다! 이제 대답은 의미가 없습니다. 그것은 '/*'을 변경하지만 ***는 ***에 *** 표시되지 않습니다. –

+0

@StephenP 초기 응답 후 질문이 편집되었으며 답변의 주석에서이를 발표했습니다./* 비록 내 문제가 아니었지만 스택 오버플로에 관해서는 더 많은 질문이 있습니다. 당신의 견해를 이해하고 당신이 옳다고 생각합니다. 혼란 스러울 수 있습니다. 그래서 질문 끝에 그 말을 추가 할 것입니다. –

답변

6

변경

<url-pattern>/*</url-pattern> 

현재

<url-pattern>/</url-pattern> 

에, 당신의 DispatcherServlet를 매핑 : 독자들에게 혼동이되지하기 위해, 허용 대답의 첫 번째 부분은 다음과 같은 코드를 말한다 /* 때문에 모든 요청을 처리하는 것으로 표시되었습니다. 즉, /WEB-INF/jsp/test1.jsp으로 발송 된 요청을 처리하려고 시도합니다. 분명히 그것에 대한 처리기가 없으므로 실패합니다.

패턴 /은 다른 패턴이 일치하지 않는 경우 기본 폴백입니다. 요청 경로에 매핑되는 Servlet이있는 경우 DispatcherServlet에 매핑되기 전에 Servlet이 선택됩니다.

url-pattern*.jsp 인 렌더링 JSP를 처리하기 위해 대부분의 (아마도 모든) 서블릿 컨테이너는 Servlet과 매핑됩니다. 이 금액은 /에 매핑 된 DispatcherServlet보다 우선합니다.

이러한 변경 후에도 이 여전히440이되는 경우 몇 가지 가능성이 있습니다.

스프링은 INFO 레벨에서 어떤 레지스터 메소드 (@RequestMapping annotated methods @Controller beans)를 기록합니다. 로그에 해당 항목이 없으면 웹 응용 프로그램이 올바르게/성공적으로 배포되지 않은 것입니다.

서블릿 컨테이너가 IDE에 포함되어있는 경우 배포 된 응용 프로그램에서 해당 탭 /보기를 확인하십시오. 독립형 인 경우 생성 된 .war 파일이 적절한 디렉토리에 있고 올바르게 확장되었는지 확인하십시오.

+0

나는 /와 /를 * 다른 질문에 대한 대답에서 내 것과 비슷하게 변경 했었지만 이전에 말했던 것과 같았지만 여전히 작동하지 않았습니다. –

+0

@drag 그러면 자세한 내용이 필요합니다. Spring 로그를 DEBUG로 바꾸고, 요청을 보내고 결과를 질문에 편집으로 게시하십시오. –

+0

@drag 또한 요청을 보내는 URL을 명확히하십시오. –

1

우선, 다음과 같은 루트 컨트롤러로 청취/요청할 수 있습니다.

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

Logger logger = Logger.getLogger(RootCtrl.class); 

@RequestMapping (value = "/", method = {RequestMethod.GET, RequestMethod.POST}) 
public String index(ModelMap model) { 

    // redirect to login page 
    return "redirect:admin/index"; 
}} 

해당 컨트롤러를 사용하면 모든 요청을 루트로 매핑 할 수 있습니다. 로그인 컨트롤러에 요청을 리디렉션 할 수 있습니다.

요청 매핑에 관한 내용입니다. loginController 또는 webController shold는 이전에 지정해야하는 요청을 수신합니다. 내 응용 프로그램에서 로그인 컨트롤러는 수신 대기/관리 요청 경로를 사용합니다. 내 로그인 컨트롤러는 다음과 같습니다.

@Controller 
@RequestMapping ("/admin") 
public class LoginCtrl { 

@RequestMapping (value = "/index", method = {RequestMethod.GET, RequestMethod.POST}) 
public String index(@RequestParam (value = "captchaId", defaultValue = "") String captchaId, ModelMap model, HttpServletRequest request, HttpServletResponse response) { 

    if(StringUtils.isNullOrEmpty(captchaId)){ 
     captchaId = RandomGUID.getRandomGUID(); 
    } 

    model.addAttribute("captchaId", captchaId); 

    // redirect to login page 
    return "login"; 
} 

로컬 호스트/SampleProject/admin/index에서 요청을 받게됩니다. 매핑이 작동합니다.

+0

답장을 보내 주셔서 감사합니다.하지만 컨트롤러는 괜찮 았습니다. 모든 것이 잘 작동하는지 확인하기위한 테스트는 매우 복잡하지 않았습니다. 이번에는 그렇지 않았습니다. 문제는 @Sotirios Delimanolis에 의해 해결 된 것처럼 애플리케이션을 올바르게 배포하지 않았다는 것입니다. –

관련 문제