【发布时间】:2012-02-06 18:07:34
【问题描述】:
我对 Spring 缺乏经验,我现在需要做的就是访问并获取对 webapp 文件夹中文件和文件夹的引用。这是我的相关项目层次结构:
-src
--main
---java (marked as source root)
----my
-----package
------controller
-------Home.java
---webapp
----images
-----avatars
我在 Home.java 中的代码:
@Controller
@RequestMapping("/")
public class Home
{
@RequestMapping(method = RequestMethod.GET)
public String index(Model model,
HttpServletRequest request) throws Exception
{
String test1 = request.getSession().getServletContext().getRealPath("");
String test2 = request.getSession().getServletContext().getRealPath("/");
String test3 = request.getRealPath("");
String test4 = request.getRealPath("/");
String test5 = request.getSession().getServletContext().getRealPath(request.getServletPath());
return "index";
}
}
所有 5 个请求都返回 null。我是不是做错了什么?
web.xml:
<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">
<display-name>Test</display-name>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<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>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
</web-app>
我想要实现的(未在此示例中显示)是编写一个负责图像缩放的控制器。因此,我需要访问 src/main/webapp/_images 文件夹。
谢谢!
更新:简化了示例以便更好地理解。
Update2:感谢@gigadot 的建议,我将应用程序部署为爆炸WAR,问题得到部分解决。有人能告诉我将 WAR 部署为爆炸式有什么区别吗?不建议在生产服务器上执行此操作吗?优点/缺点?
我认为值得用一个例子来解释这种情况。假设我正在编写一个社交网络,我必须上传我的个人资料图片。这张图片将上传到src/main/webapp/_images/avatars/[myid].jpg 文件夹。
是否建议将图片上传到webapp 文件夹?还是有更好的解决方案?
我希望能够在访问 URL /images/[width]x[height]/[userid].jpg 时返回图像的缩放实例。
将 WAR 部署为爆炸并实现 ResourceLoaderAware(感谢 @KevinSchmidt),我可以使用它使其工作:
resourceLoader.getResource("file:" + request.getSession().getServletContext().getRealPath("/") + "_images/avatars/");
对我来说它看起来很脏,对于生产服务器来说这是个好主意吗?有没有更好的解决方案?
【问题讨论】:
-
我关心目录是否存在
-
你想对这些文件做什么,只是将它们返回给客户端,或者处理它的内容?
-
我已经尝试过您的代码并且它有效。你能告诉我们你是如何测试它的吗?您是使用 Maven 生成战争并将其放入 Tomcat 中还是直接从 Eclipse 中执行?
标签: java spring spring-mvc