Struts2中路径问题是一个棘手的问题,初学时经常被路径问题搞得很烦,通过网上查找资料和自己实战中遇到的问题今天来对Struts2中的路径问题来一个总结,当然可能不会很完整,不过后续会进行补充:
1. Struts2 一个要匹配路径的地方就是在处理完请求之后对页面进行分发的时候,也就是 result 元素里面的内容。
假设项目名为Struts2
在地址栏中访问action时URL基本是以 http://localhost:8080/Struts 开头
比如<action name="home" class="test.HomeAction" namespace="/">
< result name="success">要访问的jsp页面/result>
</action>
这里有两种方式来写要访问的jsp页面,一种加“/”,另一种是不加“/”。
1)jsp页面写成/Pages/path.jsp,那么就会从项目的根路径中开始找也就是,也就是Struts所在的根目录,在一层一层的下去找。
2)jsp页面写成Pages/path.jsp,那么就会从当前路径开始找(注意当前路径是指当前访问者请求的目录),在这个例子中的我们是通过请求action,进而间接访问到jsp文件的,所以当前路径应该就是action所在的路径,在本例中也就是http://localhost:8080/Struts,从这里可以看到当前路径就是根路径,所以两种方式都可以访问到jsp页面,如果当前路径不是根路径那么情况就不同了。
总结:为了不出错,建议加上“/”。
2. 在页面中涉及到匹配路径的问题,在这里我们要弄清楚一个小知识点:在jsp页面中“/”指的是整个站点根路径也就是这里的“http://localhost:8080/”,而不是webapps所在的根路径。
在页面中涉及到的路径问题,看似很复杂,但是解决起来很简单。就是统一用绝对路径,
在jsp文件中可以这样写来统一路径:
<%
String contextPath=request.getContextPath();
String basePath=requset.getScheme()+"://"+requset.getServerName()+":"+
request.getServerPort()+path+"/";
%>
在<head></head>中写成这样
<base herf="<%=basePath>">
这说明在该页面中的所有路径都是于项目的WebRoot为相对路径,如项目的WebRoot下的Images/xxx.jpg ,在页面中就直接这样访问。
在页面中的路径问题看似很复杂,但是解决起来相当的简单。
注意:路径最后有“/”。
比如
在地址栏中输入http://localhost:8080/Struts2/path/path.action访问到了my.jsp
在my.jsp的页面中有这样的一个链接:< a href="index.jsp">并且两者在同一个目录下,按道理说直接点就可以访问的,但是事实上访问不到,地址栏中变成
http://localhost:8080/Struts2/path/index.jsp,为什么为变成这样呢?因为:在my.jsp页面里它不会去看jsp的真正路径在哪里,它只会去看这个jsp映射到我们的服务器的URL地址。
所以访问就不成功。
总之,用了struts2来实现跳转的话想对的就是地址栏中action的访问地址,是以这个地址为标准的。这里强调一下
- <base href=”<%=basePath%>”/>
<base href=”<%=basePath%>”/>
这个意思是指这个jsp页面里所有的<a href=“”/>连接都会在前面加上basePath,不仅仅是这对于<head></head>中的:
- <link rel="stylesheet" href="style/css/index.css" type="text/css"
- media="screen" charset="utf-8" />
- <script src="style/js/jquery.js" type="text/javascript"></script>
<link rel="stylesheet" href="style/css/index.css" type="text/css" media="screen" charset="utf-8" /> <script src="style/js/jquery.js" type="text/javascript"></script>
也是起作用的。
我在网上看到有个使用这样解决的,这里也记录一下:
- 结构:
- WebRoot
- |
- common
- |
- css
- |
- common.css
- |js
- |common.js
- <link rel="stylesheet" type="text/css"
- href="<c:url value=‘/common/css/common.css‘ />" />
- <script language="javascript" type="text/javascript"
- src="<c:url value=‘/common/js/common.js‘/>"></script>
- 然后在jsp 页面中用<c:url>的方式导入css 就永远没有存在跳转后css 无效了,同理js 也一样