为什么我的春季mvc视图无法加载?

时间:2015-08-01 13:12:04

标签: java jsp spring-mvc netbeans-8

我是初学mvc的新手。我目前正在使用netbeans 8.0.2。以及一个spring mvc插件。从我在'库中看到的jar文件'项目部分似乎我使用的是spring mvc 4.0.1。

我可以从tomcat服务器甚至是glassfish加载index.jsp页面,但是如果我应该在目录结构 WEB-INFO> jsp> response.jsp 下创建另一个.jsp文件一个例子。我从服务器收到错误404。这可能是一个非常简单的修复,但到目前为止还没有成功。

我怀疑它与我的控制器和[springapp] -servlet.xml文件有关。我在网上看到的大多数例子都使用spring mvc 3.x并且避免在控制器设置中使用注释方法,乍一看后者对我来说似乎更容易。然后,这些示例继续向前面提到的xml文件添加几行。但是,我认为通过使用注释控制器设置,spring mvc会自动检测我的控制器。是不是建议使用注释方法?

我的配置文件如下:

的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>springapp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>

    </servlet>
    <servlet-mapping>
        <servlet-name>springapp</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
    </welcome-file-list>
</web-app>

springapp-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/mvc 
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                            http://www.springframework.org/schema/context 
                            http://www.springframework.org/schema/context/spring-context-40.xsd
                            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"/>


    <!--
    Most controllers will use the ControllerClassNameHandlerMapping above, but
    for the index controller we are using ParameterizableViewController, so we must
    define an explicit mapping for it.
    -->
    <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>

其他相关文件:

控制器:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
//import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.RequestParam;

/**
 *
 * @author macj7
 */

@Controller
public class HelloController {


    @RequestMapping( value = "/response", method = RequestMethod.GET)
    public String index( Model model) {
        String name = "World";
        model.addAttribute("name", name );
        return "response";
    }

}

的response.jsp:

<%-- 
    Document   : response
    Created on : Jul 31, 2015, 1:25:19 PM
    Author     : macj7
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Spring Web MVC </title>
    </head>
    <body>
        <h1> th:text= "Hello, ${name}!" </h1>
    </body>
</html>

redirect.jsp中:

<%--
Views should be stored under the WEB-INF folder so that
they are not accessible except through controller process.

This JSP is here to provide a redirect to the dispatcher
servlet but should be the only JSP outside of WEB-INF.
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% response.sendRedirect("index.htm"); %>

如果有解决此问题或更多信息的话 需要请告诉我。我也想解释任何答案 因为我正在努力学习,而不仅仅是复制和粘贴解决方案。 这是我用java创建Web应用程序的第一次尝试,我必须说配置本身似乎相当令人生畏。

提前感谢您的时间和耐心。

3 个答案:

答案 0 :(得分:1)

我认为在web.xml文件的欢迎文件列表中,您应该提供Spring Controller Request Mapping而不是jsp文件名,如下所示。

<welcome-file-list>
    <welcome-file>/response</welcome-file>
</welcome-file-list>

答案 1 :(得分:1)

好的,我找到的解决方案是定义将springapp-servlet.xml中的请求作为bean处理的控制器,并且还在控制器本身重新定义该方法,以便它返回ModelAndView(import org。 springframework.web.servlet.ModelAndView)。 我的页面现在呈现。

我应该注意到我已经重写了模型而没有使用注释表单来编写控制器,但我很快就会以这种形式测试它。现在我只是简单地实现了控制器接口。

感谢所有回复的人。您的意见得到了赞赏。

答案 2 :(得分:0)

根本原因:

  1. 根据web.xml DispatcherServlet查找以*.htm结尾的网址,表明它不接受response.jsp的请求
  2. 注意:

    在启动时加载DispatcherServlet为优先级1

    <load-on-startup>1</load-on-startup>
    

    <强>解决方案:

    更改将检查每个请求的DispatcherServlet的映射。

    <servlet-mapping>
        <servlet-name>springapp</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    要访问response.jsp,您需要输入根据控制器中定义的www.domain/context-root/response映射的网址RequestMapping

    详细了解Web MVC framework - The DispatcherServlet