一:URL经过Struts找到jsp的流程
上一个示例的URL是http://127.0.0.1:8080/Struts2Project01/myAction01,以它为例:
1. “127.0.0.1:8080/” 会找到Tomcat下web应用的根目录
2. “Struts2Project01” 是tomcat的项目,既然是tomcat的项目 就会先检查其中的web.xml文件
3. web.xml中存在我们设置的过滤器,所以会首先执行过滤器(在配置Servlet之前),这个Struts2的<filter>会去找项目中的struts.xml
4.struts.xml中此<package>的namespace=“/” ,所以“Struts2Project01/XXXXX.action ”的XXXXX,归这个包所解析,
5.“myAction01” 在这个<package>中找对应的 <action>名称,我们正好配置过了这个名称要去执行class中的action,
(这儿如果在包里找不到,还会去找namespace=“”,也就是所有命名空间都可调用的action。再找不到就只能告诉taomcat找不到所需了)
6.我们自定义包中的action执行后,返回“success”
7.<result>校验得到成功信息,所以跳转到指定的jsp,显示内容
web.xml文件如下:(过滤器)
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml如下:(namespace、action、result)
<package name="ma1" namespace="/" extends="struts-default">
<action name="myAction01" class="com.rt.struts2.actionDemo.MyAction_01"><!-- 包.类名称 -->
<result >
/helloStruts2.jsp
</result>
</action>
</package>
二:跳转时的路径
添加一个获得basePath的scriptlet
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
还可以在<head>标签中加一个<base>标签
<head>
<base href="<%=basePath%>"/>
</head>
这样跳转的时候就可以根据绝对路径跳转,而不是当前页的相对地址
<a href="forwardPath/forwarded.jsp"> head中带“base:标签的跳转 (路径前自动补齐base)</a><br>
<a href="<%=basePath%>forwardPath/forwarded.jsp"> 使用scriptlet变量"basePath"的跳转 </a>