struts2实现一次请求和实现类的对应关系的文件是struts.xml,这个文件可以说是整个struts2框架的核心,下面来讲解一下这个文件,这个文件的树状图结构如下所示:
说明信息以及头文件的格式是固定的,这里不再赘述,主要是看一看他的文件的组织方式,他的constant标签,package标签,action标签以及result标签。struts标签用于配置常量,主要使用key-value对的形式,具体对应于标签中的属性值就是name和value属性,具体如下代码所示:
<!-- 演示constant标签的使用方式-->
<struts>
<!--设置文件默认编码集为UTF-8-->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!--设置使用开发模式-->
<constant name="struts.devMode" value="true"/>
</struts>
需要注意的是,还可以在struts.properties文件以及web.xml文件中配置常量的值,但需要注意的是,常量的值最终以web.xml中配置的为准,若是想了解如何配置常量,请参见教材15-16页,或者关注我的后续博客。
包配置的作用暂时不是很清楚,但有一点很明确,要想配置action,必须先使用package标签,package标签的配置方式几乎是固定的,如下所示:
<package name="VALUE" namespace="/" extends="struts-default">
...
</package>
name属性的值是这个包以被其他的包引用的唯一标识,namespace和extends分别表示命名空间和继承自其他包,这里暂时不用管它们。
下面讲述action属性,这个action实现了用户请求和处理类之间的映射关系,这种映射关系在笔记一已经解释过了,这里就不再继续赘述,着重讲解一下实现类吧。
这个实现类也叫控制类,主要是放在src目录下自己定义的包中,这一点可以由这个类的全限定名看出,如:cn.itcast.action.LoginAction.java,,主要的实现方式是继承ActionSuppot类,常见实现方式如下所示:
package cn.itcast.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private static final long seriaVersionUID=1L;
private String username; //用户名
private String password; //密码
// username的getter和setter方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
// password的getter和setter方法
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
//获取ActionContext对象
ActionContext context = ActionContext.getContext();
if ("itcast".equals(username) && "123".equals(password)) {
//将用户名和密码信息放入context对象中
context.put("username", username);
context.put("password", password);
context.put("success", "用户登录成功!");
return SUCCESS;
} else {
//定义登录失败的错误信息
context.put("error", "用户登录失败!");
return ERROR;
}
}
}
上面代码是一个典型的控制类,注意其中有一行语句是:
private static final long seriaVersionUID=1L;
任何控制类,只要它继承自ActionSupport,就必须添上这行语句,否则,就会报错。其中有两个私有属性username和password,必须实现他的setter和getter方法,为什么呢?当我们向服务器发送请求时,会携带一定的信息,例如用户输入的姓名和密码,这些信息会通过名称匹配的方式进行值传递,例如下行代码:
jsp文件中: java控制类文件中: Servlet API context中:
<input type="text" name="username"> private String username; username
<input type="text" name="password"> private String password; password
上面不同文件中的变量虽然名字是一样的,但占据的内存位置不一样,但是他们的值却根据变量名从左往右依次传播,最红要返回相应页面时,若在jsp页面中使用 ${... } 的方式取值,以context中的为准。
这种数据传递方式叫做“基本数据类型字段驱动方式的数据传递”,除此之外还有“直接使用域对象字段驱动方式的数据传递”以及“模型驱动数据传递”,这三种方式各有优劣,其区别在教材29-34页可查。