Java 为什么WEB-INF文件夹中的jsp文件有效,但放在WEB-INF文件夹下的jsp文件无效';T

Java 为什么WEB-INF文件夹中的jsp文件有效,但放在WEB-INF文件夹下的jsp文件无效';T,java,spring,jsp,spring-mvc,web,Java,Spring,Jsp,Spring Mvc,Web,当我的jsp文件位于WEB-INF文件夹(如/WEB-INF/file.jsp)中时,我可以从localhost:8080/ProjectCtxtRoot/访问它们,但如果它们位于/WEB-INF/jsp/file.jsp中,我就无法访问它们 我在web.xml中更改了欢迎列表标记中的路径,如下所示 <welcome-file-list> <welcome-file>/JSP/fileName.jsp</welcome-file> </we

当我的jsp文件位于WEB-INF文件夹(如/WEB-INF/file.jsp)中时,我可以从localhost:8080/ProjectCtxtRoot/访问它们,但如果它们位于/WEB-INF/jsp/file.jsp中,我就无法访问它们

我在web.xml中更改了欢迎列表标记中的路径,如下所示

<welcome-file-list>
       <welcome-file>/JSP/fileName.jsp</welcome-file>
</welcome-file-list>
   <bean id="jspViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" /> 
<bean id="jspViewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/"
      p:suffix=".jsp" /> 
而且它不适用于上述任何URL

但它在工作的时候

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

/fileName.jsp
dispatcher-servlet.xml,如下所示

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

用于上述情况的Url是localhost:8080/ContextRoot/并且可以正常工作

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

这就是dipatcher-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>

调度员
org.springframework.web.servlet.DispatcherServlet
1.
调度员
/
上下文配置位置
/WEB-INF/dispatcher-servlet.xml
/fileName.jsp
嗯。当我将整个jsp文件夹从/webapp/WEB-INF/jsp/fileName.jsp移到/webapp/jsp/fileName.jsp时,它就可以工作了。我想知道 1.为什么它现在有效? 2.这是正确的做事方式吗?
3.当url为localhost:8080/CtxtRoot/jsp/或localhost:8080/CtxtRoot/jsp/search.jsp时,它起作用,但对localhost:8080/AnnaUnivResults/jsp/search不起作用。为什么会这样?

WEB-INF之外的所有内容都是公开的,没有对其应用身份验证(我们可以通过在WEB.xml中定义scurity约束来应用),但WEB-INF内部的所有资源都是安全的。您可以在WEB-INF外部保留静态页面,也可以在WEB-INF内部保留动态页面,如配置文件、帐户。
请交叉核对我可能错了。

我认为这里有几个问题:

  • 您对SpringMVC的路径感到困惑
  • 您没有正确配置web xml
  • 不幸的是,我不能为您介绍每一个细节,很多spring都是可配置的,所以我的解释只涉及最基本的场景。如果有人发现错误,请告诉我,我会改正的

    对于路径,一步一步地思考可能会有所帮助

  • 如果您从浏览器请求url,浏览器将查看协议、主机和端口,并使用DNS查找要连接的适当IP地址
  • 浏览器和主机之间已建立连接。主机查找在您指定的端口上运行的进程,如果任何安全系统都允许TCP连接,则请求流式传输到该端口上运行的进程,即web服务器
  • web服务器根据端口后面的内容做出决策,特别是通过查看给定的路径来确定web应用程序上下文。一旦确定了应用程序上下文根,它就知道哪个web应用程序应该处理该请求。决定取决于您如何配置web服务器,您可以让web应用程序处理没有上下文根或特定上下文根的请求。例如,如果您请求
    localhost:8080/CtxtRoot/jsp/
    ,那么服务器上可以有一个上下文根为“CtxtRoot”的web应用程序,它将处理该请求。或者,您可以有一个应用程序,该应用程序的上下文为“”,并且它可以处理该请求。这取决于您如何配置服务器,默认情况下,Tomcat将使用war名称作为上下文根
  • web应用程序接收请求。虽然它知道请求的完整URL,但它只根据上下文根之后的所有内容做出决定。因此,例如,对于对
    localhost:8080/CtxtRoot/jsp/
    的请求,web应用程序将基于“jsp”作为路径来路由内容
  • web应用程序有一个过滤器链,它首先将请求提交给该过滤器链。如果筛选器的模式与请求匹配,则该筛选器可以评估请求。它可能会阻止请求、处理请求或传递请求。我不会多说,因为你的问题不涉及过滤器
  • web应用程序查找模式与请求匹配的资源,它首先考虑servlet,然后考虑静态资源。上下文后面的url部分是它试图匹配的部分,因此如果请求是针对
    localhost:8080/CtxtRoot/jsp/
    ,而上下文根是“CtxtRoot”,那么web应用程序会将“/jsp/”与所有servlet映射进行比较。对WEB-INF中静态资源的请求将始终被拒绝,但servlet和过滤器可以并且确实从WEB-INF返回数据
  • 我将继续假设请求被发送到spring DispatcherServlet,它接收请求,并考虑servlet路径之后的所有内容。Spring的DispatcherServlet查找路径与servlet路径后的路径匹配的控制器。servlet路径基本上就是您在web xml中放入servlet映射的路径。让我举一个例子,假设您有一个web应用程序,其上下文为“app”,它有一个spring MVC servlet,其servlet映射为“/MVC”,以及一个处理路径“sales”的控制器,那么您可以使用
    http://localhost:8080/app/mvc/sales
  • 如果DispatcherServlet找不到控制器,我相信它会将传入的请求视为控制器返回的请求,因此如果子路径为“sales”,则它会将其作为参数传递给视图解析器。如果找不到,则服务器返回一个未找到的错误
  • 通常,控制器在完成时返回一个字符串,该字符串是指向reso的路径