3

当 exjs 尝试加载我的控制器或我的图像时,我在使用 spring mvc 3 和 extjs 4 或更准确地说是路径问题时遇到问题。

我的 webapp 的结构是这样的:

src
-- webapp
   -- app
   -- extjs4.1.3
   -- css
   -- icons
   -- WEB-INF
      -- jsp
   app.js

我有一个这样注释的控制器

@RequestMapping(value = "/path/init.do", method = RequestMethod.GET)

它返回与我的 WEB-INF/jsp 文件夹中的 jsp 匹配的视图名称。这个jsp加载extjs文件。

视图解析器:

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

网页.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<display-name>tiana Web Application</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/application-context.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

</web-app>

因为我的 url 模式是“/”,所以我不得不使用自 spring 3.0.5(大约)以来可用的 mvc:resources 魔术标签,如下所示:

<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/app/**" location="/app/" />
<mvc:resources mapping="/extjs-4.1.3/**" location="/extjs-4.1.3/" />
<mvc:resources mapping="/app.js" location="/app.js" />

我知道如果我将所有这些东西放在资源文件夹中会更好。我只需要写:

<mvc:resources mapping="/resources/**" location="/resources/" />

但我不认为它会解决我的问题

我的jsp文件是这样的:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>My jsp title</title>
    <link rel="stylesheet" type="text/css" href='<c:url value="/extjs-4.1.3/resources/css/ext-all.css" />'>

    <link rel="stylesheet" type="text/css" href='<c:url value="/css/myStyle.css" />'>
    <script type="text/javascript" src='<c:url value="/extjs-4.1.3/ext-all-debug.js" />'></script>
    <script type="text/javascript" src="<c:url value="/app.js" />"></script>
   </head>
   <body></body>
   </html>

首先,我必须使用 jstl 标签编写对资源文件的引用。没有这些标签,如果我保留像 /myresource.xxx 这样的 url,则 url 将是

localhost:8080/myresource.xxx

如果我写 myresource.xxx 没有斜线,它是

localhost:8080/mywebapp/path/myresource.xxx

但它的工作原理是这样的,任何建议都可以跳过 jstl 依赖项,但它可以工作。

我真正的问题是我的 app.js 将加载 extjs 的控制器,为此它使用某种“window.location”来构造 url。就我而言,它将是

localhost:8080/mywebapp/path/app/controller/myController.js

但我希望它是

localhost:8080/mywebapp/app/controller/myController.js

如果我在我的 extjs 文件中放一个图标,我会遇到同样的问题,网址将是

localhost:8080/mywebapp/path/icons/myIcon.png

并不是

localhost:8080/mywebapp/icons/myIcon.png as expected.

我可以通过添加来解决这个问题

<mvc:resources mapping="/path/app/**" location="/app" />
<mvc:resources mapping="/path/icons/**" location="/icons" />

但我可以相信,每次我在 Spring mvc 控制器中定义一个新的 requestMapping 时,例如“path2”,我都必须定义一个相应的 mvc:resources 映射。

我试图在我的 jsp 文件中定义一个全局“baseUrl”javascript 变量,在 app.js 文件中用这个变量作为 appFolder 的前缀,并用这个变量作为 extjs 代码中使用的所有图标和东西的前缀,但这也不可接受。

我错过了什么?我用谷歌搜索了很多,我找到了这个“/” url-pattern 和 mvc:resources 方法(这对于 spring mvc webapp 来说似乎很干净)但我无法解决我的“uri”问题(我不知道路径是如何生成的requestMapping 以真正的英文调用)。

如果你能帮助我,非常感谢,如果不能,谢谢你的时间

4

1 回答 1

0

您可以尝试将所有资源(我不确定您的哪些内容是静态资源)放入:

-- webapp
   --resources
      -- app
      -- extjs4.1.3
      -- css
      -- icons
   -- WEB-INF
   -- jsp
   app.js

然后定义一个映射:

 <mvc:resources mapping="/resources/**" location="/resources/" />

此时,您将访问 css 文件夹,例如使用:

 <c:url value="/resources/css/myStyle.css" />

以及您的任何其他路径以相同的方式,或者您可以尝试使用(但未经测试):

 <mvc:resources mapping="/**" location="/resources/" />

我想你会访问你的css文件夹:

 <c:url value="/css/myStyle.css" />
于 2013-03-21T13:06:58.917 回答