Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring控制器中加载静态文件_Java_Spring Mvc - Fatal编程技术网

Java 在Spring控制器中加载静态文件

Java 在Spring控制器中加载静态文件,java,spring-mvc,Java,Spring Mvc,我对春天还很陌生,所以如果我没有看到明显的答案,我很抱歉 我用SpringMVC控制器建立了一个小的演示项目,并将其部署到AppEngine。在我的控制器中,我希望将静态文件的内容读入字符串。最好的方法是什么 我在谷歌上搜索了一下,但我可能搜索错了。我尝试了以下方法,但无效: @Controller @RequestMapping("/myController") public class MyController { @RequestMapping(value = "/test",

我对春天还很陌生,所以如果我没有看到明显的答案,我很抱歉

我用SpringMVC控制器建立了一个小的演示项目,并将其部署到AppEngine。在我的控制器中,我希望将静态文件的内容读入字符串。最好的方法是什么

我在谷歌上搜索了一下,但我可能搜索错了。我尝试了以下方法,但无效:

@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";
}