在struts2中,当我们访问一个Action的时候,默认是是执行execute()方法,但是在实际需求中,我们需要做增删改查操作,那么有可能会出现过一个Action中有多个方法,我们应该如何来调用这些方法呢?这里一般有三种调用方式:
第一种调用方式:
在struts.xml中指定我们要访问的方法:
<struts>
<package name="hellworld" extends="struts-default">
<action name="hobby" class="com.java1234.HobbyAction" method="add">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
<action name="student" class="com.java1234.StudentAction" method="delete">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
</package>
</struts>
在上面我们可以通过method属性来指定调用的方法,那么此时访问action的时候回根据method来指定调用的方法。
第二种调用方式:感叹号调用方式
public class LoginAction {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String input() {
return "success";
}
public String login() {
if(username.equals("admin")) {
ActionContext.getContext().getSession().put("isAdmin", true);
}
ActionContext.getContext().getSession().put("loginUser", username);
ActionContext.getContext().put("url","/user_Article_add.action");
return "redirect";
}
public String logout() {
ActionContext.getContext().getSession().clear();
ActionContext.getContext().put("url","/common_Login_input.action");
return "redirect";
}
}
第二种方式:前端访问的时候,我们需要在调用的Action后面+感叹号+方法名字,但是这种方式在实际开发中不推荐使用
这种方式我们首先得在sturts2.xml中配置一个常量:
<span style="white-space:pre"> </span><constant name="struts.enable.DynamicMethodInvocation" value="true" />
前端访问方式:<a href="basePath/项目名称/Action名称!方法名/>,如果没有配置后缀那么还要在方法名后面加上 .action,访问之后会根据return 的结果去匹配<result>标签的名字
第三种方式:通配符方式
这种方式我们第一不需要在web.xml中开启的DynamicMethodInvocation
下面将举例来看看通配符是如何匹配的,在Action中:
public class PersonAction extends ActionSupport {
public String add(){
System.out.println("添加人员方法");
return "add";
}
public String delete(){
System.out.println("删除人员方法");
return "delete";
}
public String update(){
System.out.println("更新人员方法");
return "update";
}
}
PersonAction中我们有三个方法来处理请求,再看看struts2.xml
<action name="person_*" class="com.java1234.PersonAction" method="{1}">
<result name="add">add.jsp</result>
<result name="update">update.jsp</result>
<result name="delete">delete.jsp</result>
</action>
这里面有三个三个对应的返回结果,person_*表示,在请求中我们*代表任意方法,比如这样请求:
http://localhost:8080/StrutsDemo03/person_update调用的是update方法,返回的视图则是update.jsp
http://localhost:8080/StrutsDemo03/person_add调用的是add方法,返回的视图则是add.jsp
以此类推,但是需要注意的是我们的Action中一定有add update方法与之匹配,其实我们还可以这样匹配
<action name="person_*" class="com.java1234.PersonAction" method="{1}">
<result name="test">{1}.jsp</result>
</action>
此时我们的WebContent下面的jsp名字一定要写成person_*,下划线里面的内容,这里分别是add.jsp update.jsp delete.jsp,其实{1}代表的*,在扩展中我们也可以用{2}代表第二个*
比如:person_*_studen_* 那么我们可以用{2}代表第二个*;
到此结束,在官方中推荐用第三种方式进行匹配,配置文件减少了许多。本文只是个人学习记录,如果有错的地方希望大家能够帮忙纠正,谢谢。