2

我是 Spring 新手,看过无数示例,无法弄清楚这个问题。我遇到的问题是,当我从 index.jsp 页面单击链接时,它不会转发到 hello.jsp 页面。我不知道为什么。我花了 2 天时间查找示例并尝试无数示例,试图确定问题出在哪里,但无济于事。我希望你能告诉我问题是什么。我正在使用 NetBeans 7.2、Tomcat 7、JDK 7、Spring 3.2.1。redirect.jsp 可以访问 index.jsp 页面,但单击 index.jsp 页面上的链接会给我一个 404 错误。

我理解它的方式,欢迎文件是redirect.jsp(不知道这个文件是如何处理的,为什么它不通过调度程序启动——因为它是一个jsp?)。这将重定向到一个 htm 文件。调度器找到一个与 index.htm 匹配的 url 映射并调用 indexController,它发送到 "index" 视图,即 "/WEB-INF/jsp/" + index + ".jsp"。

当 Tomcat 启动时,我看到以下消息:

Mapped URL path [/helloworld] onto handler 'helloWorldController'
Mapped URL path [/helloworld/*] onto handler 'helloWorldController'
Mapped URL path [/index.htm] onto handler 'indexController'

单击 index.jsp 中的链接会给出以下警告消息:

No mapping found for HTTP request with URI [/WTSpring3/hello.htm]

我的网络文件布局如下:

web
  WEB-INF
    jsp
      hello.jsp
      index.jsp
    applicationContext.xml
    dispatcher-servlet.xml
    web.xml
  redirect.jsp

重定向.jsp

<% response.sendRedirect("index.htm"); %>

index.jsp(这是我永远无法工作的。我不确定我的 Spring 设置链接是否不正确)。

<html><body>
<a href="hello.htm">Say Hello</a>
</body></html>

你好.jsp

<html>
<body>${message}</body>
</html>

web.xml - 注意这里的 url-pattern 是 *.htm,这是我在 index.jsp 中使用的。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"    
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.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>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</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>

调度程序-servlet.xml

<?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"
   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.2.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.2.xsd">

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

<context:component-scan base-package="net.mvp.spring3.controller" />

<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" />

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

</beans>

HelloWorldController.java

 package net.mvp.spring3.controller;

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

    @Controller
    public class HelloWorldController {

        @RequestMapping("hello")
        public ModelAndView helloWorld() {
            String message = "Hallo Asgard";
            return new ModelAndView("hello", "message", message);
        }
    }
4

3 回答 3

1

向 dispatcher-servlet.xml 添加一个新的 bean

<bean id="helloWorldController" 
    class="net.mvp.spring3.controller.HelloWorldController" />

用下面给出的代码用 id urlMapping 替换你的 bean

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

注意:无需更改@RequestMapping("hello")

于 2013-02-19T03:58:50.203 回答
0

您可以将 hello.htm 文件名更改为 hello2.jsp 或类似的东西吗?我的意思是,尝试使用与请求映射不同的名称。

@Controller
public class HelloWorldController {

    @RequestMapping("hello") // what the user calls for, the request
    public ModelAndView helloWorld() {
        String message = "Hallo Asgard";
        return new ModelAndView("hello2", "message", message); // the response
        //"hello" in ModelAndView is the same "hello" as the one in views.xml
    }
}

你好2.jsp

<html>
<body>${message}</body>
</html>
于 2013-02-19T07:49:22.527 回答
0

可能还有其他方法可以做到这一点,但这是我通过视图 bean 学到的。会发生以下情况:

  1. 用户单击具有特定名称的链接,即www.yoursite.com/hello
  2. spring 在 requestmappings 中寻找“ hello ”。
  3. 如果找到requestmapping,则执行相应的方法。
  4. 该方法返回一个 ModelAndView,其中包含一个 url(WEB-INF/jsp/hello.jsp) 的别名 ( hello ),该别名必须在与您的 jsp 文件位于同一位置的 views.xml 中定义。
  5. 最后,来自别名hello的 url(WEB-INF/jsp/hello.jsp) 的页面显示给用户。

views.xml 定义了不同 jsp 文件的 url 的别名。所以在那个文件中你说hello对应于WEB-INF/jsp/hello.jsp

它看起来是这样的:

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

<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
    <property name="order" value="1"/>
    <property name="location" value="/WEB-INF/views.xml"/>
</bean>

<!-- in views.xml -->

<beans xmlns="http://www.springframework.org/schema/beans"
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-2.5.xsd">

<bean id="hello" class="org.springframework.web.servlet.ModelAndView">
    <property name="hello" value="/WEB-INF/jsp/hello.jsp" />
</bean>

</beans>

控制器中的请求映射看起来是一样的:

@Controller
public class HelloWorldController {

    @RequestMapping("hello") // what the user calls for, the request
    public ModelAndView helloWorld() {
        String message = "Hallo Asgard";
        return new ModelAndView("hello", "message", message); // the response
        //"hello" in ModelAndView is the same "hello" as the one in views.xml
    }
}

我希望这可以帮助你。

于 2013-02-18T22:22:18.713 回答