1. action的name后面可以加一个class,里面有一个execute()方法,这个方法是用来被调用的。
一旦有访问到来,首先会new一个对象出来,服务器能支持几十G的内存,所以,很多人访问问题也不大。然后就会调用对象中的execute()方法,execute有一个返回值,是一个字符串,根据这个返回值,然后来定向到底要访问哪一个。
事实上,在result后面有一个name="xxx",xxx对应的应该就是execute()方法的返回值。
默认情况下,不在action的name后面加class,也不用在result后面加name。
如果要使用action,那么要写一个java类,必须继承ActionSupport类,实现里面的execute()方法,返回一个字符常量,success,none,或者error。
2.先插一句,关于defaultaction的,就是说,如果你访问的时候啥都没有加,只是加了一个工程名+namespace,那么这个时候就没有匹配的action访问,假如你有一个action就叫做index,那么就必须按照xxx/namespace/index才能访问,除非。。。。
你可以在struts.xml文件中添加一句(在action是上面一行)<default-action-refname="index"></default-action-ref>,这样的话,在你输入的路径不正确的时候,就会直接访问default-action-ref里面的action。当然,记住,这个必须是访问了这个namespace,也就是路径应该是
xxx/namespace/才行,但是,后面可有有各种乱七八糟的action,只要没有匹配的,都会调用默认的。
这个东西有什么用呢?假如用户输入错了,还是至少还是会返回一个东西,比如主页,至少不会返回错误。还有,有些人不习惯敲完整的路径。
3.有三种方法来写action相关的类,第一种,就是直接自己写一个类,写一个execute()方法,返回一个字符串。第二种,继承Action类,里面有execute()方法。第三种,继承ActionSupport类,里面有execute()方法。
记住,以后如果要做东西,就继承ActionSupport,因为里面已经有很多实现了的好用的方法。
如果在class后面再加一个method,那么就可以不用使用execute(),如果你写一个method="test"。那么你可以在src下面写一个java类,里面加一个test()方法,就会被调用。但是记住,仍然要继承ActionSupport类,但是这个方法并不被推荐使用,可以直接忘掉,也就是说在class后面加method的方法不太可取。
更合适的一种方法是动态方法调用(DMI),就是不写method,你可以选择在web地址栏里面的输入,或者说,将链接地址更改为namespace/actionName!方法名,比如namespace为/,action名称为hello,方法为add,那么就在地址栏输入http://localhost:8080/Struts2Test/hello!add,或者说将起添加为jsp/html页面的一些链接。
4.通配符-使用通配符可以将配置量降到最低
通配符简单说来就是*的使用。
<
constant
name
="struts.devMode"
value
="true"
/>
<packagename="default"namespace="/"extends="struts-default">
<actionname="Students*"class="com.test.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
</package>
大概的意思就是说,*代表任意的东西,假如用户在请求的时候将path输入为Studentadd,那么{1}就是add,也就是会调用com.test.StudentAction类里面的add方法,如果return"success",那么就将返回Studentadd_success.jsp页面。
更加简单的一种配置为
假如用户输入Teacher_add,那么{1}就是Teacher,{2}就是add,所以Tomcat要做的就是调用com.test.TeacherAction这个类中add方法,如果 return"success",那么就将返回Teacher_add_success.jsp页面。
就这么简单,以后,如果整个项目是约定好怎么命名的话,配置甚至可以简化成为就这么几句话。
更加简单的一种配置为
<
constant
name
="struts.devMode"
value
="true"
/>
<packagename="default"namespace="/"extends="struts-default">
<actionname="*_*" class="com.test.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
</action>
</package>
假如用户输入Teacher_add,那么{1}就是Teacher,{2}就是add,所以Tomcat要做的就是调用com.test.TeacherAction这个类中add方法,如果 return"success",那么就将返回Teacher_add_success.jsp页面。
就这么简单,以后,如果整个项目是约定好怎么命名的话,配置甚至可以简化成为就这么几句话。