实现Action控制类
实现action控制类有3中种方式:
- POJO的实现
一般在pojo类中,要有一个公共的无参的构造方法(采用默认的构造方法)和一个execute()方法 - 实现Action接口
- 继承ActionSupport类(常用)
ActionSupport类本身实现了Action接口
配置Action
Action映射就是将一个请求的url映射到一个action类,当请求匹配某个action名称时,框架就使用这个映射来确定如何处理请求。
< action>元素有4个属性:
name:必填属性,标识action,指定了action所处理的请求的URL
class:可选属性,指定action的实现类
method:可选属性,指定请求action时调用的方法
使用通配符
<package name="hello" namespace="/" extends="struts-default">
<action name="helloWorld_*" class="cn.itcast.action.HelloWorldAction" method="{1}">
<result>/success.jsp</result>
</action>
</package>
其中,method属性值中的数字1表示匹配第一个*
在struts2.5版本中要如下配置
<action name="userAction_*" class="cn.ssh.action.UserAction" method="{1}">
<result name="success">/registersuccess.jsp</result>
<result name="login">/loginsuccess.jsp</result>
<result name="error">/error.jsp</result>
<!-- 版本的原因加上这句 -->
<allowed-methods>login,register</allowed-methods>
</action>
action访问servlet api
- 通过ActionContext类访问(优先使用)
ActionContext context = ActionContext.getContext();
context.put("name", "itcast");
context.getApplication().put("name", "itcast");
context.getSession().put("name", "itcast");
在上述代码中,通过actioncontext类中的方法调用,分别在request、application和session中放入了(“name”,“itcast”)对。通过ActionContext类可以访问jsp的内置对象属性
-
通过特定接口访问
ServletRequestAware:可以直接访问web应用的HttpServletRequest实例
ServletResponseAware:可以直接访问web应用的HttpServletResponse实例
SessionAware:可以直接访问web应用的HttpSession实例
ServletContextAware:可以直接访问web应用的ServletContext实例 -
通过ServletActionContext访问
action处理请求参数
- 属性驱动
属性驱动是指通过字段进行数据传递,包括两种情况:
基本数据类型字段驱动方式的数据传递:可以直接在action中定义各种java基本数据类型的字段,是这些字段与表单数据相对应,并利用这些字段进行数据传递;
public class UserLoginAction extends ActionSupport {
private String userName;
private String password;
//get\set方法省略
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
直接使用域对象字段驱动方式的数据传递:
采用这种方式,一般以javabean来实现,所封装的属性和表单属性一一对应,Javabean将成为数据传递的载体。
public class UserLoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
ActionContext context = ActionContext.getContext();
if("111".equals(user.getName())&&"111".equals(user.getPassword())) {
context.getSession().put("username", user.getName());
context.getSession().put("password", user.getPassword());
return SUCCESS;
}else {
context.getSession().put("error", "用户登录失败");
return ERROR;
}
}
}
使用域对象的属性驱动方式进行传值时,如果jsp页面是负责取值的,那么取值的格式必须为“对象.属性名”;如果jsp页面是负责传值的,那么传值的格式可以为“模型对象名.属性名”,也可以直接是“属性名”。
- 模型驱动
通过实现ModelDriven接口来接收请求参数,Action类必须实现ModelDriven接口,并且要重写getModel()方法,这个方法返回的就是action所使用的数据模型对象
result结果类型
最常用的结果集是redirect和dispatcher,redirect和dispatcher很相似,dispatcher是默认的结果集类型,dispatcher结果集是将请求转发到jsp视图资源,而redirect类型是将请求重定向到jsp视图资源,它们之间最大的差别是一个是请求转发,一个是请求重定向,如果重定向了请求,那么将丢失所有参数,包括action的处理结果
<action name="userlogin" class="cn.itcast.action.UserLoginAction">
<result name="success" type="dispatcher">/loginSuccess.jsp</result>
<result name="error" type="redirect">/loginError.jsp</result>
</action>