当前位置: 首页 > 知识库问答 >
问题:

为什么在WEB-INF文件夹中的jsp文件可以工作,而放在WEB-INF下的文件夹下的jsp文件就不行了?

施超
2023-03-14

我在web.xml中更改了welcome-list标记中的路径,如下所示

<welcome-file-list>
       <welcome-file>/JSP/fileName.jsp</welcome-file>
</welcome-file-list>

我还更改了dispatcher-servlet.xml,如下所示

   <bean id="jspViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" /> 

但还是没用。用于上述大小写的Url是

 localhost:8080/ContextRoot/jsp/
 localhost:8080/ContextRoot/jsp/fileName.jsp
 localhost:8080/ContextRoot/jsp/fileName 

而且它对上面的任何URL都不起作用。

但它起作用的时候

 <welcome-file-list>
       <welcome-file>/fileName.jsp</welcome-file>
</welcome-file-list>
<bean id="jspViewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/"
      p:suffix=".jsp" /> 

我使用TomcatV7.0服务器。我在Eclipse IDE中刷新我的项目,然后清理它,构建它,使用mvn clean install构建war,然后从tomcat manager主页中选择war,并部署它。我每次都这样。

这就是diapatcher-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:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd     
                    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">

    <mvc:annotation-driven/>

    <context:component-scan base-package="com.projectName.www" />

    <!-- Factory bean that creates the Mongo instance -->
    <bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
        <property name="host" value="localhost" />
    </bean>

    <!-- MongoTemplate for connecting and quering the documents in the database -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongo" ref="mongo" />
        <constructor-arg name="databaseName" value="tableName" />
    </bean>

    <!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />



    <bean id="jspViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" /> 

  <!--   <bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>

    <bean class=
    "org.springframework.web.servlet.view.tiles2.TilesConfigurer"> -->
 <!--  <property name="definitions">
    <list>
      <value>/WEB-INF/views/views.xml</value>
    </list>
  </property> 
</bean> -->




</beans>

这就是我的web.xml的样子

<web-app>

<!--   <display-name>Archetype Created Web Application</display-name> -->

   <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/src/main/webapp/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>-->
        <load-on-startup>1</load-on-startup>
    </servlet>

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

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </context-param> 

   <!--  <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> -->

    <welcome-file-list>
       <welcome-file>/fileName.jsp</welcome-file>
    </welcome-file-list> 


</web-app>

共有1个答案

萧焱
2023-03-14

我认为这里有几个问题:

  1. 您对spring MVC的路径感到困惑
  2. 您没有正确配置web xml

不幸的是,我不能为您介绍每一个细节,很多spring都是可配置的,所以我的解释只会介绍最基本的场景。如果有人发现一个错误,请告诉我,我会纠正它。

    null

在您的示例中,您请求的是localhost:8080/contextroot/jsp/filename,因此看起来'ctxroot'是上下文根,servlet的路径是'/',因此它应该将后面的内容传递给控制器。当DispatcherServlet接收到请求时,它正在搜索一个将'jsp'作为路径处理的控制器。由于您没有资源路径,它决定将其视为资源路径。它使用了视图解析器并形成了路径/web-inf/jsp/jsp/filename.jsp,这个路径显然不存在。

假设您请求了localhost:8080/contextroot/filename,请求将到达DispatcherServlet,它将找不到将'file name'作为路径处理的控制器,因此将其作为资源处理。它将形成路径/web-inf/jsp/filename.jsp,并返回结果。

但是,您的web xml没有配置为初始化Spring。因此您的web应用程序实际上是在处理您的每一个请求,就像它们是针对与web应用程序根相关的资源一样。我相信,如果您在正确初始化Spring的情况下发出该请求,它可能会起作用。

下面是一个很好的例子来说明如何做到这一点:

http://www.mkyong.com/spring3/spring-3-mvc-hello-world-example/

注意,他的web xml有一个ContextLoaderListener,在您的xml中被注释掉了,这对于在web应用程序中初始化spring是必不可少的。我还看到dispatcher中带有/src/main/resources路径的注释,但是web xml中的所有路径都应该是相对于web应用程序根的。在运行时,web服务器对您的项目一无所知,'src'不是您的web应用程序根目录中的一个目录。还需要注意的是,对于MVC素材,您可以有一个不同于主spring上下文的应用程序上下文,这是很常见的。

>

  • 将jsp移动到/web-inf/jsp/filename.jsp
  • 更新应用程序上下文,使“/web-inf/jsp/”为前缀,“.jsp”为后缀。
  • 将上下文加载器侦听器添加到web xml中,并设置相对于应用程序上下文根的contextConfigLocation路径。例如,它可以是/web-inf/appcontext.xml
  • 请求

    localhost:8080/ctxtroot/filename

    此外,您一直在谈论welcome-file(欢迎文件),但却给出了资源的完整路径。welcome文件只有在用户向目录的根目录发出请求时才起作用,如下所示:

    localhost:8080/CtxtRoot/
    

  •  类似资料:
    • 问题内容: 当我的jsp文件位于WEB-INF文件夹(如/WEB-INF/file.jsp)中时,我可以从本地主机访问它们:8080 / ProjectCtxtRoot /,但是如果将它们放在/ WEB-中,则无法访问它们。 INF / jsp / file.jsp? 我更改了web.xml中的welcome-list标记中的路径,如下所示 我还更改了dispatcher-servlet.xml,

    • 如何将本地存储文件夹中的JSP文件包含在WEB-INF下? 我在config.properties定义了绝对路径${externalFolder}到包含外部jsp文件的文件夹,控制器映射到 /page和jsp页面page.jsp在WEB-INF/jsp/目录中。 在此文件页面中。我想调用的jsp: WEB-INF/jsp/page。jsp 谢谢你的帮助。

    • 我刚刚开始使用JSP,遇到了一个问题。 据我所知,WEB-INF下的JSP页面可以通过浏览器在localhost中使用URL进行访问: 但是,如果我在WEB-INF文件夹(即'MyFolder')中创建另一个子文件夹,并尝试通过URL访问相同的JSP页面: 它给出了一个错误404。JSP文件导航系统与HTML文件导航系统有区别吗? 编辑:我正在使用servlet来显示我的JSP页面: EDIT2:

    • 问题内容: 我的App Engine项目的war / WEB-INF文件夹中有一个文件。我在FAQ中读到,您可以在servlet上下文中从那里读取文件。我不知道如何形成资源的路径: 我将如何构造到该资源的路径以与File()一起使用,就像上面一样? 问题答案: 有两种方法可以做到这一点。只要扩展WAR文件(一组文件而不是一个.war文件),就可以使用以下API: http://tomcat.apa

    • 问题内容: 我正在使用Eclipse,我需要能够将Java库(JAR文件)添加到Web应用程序的文件夹中。我该如何实现? 问题答案: 将jar文件添加到您的WEB-INF / lib文件夹中。 在Eclipse中右键单击您的项目,然后转到“构建路径>配置构建路径” 添加“ Web应用程序库”库 这将确保所有WEB-INF / lib jar都包含在类路径中。

    • > “在”webinf“标记中包括name=”${war.dir}/groupquoteui.properties“,但它不起作用。 标记中还包含=“${war.dir}/groupquoteui.properties”。 还有这个在“webinf”文件夹里: 那么我应该做些什么来将这个文件包含到WAR的WEB-INF目录中。包括所有其他目录和web.xml文件。