问题:使用struts2,如何处理action的路径?还有,在action转到的jsp中,如何写js,css,图
片的路径?(例如访问 http://localhost/myproject/my/listUser.action后转到http://localhost/project/user /listUser.jsp,这时候浏览器还是停留在http://localhost/project/my/addUser.action。这时候jsp原来的图片定位(因为我们在listUser.jsp中引用的图片等是相对于该jsp路径的,但当前浏览器确是http://localhost/project/my/addUser.action,所以就都出错了)
而解决jsp的路径问题,我觉得以下方式就基本完美了:
<base>为页面上所有相对 URL 规定基准 URL:
第一步:在jsp的head中添加base标签和一段java
<%
String path = request.getContextPath();//对应就是myproject,即我的web工程名
String basePath = request.getScheme()(协议http) + "://"
+ request.getServerName()(服务器所在ip) + ":" + request.getServerPort()(服务器所在端口)
+ path + "/";
%>
<base href="<%=basePath%>">(这样所有的href标签引用的文件就会自动补上basePath。例如我在1.jsp文件中写了上面的代码,然后我想引用<a href=”2.jsp”(2.jsp在http://localhost/myproject)下,那么我不用写前面的这些,只需要2.jsp就可以了,实际上变成http://localhost/myproject/2.jsp)
这样就变成 绝对路径.
也就是说,需要写从项目根目录算起的绝对路径,但去掉开头的"/"
第二步:所有action跳转,form提交写的action路径,都不要带目录位置。只写action名,例如addUser.action。
这样,浏览器就一直停留在http://localhost/project/XXXXX.action 这一层。
第三步:配置文件的action的url写成/XXXX,比如上面的就写成<action url=”/addUser”>
另外,我发现另外一个更自然的办法,可以使得原来用相对路径定位的jsp继续可用,不必逐个修改链接:
第一步:在jsp的head中同样添加base,但把getContextPath改为getRequestURL
<%
StringBuffer basePath = request.getRequestURL()
%>
<base href="<%=basePath%>">
注意是request.getRequestURL,这样获取出来的正好就是jsp的绝对路径。
比如我的struct配置文件中
<action path=”/my/listUser”(写成相对于根目录的路径) type=”hello.HelloAction” name=”HelloForm” scope=”request” validate=”true”>
<forward name=”SayHello”path=” /user/listUser.jsp”(这个路径写成相对于工程根目录,如myproject/user/listUser.jsp写成/user/listUser.jsp>
例如浏览器地址栏是:http://localhost:8084/myproject/my/listUser.action
base是<base href="http://localhost:8084/myproject/user/listUser.jsp">
如果我们在listUser.jsp中引用一个图片1.jpg,该图片在user目录中。那么我们可以这样写<img src=../1.jpg>路径就变成http://localhost:8084/myproject/user/1.jpg
第二步:jsp页面内,全部使用相对路径访问。
第三步,action的路径写成../或者其他相对路径都可以,但要和配置文件的路径吻合。
这个方法,可以兼容使用action和不使用action两种情况