在Struts2中方法调用概括起来主要有三种形式
第一种方式:指定method属性
<action name="student" class="com.itmyhome.Student" method="add">
<result name="add">/success.jsp</result>
</action>
这样Struts2就会调用Student 中的add方法。
第二种方式:动态方法调用(DMI)
用这种方法需要设置一个常量
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定Form的action属性
<!-- action属性为action!methodName的形式 -->
action = "action!methodName.action"
在struts.xml中定义如下Action
<action name="student" class="com.itmyhome.StudentAction">
<result name="add">/add.jsp</result>
<result name="delete">/delete.jsp</result>
</action>
StudentAction代码为
public class StudentAction extends ActionSupport {
public String add(){
return "add";
}
public String delete(){
return "delete";
}
}
则在JSP中用如下方式调用方法
<a href=” http://student!add.action“> 新增学生</a>
<a href=“ http://student!delete.action”> 删除学生</a>
第三种方式:通配符(推荐使用)
<action name="student*" class="com.itmyhome.StudentAction" method="{1}">
<result name="{1}">/student{1}.jsp</result>
</action>
<a href=“ http://studentadd”> 新增学生</a>
<a href=“ http://studentdelete”> 删除学生</a>
studentadd就会调用StudentAction中的add方法 然后跳转到studentadd.jsp
studentdelete就会调用StudentAction中的delete方法 然后跳转到studentdelete.jsp
Struts2支持动态方法调用,它指的是一个Action中有多个方法, 系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。
第一种方式:指定method属性
<action name="student" class="com.itmyhome.Student" method="add">
<result name="add">/success.jsp</result>
</action>
这样Struts2就会调用Student 中的add方法。
第二种方式:动态方法调用(DMI)
用这种方法需要设置一个常量
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定Form的action属性
<!-- action属性为action!methodName的形式 -->
action = "action!methodName.action"
在struts.xml中定义如下Action
<action name="student" class="com.itmyhome.StudentAction">
<result name="add">/add.jsp</result>
<result name="delete">/delete.jsp</result>
</action>
StudentAction代码为
public class StudentAction extends ActionSupport {
public String add(){
return "add";
}
public String delete(){
return "delete";
}
}
则在JSP中用如下方式调用方法
<a href=” http://student!add.action“> 新增学生</a>
<a href=“ http://student!delete.action”> 删除学生</a>
第三种方式:通配符(推荐使用)
<action name="student*" class="com.itmyhome.StudentAction" method="{1}">
<result name="{1}">/student{1}.jsp</result>
</action>
<a href=“ http://studentadd”> 新增学生</a>
<a href=“ http://studentdelete”> 删除学生</a>
studentadd就会调用StudentAction中的add方法 然后跳转到studentadd.jsp
studentdelete就会调用StudentAction中的delete方法 然后跳转到studentdelete.jsp
Struts2支持动态方法调用,它指的是一个Action中有多个方法, 系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。
------------------------------------------------------------------------------------------------------------
附加例子:
最新开始学习struts2,在官网上下载的最新的struts2(2.3.15.2), jar包,在使
用动态方法调用的时候老是报错,错误代码如下HTTP Status 404 - There is no
Action mapped for namespace [/] and action name [book!delBook] associated
with context path [/Struts2_0900_eg].但是导入struts-2.2.3.1的jar程序就能
正常动态方法调用,最新版的struts2到底怎么实现动态方法调用?代码如下
web.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
web-app
version
=
"2.5"
xmlns
=
"http://java.sun.com/xml/ns/javaee"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<
filter
>
<
filter-name
>struts2</
filter-name
>
<
filter-
class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilt
er</
filter-class
>
</
filter
>
<
filter-mapping
>
<
filter-name
>struts2</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
<
display-name
></
display-name
>
<
welcome-file-list
>
<
welcome-file
>index.jsp</
welcome-file
>
</
welcome-file-list
>
</
web-app
>
|
struts.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<
struts
>
<
package
name
=
"struts2"
extends
=
"struts-default"
>
<
action
name
=
"book"
class
=
"com.softeem.struts.actions.BookAction"
>
<
result
type
=
"redirect"
>/index.jsp</
result
>
</
action
>
</
package
>
</
struts
>
|
jsp页面
1
2
3
4
5
6
|
<
body
>
<
a
href
=
"book!addBook.action"
>添加图书信息</
a
><
br
/>
<
a
href
=
"book!delBook.action"
>删除图书信息</
a
><
br
/>
<
a
href
=
"book!updateBook.action"
>修改图书信息</
a
><
br
/>
<
a
href
=
"book!readBook.action"
>查询图书信息</
a
><
br
/>
</
body
>
|
Action类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package
com.softeem.struts.actions;
import
com.opensymphony.xwork2.ActionSupport;
public
class
BookAction
extends
ActionSupport {
public
String addBook() {
System.out.println(
"添加图书成功!"
);
return
SUCCESS;
}
public
String delBook() {
System.out.println(
"删除图书成功!"
);
return
SUCCESS;
}
public
String updateBook() {
System.out.println(
"修改图书成功!"
);
return
SUCCESS;
}
public
String readBook() {
System.out.println(
"查询图书成功!"
);
return
SUCCESS;
}
}
|
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
打开动态方法调用。
动态方法调用官方推荐的做法是,使用通配符的形式。不要使用actionName!methodName
的方式。