问题:撇开代码的好坏不说,我只想知道为什么同样的写法,页面的"logoff"button可以跳转到对应的action, 而"add1"button却不行?同时"add"button(采用直接submit方式)就可以正常跳转到action?add1 button 点击后的错误信息:Struts Problem ReportStruts has detected an unhandled exception:Messages:
com.opensymphony.xwork2.ActionSupport.trans4add()
File: java/lang/Class.java
Line number: 1,605
Stacktracesjava.lang.NoSuchMethodException: com.opensymphony.xwork2.ActionSupport.trans4add()
    java.lang.Class.getMethod(Class.java:1605)
    ……
页面代码(部分):
<s:form name="f" action="category!trans4add" method="post">
<input type="button" value="logoff" onclick="javascript:document.f.action='user!logoff';document.f.submit();" />
<input type="button" value="add1" onclick="javascript:document.f.action='category!trans4add.action';document.f.submit();" />
<s:submit value="add" />
</s:form>struts.xml(部分):
<package name="user" namespace="" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<global-results>
<result>/login.jsp</result>
</global-results>
<action name="index" class="">
<result>/login.jsp</result>
</action>
<action name="user" class="com.tci.chat.actions.UserManagerAction">
<result name="login" type="chain">
<param name="namespace">/admin</param>
<param name="actionName">category</param>
<param name="method">list</param>
</result>
<result name="regist">/registSuccess.jsp</result>
<result name="loginError">/login.jsp</result>
<result name="registError">/regist.jsp</result>
</action>
</package>

<package name="category" namespace="/admin" extends="user">
<action name="category" class="com.tci.chat.actions.CategoryManagerAction">
<result>/admin/index.jsp</result>
<result name="detail">/admin/detail.jsp</result>
<result name="add">/admin/add.jsp</result>
<result name="update" type="chain">
<param name="namespace">/admin</param>
<param name="actionName">category</param>
<param name="method">list</param>
</result>
</action>
</package>CategoryManagerAction.java:
public class CategoryManagerAction extends ActionSupport { private Category category;
private List<Category> list;
private User user;
private List<String> listOnline;
CategoryService service = new CategoryService();

public List<String> getListOnline() {
return listOnline;
} public void setListOnline(List<String> listOnline) {
this.listOnline = listOnline;
} public String detail() {
category = service.detail(category.getId());
return "detail";
} public Category getCategory() {
return category;
} public List<Category> getList() {
return list;
} public User getUser() {
return user;
} public String list() {
list = service.list(user);
listOnline = service.listOnline();
return "success";
} public void setCategory(Category category) {
this.category = category;
} public void setList(List<Category> list) {
this.list = list;
} public void setUser(User user) {
this.user = user;
} public String update() {
service.update(category);
return "update";
}

public String delete(){
service.delete(category.getId());
return "update";
}

public String back(){
return "update";
}

public String add(){
service.add(category);
return "update";
}

public String trans4add(){
return "add";
}
}
UserManagerAction.java:
public class UserManagerAction extends ActionSupport { private User user; UserService service = new UserService(); public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String login() {
if (user == null) {
this.addFieldError("loginError", "please input user info");
return "loginError";
}
if (service.isCorrectUser(user)) {
service.setOnline(user.getName());
return "login";
}
this.addFieldError("loginError",
"this user is not exist or the password is incorruct!");
return "loginError";
} public String regist() {
if (user == null) {
this.addFieldError("registError", "please input user info");
return "registError";
}
if (service.isCorrectUser(user)) {
this.addFieldError("registError", "user is exist");
return "registError";
}
try {
service.regist(user);
} catch (Exception e) {
this.addFieldError("registError", "regist failed!");
return "registError";
}
return "regist";
} public String logoff() {
service.setOffline(user.getName());
return SUCCESS;
}
}