1.① String path = request.getContextPath(); 可以获取工程的名字struts2_0100_path
② String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 最终形成了"http://localhost:8080/struts2_0100_path/",在所有的链接之前加上basePath就形成了绝对路径。
- request.getScheme() 拿到“http”字符串
- request.getServerName() 拿到localhost
- request.getServerPort() 拿到8080端口号
使用方法:
①<a href="<%=basePath%>index.jsp">index.jsp</a>
②在<head></head>之间添加<base href="<%=basePath%>" />标签,指定base是什么内容。这个base的意思是说当前我们所有的这个页面里的链接前面默认它都会加上basePath
2.struts2中路径问题是根据action的路径来确定而不是JSP路径来确定,所有尽量不要用相对路径。
虽然可以使用redirect方式解决,但redirect方式非必要。
解决办法非常简单,统一使用绝对路径。
3.①Action执行的时候并不一定要执行execute()方法。
②可以在配置文件中配置Action的时候,使用“method=”来指定执行那个方法(不推荐),因为如果action中有很多方法的话,就要在struts.xml中配置很多action。
③也可以在URL地址中动态指定(动态方法调用DMI)(推荐),因为不管action中有多少个方法,只需要在struts.xml中配置一个action。
4.wildcard 通配符 eg: * , {n}
①使用通配符将配置量降低到最低
②当客户请求一个action时,最精确的Action优先匹配,与其位置无关; 带 * 符号的Action优先级别相同,那个在前,优先匹配那个,与位置相关。
③ 情况1:
1.有三个action 顺序如下: name ="student_*"name = "*_*"
name = “student_add”
2.输入:http://localhost:8080/struts2/student_add
分析:会匹配第三个action,因为当一个客户请求一个action时,最精确的Action优先匹配,与其前后位置无关。
情况2:
1.有2个action 顺序如下: name = “*_*”
name = “student_*”
2.输入:http://localhost:8080/struts2/student_add
分析:会匹配第一个action,因为带“*” 符号的Action优先级别相同
5.在Struts2里面,你可以往action里面传参数,参数怎么来接收呢?在Action里面有3种方式来接收参数的方式
①通过成员变量来接受
URL地址中的参数名字(eg:age)要和Action中setXXX(setAge)中的XXX(Age)相同,而成员变量XXX对应的set方法不一定要遵循setXXX()格式,因为URL地址中输入的参数是经过Action中setXXX()方法给成员变量赋值的,而不是直接给成员变量赋值的
②DomainModel 域模型来直接接收参数
1.定义一个User类,该类有二个属性String name和int age
2.在Action中,声明private User user(该user不用new,Struts2自动帮我们创建User对象),并自动生成对应的setUser和getUser方法,这样写之后,我们可以直接给User赋值。
说明:执行流 :a.首先调用getUser()来获取user,如果user为null的话,调用setUser来创建一个User对象并且给User对象的age属性赋值,然后将User赋值的引用传给成员变量user。
b,递归调用getUser,此时user不为null,直接给成员变量user的name属性赋值"gaoweigang" 。
c,最后调用action中的add方法。
我们输入的参数个数有可能不是恰好和域模型匹配,我输入了1个参数name,域模型是不是正好要有1个参数呢?不是,这时候并不会报错,age是赋予默认值0。
再如:我们输入3个参数分别为name,age, birthday(Model中并不存在该属性),域模型中name和age属性会被正常赋值,birthday会在后台报错ognl.NoSuchPropertyException。
③通过ModelDriven来接收,这种方式并不常用,不过其中隐含了一种非常重要的程序设计思想(MVC模型)
implements ModelDriven<User>,DomainModel要自己new。
运行机制:struts2接收到2个参数,接收到2个参数后,它就会new那个访问的action, new这个action的时候,它就会发现这个action实现了ModelDriven接口,你既然实现了ModelDriven接口,那么就调用getModel()方法,返回一个DomainModel(User对象),再调用setName和setAge给User赋值。