对于使用了 struts2 的 convention 插件进行开发时,我们知道可以通过以下的配置项来约定所有的 Result 视图的路径:
<constant name="struts.convention.result.path" value="/WEB-INF/content/"/>
上面的value就是 convention 插件 中的默认值,当然,我们可以改成任意我们想要的值。
这样的话,当我们声明以下的@Result时:
@Result(name = "success", location = "my-upload.jsp")
系统就会试着去访问如下的文件:
/WEB-INF/content/my-upload.jsp
如果存在,那就OK,不然就会报404的错误。
对于result path,我也可以使用@ResultPath进行个别定制,如:
@Results(@Result(name = "success", location = "my-upload.jsp"))
@ResultPath("/jsp")
public class File2Action {
public String upload() {
System.out.println("uploading files...");
return "success";
}
}
这样一来,虽然“struts.convention.result.path”的值为“/WEB-INF/content/”,但是我们这边使用了@ResultPath 注解对其进行了覆盖,所以,这边实际访问的页面为:
/jsp/my-upload.jsp
PS:以上的结果,均以“Action”的namespace为“/” 为前提,即url应该以如下这种情况的:
http://xxx.xxx.xxx.xxx:port/web工程名/file2!upload
对于action的namespace怎么设定,大家查看一下官网说明:http://struts.apache.org/docs/convention-plugin.html#ConventionPlugin-Codebehindhelloworld
不过,有一点,我们需要特别注意:
上面的
location = "my-upload.jsp"
中,“my-upload.jsp” 没有以 “/” 开头,所以,也就是说它是一个相对路径,这样,它才会基于@ResultPath中的路径去找相应的文件。
如果,我们将其修改成如下:
location = "/my-upload.jsp"
即,让“my-upload.jsp”以"/"开头,这时候,它就是一个绝对路径,这个时候,它不是会基于@ResultPath中的路径去搜索相关的文件的,而是直接基于web工程的根路径去搜索相关文件。
也就是说,假设你的web工程的名字就 test,那么此时它访问的页面为:
http://xxx.xxx.xxx.xxx:port/test/my-upload.jsp