我对Spring很陌生,如果我在这里看不到明显的答案,请道歉。
我使用Spring MVC控制器设置了一个小型演示项目,并将其部署到App Engine。在我的控制器中,我想将静态文件的内容读入String。这样做的最佳方式是什么?
我搜索了一下,但我可能正在寻找错误的东西。我尝试了以下,但它不起作用:@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;
}
}
任何向正确方向的推动都将受到高度赞赏: - )
答案 0 :(得分:15)
一般来说,Servlet容器,特别是GAE,不允许您在servlet容器中使用File 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"/>
See docs for what this does,但这可能意味着您可以避免任何代码。
答案 1 :(得分:9)
使用FileReader,表示法“file:”和“classpath:”不正确。 我建议你创建一个FileSystemResource
FileSystemResource resource = new FileSystemResource("/WEB-INF/content/somecontent.txt");
然后使用getFile()或getInputStream()来读取文件。 这在Web应用程序中非常有用,因为您可以使用相对路径。
答案 2 :(得分:6)
您确定需要通过Reader
阅读文件内容并将其作为String
返回来引入编码转换吗?
如果不是(即如果您要按原样提供文件),则可以使用请求转发:
@RequestMapping(value = "/test", method = RequestMethod.GET)
public View myTest() {
return new InternalResourceView("/WEB-INF/content/somecontent.txt");
}
或甚至(如果您有InternalViewResolver
):
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String myTest() {
return "forward:/WEB-INF/content/somecontent.txt";
}
如果是,请注意您在读取文件时未指定编码,因此使用系统默认编码,并且应用程序的行为取决于系统。
答案 3 :(得分:1)
由于这是一个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()));