Struts2:Action处理多个请求
1. action 接收请求默认调用execute方法,但这已经满足不了我们的需求。通常 我们会把一个业务模块所有的请求定义在一个action类,这就需要action类提供更多的方法处理不同的请求,而不仅仅是一个execute方法;
例如我们想定义一个用户模块的增删查改请求,就可以采取如下方式实现
public class UserAction {
public String saveUser() throws Exception {
System.out.println("添加用户");
return null;
}
public String updateUser() throws Exception {
System.out.println("修改用户");
return null;
}
public String deleteUser() throws Exception {
System.out.println("删除用户");
return null;
}
public String showUser() throws Exception {
System.out.println("查询单个用户信息");
return null;
}
其配置方法如下:
配置方法一:action方法调用
<constant name="struts.action.extension" value="action"></constant>//请求路径的后缀为action 默认值为action,,
<package name="user" namespace="/user" extends="struts-default">
<action name="save" class="com.puckasoft.web.action.UserAction"
method="saveUser">
</action>
<action name="update"
class="com.puckasoft.web.action.UserAction" method="updateUser">
</action>
<action name="delete"
class="com.puckasoft.web.action.UserAction" method="deleteUser">
</action>
<action name="show" class="com.puckasoft.web.action.UserAction"
method="showUser">
</action>
</package>
运行路径路径格式: 包的命名空间/Action的名字/Action类中定义的方法名.后缀名
用户添加 /user/save.action
用户更新 /user/update.action
用户删除 /user/delete.action
用户查看 /user/show.acton
配置方法二:action动态方法调用DMI
<constant name="struts.action.extension" value="action"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="index"
class="com.puckasoft.web.action.UserAction" />
</package>
运行路径格式:包的命名空间/Action的名字!Action类中定义的方法名.后缀名
用户添加 /user/index!saveUser.action
用户更新 /user/index!updateUser.action
用户删除 /user/index!deleteUser.action
用户查看 /user/index!showUser.acton
注:只用设置常量struts.enable.DynamicMethodInvocation为true才能执行动态调用,它默认是开启的。要禁止使用此配置 ,(原因):虽然提高了开发的效率,但降低了运行的效率,一般情况下运行效率优先级高于开发效率。
配置方法三:使用通配符定义Action
使用通配符,将配置量降到最低。
在action元素的name属性中可以使用*通配符,它可以匹配除了/以外的多个连续字符,在action
元素的class和method属性以及 result元素中可以引用*通配符在访问期间实际匹配的内容
如:请求路径为save.action
则*就为save
例如Useraction中调用的方法为saveUser
则name=“*” class=“com.puckasoft.web.action.UserAction”method=“{0}User”
{0}代表的是* 的位置
<constant name="struts.action.extension" value="action"></constant>
<package name="user" namespace="/user" extends="struts-default">
<action name="*"
class="com.puckasoft.web.action.UserAction" method="{0}"/>
</package>
运行路径路径格式: 包的命名空间/Action的名字/Action类中定义的方法名.后缀名
用户添加 /user/save.action
用户更新 /user/update.action
用户删除 /user/delete.action
用户查看 /user/show.acton
2.Action 接受参数三种方式
以获得注册表单数据为例
a. 属性驱动FieldDriven
<h4>注册</h4>
<form action="reg.action" method="post">
用户名<input type="text" value="" name="uname"><br />
密码<input type="password" name="pwd"><br />
确认密码<input type="password" name="pwd2"><br />
电子邮箱<input type="text" value="" name="email"><br />
<input type="checkbox" checked="checked" name="agree" value="true" >是否同意条款<br />
<input type="submit" value="提交">
</form>
public class UserAction {
private String uname;
private String pwd;
private String pwd2;
private String email;
private boolean agree;
//setter /getter
}
b.模型驱动ModelDriven
类似于struts1的ActionForm
实现ModelDriven接口中的getModel方法
域模型是由自己手动创建,由Struts2赋值
<h4>注册</h4>
<form action="reg.action" method="post">
用户名<input type="text" value="" name="uname"><br />
密码<input type="password" name="pwd"><br />
确认密码<input type="password" name="pwd2"><br />
电子邮箱<input type="text" value="" name="email"><br />
<input type="checkbox" checked="checked" name="agree">是否同意条款<br />
<input type="submit" value="提交">
</form>
public class UserAction implements ModelDriven<UserVo>{
private UserVo userVo=new UserVo();
public UserVo getModel() {
return userVo;
}
//setter /getter
}
l
c.域模型DomainModel
<h4>注册</h4>
<form action="reg.action" method="post">
用户名<input type="text" value="" name="userVo.uname"><br />
密码<input type="password" name="userVo.pwd"><br />
确认密码<input type="password" name="userVo.pwd2"><br />
电子邮箱<input type="text" value="" name="userVo.email"><br />
<input type="checkbox" checked="checked" name="userVo.agree">是否同意条款<br />
<input type="submit" value="提交">
</form>
public class UserAction {
private UserVo userVo;
//setter /getter
}
3.Action 访问Servlet API
a.Map 类型 servlet 对象
通过特定的API
public class AttrAction {
private Map<String,Object> requestAttrs;
private Map<String,Object> sessionAttrs;
private Map<String,Object> applicationAttrs;
public AttrAction() {
requestAttrs=(Map<String, Object>) ActionContext.getContext().get("request");
sessionAttrs=ActionContext.getContext().getSession();
applicationAttrs=ActionContext.getContext().getApplication();
}
}
依赖注入
public class Attr2Action implements RequestAware, SessionAware,
ApplicationAware {
private Map<String, Object> requestAttrs;
private Map<String, Object> sessionAttrs;
private Map<String, Object> applicationAttrs;
public void setRequest(Map<String, Object> requestAttrs) {
this.requestAttrs = requestAttrs;
}
public void setSession(Map<String, Object> sessionAttrs) {
this.sessionAttrs = sessionAttrs;
}
public void setApplication(Map<String, Object> applicationAttrs) {
this.applicationAttrs = applicationAttrs;
}
}
b.拿真实的servlet API对象
通过特定的API
public class ServletAction {
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private ServletContext context;
public ServletAction() {
request = ServletActionContext.getRequest();
response = ServletActionContext.getResponse();
session = request.getSession();
context = ServletActionContext.getServletContext();
}
}
依赖注入
public class Servlet2Action implements ServletRequestAware,
ServletResponseAware, ServletContextAware {
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private ServletContext context;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setServletContext(ServletContext servletContext) {
this.context = servletContext;
}
}
4.返回
a.范围结果
全局结果: 将<result/>作为<global-results>的子元素来配置
局部结果: 将<result/>作为<Action>的子元素来配置
如果一个Action里面包含了与全局结果同门的结果,则局部的结果会覆盖全局的结果
b.返回类型
chain 用来处理Action链
dispatcher 用来转向页面,通常处理JSP
redirect 重定向到一个URL
redirectAction 重定向到一个Action
<package name="default" namespace="/" extends="struts-default">
<action name="a" >
<result type="dispatcher">/index.jsp</result>
</action>
<action name="b">
<result type="redirect">/index.jsp</result>
</action>
<action name="c">
<result type="chain">a</result>
</action>
<action name="d">
<result type="redirectAction">a</result>
</action>
</packag