我是Spring的新手,如果我在这里看不到明显的答案,那么道歉.
我使用Spring MVC控制器设置了一个小型演示项目,并将其部署到App Engine.在我的控制器中,我想将静态文件的内容读入String.这样做的最佳方法是什么?
我google了一下,但我可能正在寻找错误的东西.我尝试了以下,但它不起作用:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
任何向正确的方向推进都将受到高度赞赏:-)
ska*_*man 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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用的是Spring 3.x,这可能更简单:
<mvc:view-controller path="/test" view-name="/WEB-INF/content/somecontent.txt"/>
Run Code Online (Sandbox Code Playgroud)
请参阅文档了解其功能,但这可能意味着您可以避免使用任何代码.
FileReader的表示法"file:"和"classpath:"不正确.我建议你创建一个FileSystemResource
FileSystemResource resource = new FileSystemResource("/WEB-INF/content/somecontent.txt");
Run Code Online (Sandbox Code Playgroud)
然后使用getFile()或getInputStream()来读取文件.这在Web应用程序中非常有用,因为您可以使用相对路径.
您确定需要通过读取文件内容Reader并将其返回时引入编码转换String吗?
如果不是(即如果您要按原样提供文件),则可以使用请求转发:
@RequestMapping(value = "/test", method = RequestMethod.GET)
public View myTest() {
return new InternalResourceView("/WEB-INF/content/somecontent.txt");
}
Run Code Online (Sandbox Code Playgroud)
甚至(如果有的话InternalViewResolver):
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String myTest() {
return "forward:/WEB-INF/content/somecontent.txt";
}
Run Code Online (Sandbox Code Playgroud)
如果是,请注意在读取文件时未指定编码,因此使用系统默认编码,并且应用程序的行为与系统有关.
| 归档时间: |
|
| 查看次数: |
28700 次 |
| 最近记录: |