Servlet Spring MVC java - 无法访问控制器和查看

时间:2015-12-02 06:59:27

标签: spring jsp spring-mvc

我是 Spring MVC java的新手

配置(我做过的)

  • import spring library
  • import common-logging
  • Tomcat服务器(可以访问localhost:8080)

遇到问题

我可以毫无问题地访问 web-content 下的 index.jsp ,但在 WEB-INF下访问 hello.jsp ,服务器显示 HTTP状态404 ,网址已停在http://localhost:8080/APK_downloader/WEB-INF/jsp/hello.jsp problem image

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

  <display-name>APK downloader</display-name>

   <servlet>
      <servlet-name>spring-dispatcher</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>spring-dispatcher</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>

</web-app>

spring-dispatcher-servlet.xml (servlet配置xml)

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-4.2.3.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-4.2.3.xsd">

    <context:component-scan base-package="solutionView"/>

    <bean id="HanlderMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

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

</beans>

DBController.java (java资源类)

package solutionView;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value = "/hello")
public class DBController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public ModelAndView getModelView(){
        System.out.println("helllo");    // check point
        return new ModelAndView("hello");
    }

}

hello.jsp (查看jsp)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>Hello</h1>
<h2>${message}</h2>
</body>
</html>

5 个答案:

答案 0 :(得分:2)

首先,您无法直接访问 WEB-INF 文件夹。因此http://localhost:8080/APK_Downloader/WEB-INF/jsp/hello.jsp无效

其次,您使用@RequestMapping(value = "/hello")以及控制器类对您的处理程序进行了注释。因此,访问处理程序的完整URL是

http://localhost:8080/APK_Downloader/hello/hello

如果您想直接访问相对于您的上下文的方法,请删除 来自控制器的@RequestMapping(value = "/hello")

并且还会更改您的视图解析器定义

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

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

你错过了前缀

中的jsp部分

答案 1 :(得分:1)

请删除此行,并在url字符串中直接写入/ hello,将其重定向到hello.jsp页面

@RequestMapping(value = "/hello")

答案 2 :(得分:1)

更改 spring-dispatcher-servlet.xml

来自

<bean id="HanlderMapping" 
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

  <mvc:annotation-driven />
  

因为您使用的是注释驱动的MVC控制器(即   @RequestMapping,@ Controller)。这就是你需要添加上述内容的原因    spring-dispatcher-servlet.xml 中的语句。

答案 3 :(得分:0)

你不能直接访问WEB-INF下的文件,你必须让servlet来管理它。

根据网址映射,您需要知道method的映射是在其拥有Controller

的映射之后

例如:

@Controller
@RequestMapping(value = "/hello")
public class DBController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public ModelAndView getModelView(){
        System.out.println("helllo");    // check point
        return new ModelAndView("hello");
    }

}

意味着 getModelView()将回复以下网址:

http://localhost:8080/APK_downloader/hello/hello

删除重复的hello你有两个选择,要么删除

 @RequestMapping(value = "/hello") 

来自控制器,或保留它并将您的方法更改为以下内容:

 @RequestMapping(value = "", method = RequestMethod.GET)

答案 4 :(得分:0)

以这种方式更改控制器类:

@Controller
public class DBController {

    @RequestMapping(value = "/hello")
    public String displayHelloPage(){
       return "hello";

       }

}

现在,如何调用此URL。 localhost:8080/context_path/hello. 您必须在服务器中检查eclipse集中是否有上下文路径。如果上下文路径为/,则只需localhost:8080/hello。我希望这有帮助,如果没有,知道,我会删除我的答案。