回顾了上一次的学习过程,感觉还是有点条理不够清晰,因此这次我决定动手写一个过程,牢记一下Myeclipse下配置Struts2以及建立工程的过程。
IDE:MyEclipse10
1、新建一个web project
2、在工程上单击右键,选择“MyEclipse”下的“Add Struts Capabilities...”
在这里我们选择Struts2.0版本,同时加入core库,其中包含了我们所需要的基本jar。
之后我们可以看到,在src文件夹下已经自动生成了struts.xml文件
同时可以看到在web.xml文件中也已经对filter做好了映射。
3、打开struts.xml,配置action
<struts>
<package name="struts_demo" namespace="/" extends="struts-default">
<action name="login" class="cn.wqy.LoginAction" method="execute">
<result name="success">/loginsuc.jsp</result>
<result name="error">/loginfal.jsp</result>
</action>
</package>
</struts>
直接在<struts>标签下配置即可。一个<package>标签下可以有多个action。<package>标签的属性有name(不是java目录下的包),namespace(命名空间,用来组成访问action的路径,减少重复代码),extends(继承的类,struts-default包是struts内置的,它定义了很多拦截器,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从文件上传、数据验证、自动封装前台传过来的参数等等。我们写的包继承了struts-default包才能使用struts2为我们提供的这些功能,所以通常我们写的每个包都应该继承它。)。
<action>标签的属性有name(action的名,参与组成访问action的路径),class(action所用的类),method指定了所用的方法,缺省则为execute()。
<result>代表的是结果集,即通过action的返回值来确定返回的视图。根据其name属性值返回该标签体中的页面。在只有一个<result>的情况下,缺省name则默认为“success”。
result标签中有一个属性type,默认值为“dispatcher“,服务器端跳转(只可以跳转页面HTML、JSP,但是不能使Action)。还可以取值为:(常用)
redirect:重定向(只可以跳转页面HTML、JSP,但是不能使Action)
chain:forward到一个Action
redirectAction:客户端跳转到一个Action
Ps:如果要跳转到另一个包中的action时:
<package name="p1" namespace="/p1" extends="xxxxx"> <action name="a1" class="xxxx"> <result>/1.jsp</result> </action> </package> <package name="p2" namespace="/p2" extends="xxxxx"> <action name="a2" class="xxxx"> <result type="redirectAction">这里</result> </action> </package>应该在一个action的result标签下作如下配置:
<result type="redirectAction"> <param name="namespace">/p1</param> (这里要写package的namespace) <param name="actionName">a1</param> (这里写action的name) </result>
(其余不常见的以后再补充................)
>>Global results全局结果集
如果有一个包中有几个Action同时想回到某个结果集,则可以把这个结果集设置为全局结果集。<global-results>,内部结构完全相同。在Action之外设置。则该包中所有Action都可以访问这个结果集。
>>如果别的包中的Action也想用这个全局结果集怎么办呢?
将另一个包继承含有想使用的全局结果集的包(即包的extends属性),由于父包继承了"struts-default",故子包也继承了该类,不必担心缺少一些必要的方法等。
要注意的是,struts.xml的配置中有一种<include>标签,eg:<include file="xxx.xml">,这样写起来板块更加明确。可以在每一个被包含的xml中写相关的一组Action。
4、写action对应的类
package cn.wqy;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String execute(){
if(name.equals("wqy")&&pass.equals("aaa")){
return SUCCESS;
}
else{
return ERROR;
}
}
}
注意类名和struts.xml中要对应起来,返回值常量和<result>中对应起来。5、写其他的jsp
jsp的编写这里就不展示了
注意路径问题:/ 表示的是绝对路径,不加表示的是相对路径,即和当前文件同目录级别。
struts.xml中
<result name="success">/loginsuc.jsp</result>
<result name="error">/loginfal.jsp</result>
此处的jsp页面要使用绝对路径,表示在工程目录下。
而页面间超链接跳转是相对路径:
<body>
fail!<br>
<a href="login.jsp">click here!</a>
</body>
至此,一个简单的struts工程就创建好了。
在链接栏里输入:http://localhost:8080/Struts2_001/login.jsp
ps:在这里可能有一个疑问。没有request对象的声明,name和pass两个属性是如何获得值的呢?答案是:框架帮我们把属性注射进去了。利用反射原理,获得了action中的setter,getter方法,根据属性名的对应,struts2框架帮我们将String,int,double等各种类型的数据注射入action,并且转换成我们所定义的数据类型。
而且,action类中向视图传递参数时,不必像servlet一样setAttibute,直接可以在JSP中访问action中的属性,比如${ XXX }即可。
pps.如果在实际开发中,action的package的namespace不为默认值,比如说设置为“/demo”,那么在访问action时,跳转的链接就应该写成“demo/xxx.action”。
ppps:如果要表示上级目录,则正确格式为“../”表示上一级目录,“../../”表示上两级目录,以此类推。