struts路径问题

问题:使用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两种情况

不要做一个似懂非懂的人,做一个脚踏实地的程序员
原文地址:https://www.cnblogs.com/xuexiaohei/p/4448849.html