Java 在Spring控制器中加载静态文件
我对春天还很陌生,所以如果我没有看到明显的答案,我很抱歉 我用SpringMVC控制器建立了一个小的演示项目,并将其部署到AppEngine。在我的控制器中,我希望将静态文件的内容读入字符串。最好的方法是什么 我在谷歌上搜索了一下,但我可能搜索错了。我尝试了以下方法,但无效:Java 在Spring控制器中加载静态文件,java,spring-mvc,Java,Spring Mvc,我对春天还很陌生,所以如果我没有看到明显的答案,我很抱歉 我用SpringMVC控制器建立了一个小的演示项目,并将其部署到AppEngine。在我的控制器中,我希望将静态文件的内容读入字符串。最好的方法是什么 我在谷歌上搜索了一下,但我可能搜索错了。我尝试了以下方法,但无效: @Controller @RequestMapping("/myController") public class MyController { @RequestMapping(value = "/test",
@Controller
@RequestMapping("/myController")
public class MyController {
@RequestMapping(value = "/test", method = RequestMethod.GET)
public @ResponseBody String myTest() {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
String content = "";
try {
fileReader = new FileReader("file:/WEB-INF/content/somecontent.txt");
bufferedReader = new BufferedReader(fileReader);
content = bufferedReader.readLine();
bufferedReader.close();
}
catch (Exception ignored) {
// ignore
}
return content;
}
}
任何朝着正确方向的努力都将受到高度赞赏:-)表示法“file:”和“classpath:”不适合FileReader。
我建议您创建一个文件系统资源
FileSystemResource resource = new FileSystemResource("/WEB-INF/content/somecontent.txt");
然后使用getFile()或getInputStream()读取文件。
这在web应用程序中非常有用,因为您可以使用相对路径。一般来说,Servlet容器,特别是GAE,不允许您从Servlet容器中这样使用文件API 相反,使用
ServletContext
自动连接控制器,并从中获取资源。另外,您的异常处理不是很好,您不应该忽略这样的异常,它们存在是有原因的
类似这样的东西应该可以:
@Controller
@RequestMapping("/myController")
public class MyController {
private @Autowired ServletContext servletContext;
@RequestMapping(value = "/test", method = RequestMethod.GET)
public @ResponseBody String myTest() throws IOException {
InputStream inputStream = null;
try {
inputStream = servletContext.getResourceAsStream("/WEB-INF/content/somecontent.txt");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
return bufferedReader.readLine();
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
}
或者,如果您使用的是Spring 3.x,这可能更简单:
<mvc:view-controller path="/test" view-name="/WEB-INF/content/somecontent.txt"/>
,但这可能意味着您可以避免任何代码。因为这是一个Spring应用程序,所以您可以依靠它的类来帮助实现这一点。特别是,org.springframework.web.context.support.ServletContextResource应该非常有用:
ServletContextResource resource = new ServletContextResource(servletContext,
"/WEB-INF/content/somecontent.txt");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(resource.getInputStream()));
是否确实需要通过
读取器
读取文件内容并将其作为字符串
返回来引入编码转换
如果否(即,如果您希望按原样提供文件),您可以使用请求转发:
@RequestMapping(value = "/test", method = RequestMethod.GET)
public View myTest() {
return new InternalResourceView("/WEB-INF/content/somecontent.txt");
}
甚至(如果您有InternalViewResolver
):
如果是,请注意在读取文件时并没有指定编码,所以使用系统默认编码,并且应用程序的行为取决于系统。Hell。。。果然,在问了这个问题一秒钟后,我就开始工作了。。。FileReader中的正确路径应该是“WEB-INF/content/somecontent.txt”。我暂时不提这个问题,因为我觉得这不是最优雅的方式;您也可以直接从
ServletContext
获取它。太棒了,这很管用。谢谢关于异常处理:100%同意,我只是尽量简短,因为它不是必需的;-)如果我在服务
层中这样做,是否仍然是合法的和最佳做法D
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String myTest() {
return "forward:/WEB-INF/content/somecontent.txt";
}