Action接收参数的四种方法
- 在Action中定义属性和get、set方法,Struts2将会自动把接受的参数赋值到对应的属性:
public class UserAction extends ActionSupport { private String name; private int age; public String execute() {<span style="white-space:pre"> </span>//localhost:8080/Struts/user?name=aaa&age=20 return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
- 在Action类中定义model对象并添加get、set方法,在model对象中定义属性添加get、set方法,Struts2会将属性传入model中:
public class UserAction extends ActionSupport { private User user; public String execute() {<span style="white-space:pre"> </span>//localhost:8080/Struts/user?user.name=a&user.age=19 return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
- 使用DTO进行中间过渡,用于参数中带有不需要存入model的属性时:
public class UserAction extends ActionSupport { private UserDTO user; public String execute() { //localhost:8080/Struts/user?user.username=a&user.password=b&user.confirmingPassword=b return SUCCESS; } public User getUser() { return user; } public void setUser(UserDTO user) { this.user = user; } } class UserDTO { private String username; private String password; private String confirmingPassword; 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 getConfirmingPassword() { return confirmingPassword; } public void setConfirmingPassword(String confirmingPassword) { this.confirmingPassword = confirmingPassword; } }
- 实现ModelDriven接口,自行创建成员对象实例,实现getModel方法:
public class UserAction extends ActionSupport implements ModelDriven<User>{ private User user = new User(); public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } @Override public User getModel() { return user; } } class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
获取Request、Session和Application的四种方法:
- 使用ActionContext获取:
public class TestAction extends ActionSupport { private Map request; private Map session; private Map application; public TestAction() { request = (Map)ActionContext.getContext().get("request"); session = ActionContext.getContext().getSession(); application = ActionContext.getContext().getApplication(); } public String execute() { request.put("username", "aaa"); session.put("password", "bbb"); application.put("name", "ccc"); return SUCCESS; } }
- 实现RequestAware、SessionAware、ApplicationAware接口,通过IOC注入获取:
public class TestAction extends ActionSupport implements RequestAware,SessionAware, ApplicationAware { private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; public String execute() { request.put("username", "aaa"); session.put("password", "bbb"); application.put("name", "ccc"); return SUCCESS; } @Override public void setRequest(Map<String, Object> request) { this.request = request; } @Override public void setSession(Map<String, Object> session) { this.session = session; } @Override public void setApplication(Map<String, Object> application) { this.application = application; } }
- 通过ServletActionContext获取:
public class TestAction extends ActionSupport { private HttpServletRequest request; private HttpSession session; private ServletContext application; public TestAction() { request = ServletActionContext.getRequest(); session = request.getSession(); application = session.getServletContext(); } public String execute() { request.setAttribute("username", "aaa"); session.setAttribute("password", "bbb"); application.setAttribute("name", "ccc"); return SUCCESS; } }
- 实现HttpRequestAware接口,通过IOC注入获取:
public class TestAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; private HttpSession session; private ServletContext application; public String execute() { request.setAttribute("username", "aaa"); session.setAttribute("password", "bbb"); application.setAttribute("name", "ccc"); return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; this.session = request.getSession(); this.application = session.getServletContext(); } }
Result
Result标签有两个属性type和name,其中type有4种常用选项,分别为:
- dispatcher(默认选项):转发到一个页面
- redirect:重定向到一个页面
- chain:转发到一个Action
- redirectAction :重定向到一个Action
有些页面可以为所有Action服务,例如主页、错误页面等,可以使用<global-results>标签将这些页面的Result设置成全局Result:
<global-results>
<result name="error">/error.jsp</result>
<result name="main">/index.jsp</result>
</global-results>
同时Result也支持动态结果集,用法为"${r}",r代表ValueStack中的一个属性名。例如Action为:
public class UserAction extends ActionSupport {
private int type;
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) url="/success.jsp";
else if (type == 2) url="/error.jsp";
return "success";
}
}
struts.xml中的配置为:
<pre name="code" class="java"><action name="user" class="struts.action.UserAction">
<span style="white-space:pre"> </span><result>${url}</result>
</action>
或者用于重定向传递参数:
<action name="user" class="struts.action.UserAction">
<result type="redirect">/user.jsp/type=${type}</result>
</action>