1.新建项目testAction
2.引入Struts2的包
3.编写 配置文件 struts.xml 如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="path" extends="struts-default" namespace="/path">
<action name="path">
<result name="success">/path.jsp</result>
</action>
</package>
</struts>
4.编写 path.jsp,index.jsp 页面,存放位置当前项目根目录下。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
Struts2 中路径问题是根据 action 路径而不是 jsp 路径来确定的,所以尽量不要使用相对路径。<br>
<a href="index.jsp">index.jsp</a><br>
虽然可以使用 redirect 方式解决,但是 redirect 并非必要<br>
解决办法很简单,统一使用<base>标签。
</body>
</html>
4.运行项目访问地址:http://localhost:8080/testAction/path/path.action
查看链接 index.jsp 链接内容如下:
http://localhost:8080/testAction/path/index.jsp
结果相当于我们访问【action时的路径】 + index.jsp:这个地址下我们肯定访问不到 index.jsp 页面
但是我们知道,我们要访问的 jsp 的路径,跟 Action 路径没有什么关系,然而【默认情况下,我们 Struts2 框架下的 jsp 路径就是 Action 的路径】,因此为了解决这个问题,我们就需要把这个默认路径给修改掉。
5.解决办法:使用 myEclipse 提供的 <base href="<%=basePath%>"> 标签。
其中basePath 来源如下:
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//request.getScheme():获取协议名称 http//request.getContextPath();// 获取的是应用的根目录,比如本应用在 tomcat 中的根目录为 /testAction
// request.getServerName():获取服务器名称就是 ip 地址 localhost
// request.getServerPort:获取端口名称 8080
// 综合起来就是:"http" + "://" + "localhost" + "8080" + "/testAction" + "/"
// 结果就是 http://localhost:8080/testAction/
// 也就是说 bashPath = http://localhost:8080/testAction/
%>
由上面分析可以知道 bashPath = http://localhost:8080/testAction/,当我们把它赋值给 html 页面的<base> 标签的时候,就代表了要用<base> 标签为页面上的所有链接规定默认地址或默认目标,意思就是为没有指定地址的链接默认添加上 base 标签的地址,对于<a href="index.jsp">index.jsp<a> 来说,在浏览器为我们执行了默认的填充之后我们所能够看到的链接的 url 地址是:http://localhost:8080/testAction/index.jsp ,这才是我们要的路径,jsp 修改后如下:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> </head> <body> Struts2 中路径问题是根据 action 路径而不是 jsp 路径来确定的,所以尽量不要使用相对路径。<br> <a href="index.jsp">index.jsp</a><br> 虽然可以使用 redirect 方式解决,但是 redirect 并非必要<br> 解决办法很简单,统一使用<base>标签。 </body> </html>
6.因此在 jsp 页面中,我们最好使用这种方式,这样如果我们要访问 Action,我们只需要把 Action 的 namespace + "/" + action 名称既可以,如果我们要访问 jsp 那么只需要把 jsp 相对于根目录的路径加入进来就行。