粗浅理解:
1)绝对路径:带有访问协议的路径,就是带上http访问协议
2)相对路径:
①以带斜杠开头的相对路径:
A)前台相对路径:以web服务器的根路径为参照路径,比如在jsp、HTML中写的路径,这些页面都是由浏览 器进行解析的。例:http://127.0.0.1:8080/
B)后台相对路径:以web应用的路径为参照路径,比如在xml、java文件中写的路径,这些页面都是由服务器 进行解析的。例:http://127.0.0.1:8080/项目名/
②以不带斜杠开头的相对路径:部分前后台军以当前路路径为参照路径,这个当前路径可以理解为浏览器地址栏 中的路径而不是在项目中的路径。
简单小例子说明一个浏览器地址栏中,路径逐一递增的解决方案:
例:
表单登录界面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>My First Struts2 Project</title> 8 </head> 9 <body>
<!-- 用ognl表达式将Action中的fieldError中的自定义显示内容展现在页面 -->
<s:fielderror/>
10 <form action="validate/login_validate.action" method="post"> 11 用户名<input type="text" name="name"><br> 12 手机号<input type="text" name="mobile"><br> 13 <input type="submit" value="登录"> 14 </form> 15 </body> 16 </html>
Action方法进行数据验证:
1 package com.bjyinfu.struts.actions; 2 3 import java.util.regex.Pattern; 4 5 import com.opensymphony.xwork2.ActionSupport; 6 7 public class LoginAction4 extends ActionSupport { 8 9 private String mobile; 10 private String name; 11 public String getMobile() { 12 return mobile; 13 } 14 public void setMobile(String mobile) { 15 this.mobile = mobile; 16 } 17 public String getName() { 18 return name; 19 } 20 public void setName(String name) { 21 this.name = name; 22 } 23 public String execute(){ 24 return "success"; 25 } 26 @Override 27 public void validate() { 28 //等于null是为了防止越过表单方法问 29 if(name==null || "".equals(name.trim())){ 30 //底层有个集合叫fieldErrors.size()>0,说明有验证失败的信息,此时会自动跳转到input视图 31 this.addFieldError("name", "用户名不能为空"); 32 } 33 if(mobile==null || "".equals(mobile.trim())){ 34 this.addFieldError("mobile", "手机号不能为空"); 35 }else if(!Pattern.matches("^1[34578]\d{9}", mobile)){ 36 this.addFieldError("mobile", "手机号不符合规定"); 37 } 38 } 39 }
将Action方法注册到struts2中:(当输入数据符合规范的时候为“success”,跳转到welcome4.jsp页面上,当输入数据不符合规范的时候为“input”,跳转到login4.jsp登录界面,第二个跳转是struts2底层ActionSupport进行封装的,addFieldError("","")方法底层有个集合叫fieldErrors.size()>0,说明有验证失败的信息,此时会自动跳转到input视图)
)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 7 <package name="validate" namespace="/validate" extends="struts-default"> 8 <action name="login_*" class="com.bjyinfu.struts.actions.LoginAction4"> 9 <result name="success">/welcome4.jsp</result> 10 <result name="input">/login4.jsp</result> 11 </action> 12 </package> 13 </struts>
展示页面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@taglib uri="/struts-tags" prefix="s" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>My First Struts2 Project</title> 9 </head> 10 <body> 11 <s:debug></s:debug><br> 12 <h1>数据验证的执行</h1> 13 </body> 14 </html>
下面故意将数据输入错误,会出现这种情况:
第一次点击登录:
第二次点击登录:
第三次点击登录:
结:
a:获取项目名:String path = request.getContextPath();
此示例中的输出<%=path %> 结果:/AjaxPostProject
b:EL表达式中也可以获取项目名:${pageContext.request.contextPath }
此示例中输出 m=${pageContext.request.contextPath } 结果:/AjaxPostProject
c:获取带项目名的请求路径:
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
此示例中输出 <%=basePath %> 结果:http://127.0.0.1:8080/AjaxPostProject/
三种解决方案:
1:所以表单中的action可以写成action="<%=path %>/validate/login_validate.action"此为带斜杠的前段相对路径
2:action="${pageContext.request.contextPath }/validate/login_validate.action"此为带斜杠的前段相对路径
3:action="<%=basePath %>validate/login_validate.action"此为绝对路径