Struts2学习——(二)开发实例-我的第一个Struts2工程

来源:互联网 发布:手机淘宝买东西流程 编辑:程序博客网 时间:2024/06/05 10:34

回顾了上一次的学习过程,感觉还是有点条理不够清晰,因此这次我决定动手写一个过程,牢记一下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:如果要表示上级目录,则正确格式为“../”表示上一级目录,“../../”表示上两级目录,以此类推。

0 0
原创粉丝点击