Action

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。

Action_第1张图片
 

 

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()方法给成员变量赋值的,而不是直接给成员变量赋值的

Action_第2张图片
 

②DomainModel 域模型来直接接收参数

1.定义一个User类,该类有二个属性String name和int age

2.在Action中,声明private User user(该user不用new,Struts2自动帮我们创建User对象),并自动生成对应的setUser和getUser方法,这样写之后,我们可以直接给User赋值。

Action_第3张图片

说明:执行流 :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赋值。

Action_第4张图片
 

 

你可能感兴趣的:(action)