0

在下面的程序中,如果我将 dispatcher-servlet.xml 和 index.jsp 中的“/home.htm”替换为“/home.jsp”,那么服务器将找不到 home.jsp。以“.jsp”结尾的字符串作为 bean 名称是否无效?

调度程序-servlet.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean name="/home.htm" class="com.sample.HomePageController" />

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

</beans>

索引.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Dynamic Tiles</title>
  </head>
  <body>
    <form action="/home.htm" method="post">
        Please enter your name:&nbsp;
        <input type="text" name="visitorName" />
        <input type="submit" value="Go"/>
    </form>
  </body>
</html>

主页控制器.java

package com.sample;

import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class HomePageController  extends AbstractController {

    private static Logger logger = Logger.getLogger(HomePageController.class);

    HomePageController () {
        logger.info("Constructing HomePageController object");
    };

    public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.info("Handling request for home.jsp");

        return new ModelAndView("home", "visitorName", request.getParameter("visitorName"));
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_2_5.xsd"
           version="2.5">

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

</web-app>
4

2 回答 2

1

您的应用程序有几个部分需要修改才能按预期工作。第一部分是 web.xml 中的 Dispatcher Servlet 映射。在 Spring 中,调度程序用于将特定请求从客户端路由到应用程序中的 Spring 控制器。通过调度程序路由的请求由 web.xml 文件中为 servlet 指定的 url-pattern 确定:org.springframework.web.servlet.DispatcherServlet。

在您的情况下,我们希望将 url-pattern 设置为与访问您的 jsp 文件不冲突的内容。由于您在 Spring 配置中指定了一个 viewResolver,它以 /WEB-INF/jsp/ 作为通用名称的前缀并以 .jsp 为后缀,因此我们必须使用 .jsp 以外的 url-pattern。

如果使用 .jsp url 模式,则请求将首先由调度程序 servlet 处理并路由到任何映射的控制器。如果控制器尝试使用视图名称导航到另一个页面,例如主页,则视图名称会带有前缀/后缀,从而产生一个 url:/WEB-INF/jsp/home.jsp。这个构造的 URL 与为调度程序指定的 .jsp url 模式匹配,并尝试路由 /WEB-INF/jsp/home.jsp,很可能失败,因为没有找到映射。

为了解决这个问题,我们如下设置您的 web.xml:

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.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>*.do</url-pattern>
    </servlet-mapping>
</web-app>

如您所见,我们将调度程序映射到 url-pattern *.do。这允许调度程序用于路由请求而不会干扰公共文件前缀。将 url-pattern 更改为 *.do 需要我们更改表单上的操作。我将您的表格修改为以下内容:

索引.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>Dynamic Tiles</title>
</head>
<body>
    <form action="home.do" method="post">
        Please enter your name:&nbsp; <input type="text" name="visitorName" />
        <input type="submit" value="Go" />
    </form>
</body>
</html>

我还假设您的所有 .jsp 文件都位于 WEB-INF 目录中。这要求我们使用控制器来访问这些 .jsp 文件中的每一个。必须在调度程序的 Spring 配置文件中创建到控制器的映射,并且必须为 index.jsp 创建适当的控制器。请注意,我使用 .do 后缀作为映射。

调度程序-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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="handlerMapping"
        class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    <bean name="/home.do" class="com.sample.HomePageController" />
    <bean name="/index.do" class="com.sample.IndexPageController" />

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

索引页面控制器.java

package com.sample;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class IndexPageController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        return new ModelAndView("index");
    }
}

为了彻底起见,我创建了一个 home.jsp 文件来测试应用程序,因为没有提供它。这是我的 home.jsp 文件:

主页.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <title>Home</title>
</head>
<body>
<h1>
    Hello, ${visitorName}  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>
于 2012-08-25T09:36:40.633 回答
0

您决定dispatcher只处理.htm-ended url,但您希望它处理.jsp-ended url。为了让后者工作,只需将url-pattern元素的内容更改web.xml为,例如,如下所示:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>
于 2012-08-26T07:18:58.967 回答