首页 Struts2教程-带书签

Struts2教程-带书签

举报
开通vip

Struts2教程-带书签 - 1 - Struts2Struts2Struts2 Struts2 教程111 1 :第一个Struts2Struts2Struts2 Struts2 程序 在本系列教程中我们将学习到Struts2的各种技术。在本教程中使用的工具和程序库的版本 如下: 开发工具:MyEclipse6 Web服务器:Tomcat6 Struts版本:Struts2.0.11.1 JDK版本:JDK1.5.0_12 J2EE版本:Java EE5.0 在本系列教程中Web工程的上下文路径都是struts...

Struts2教程-带书签
- 1 - Struts2Struts2Struts2 Struts2 教程111 1 :第一个Struts2Struts2Struts2 Struts2 程序 在本系列教程中我们将学习到Struts2的各种技术。在本教程中使用的工具和程序库的版本 如下: 开发工具:MyEclipse6 Web服务器:Tomcat6 Struts版本:Struts2.0.11.1 JDK版本:JDK1.5.0_12 J2EE版本:Java EE5.0 在本系列教程中Web工程的上下文路径都是struts2,如果在Web根目录有一个index.jsp 文件,则访问路径如下: http://localhost:8080/struts2/index.jsp 由于MyEclipse6目前并不支持Struts2,所以我们需要到struts.apache.org去下载Struts2 安装包。要想正常使用Struts2,至少需要如下五个包(可能会因为Struts2的版本不同,包 名略有差异,但包名的前半部是一样的)。 struts2-core-2.0.11.1.jar xwork-2.0.4.jar commons-logging-1.0.4.jar freemarker-2.3.8.jar ognl-2.6.11.jar Struts2虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了 Struts1.x的方式(当然,Struts2仍然是基于MVC模式的,也是动作驱动的,可能这是唯一 没变的东西)。Struts2实际上是在Webwork基础上构建起来的MVC框架。我们从Struts2的 源代码中可以看到,有很多都是直接使用的xwork(Webwork的核心技术)的包。既然从技术 上来说Struts2是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。 如果大家使用过Struts1.x,应该对建立基于Struts1.x的Web程序的基本步骤非常清楚。 让我们先来回顾一下建立基于Struts1.x的Web程序的基本步骤。 1. 安装Struts。由于Struts的入口点是ActionServlet,所以得在web.xml中配置一下这 个Servlet。 2. 编写Action类(一般从org.apache.struts.action.Action类继承)。 3. 编写ActionForm类(一般从org.apache.struts.action.ActionForm类继承),这一步 不是必须的,如果要接收客户端提交的数据,需要执行这一步。 4. 在struts-config.xml文件中配置Action和ActionForm。 5. 如果要采集用户录入的数据,一般需要编写若干JSP页面,并通过这些JSP页面中 的form将数据提交给Action。 下面我们就按着编写struts1.x程序的这五步和struts2.x程序的编写过程一一对应,看看它们 - 2 - 谁更“酷”。下面我们来编写一个基于Struts2的Web程序。这个程序的功能是让用户录入两 个整数,并提交给一个StrutsAction,并计算这两个数的代数和,如果代码和为非负数,则 跳转到positive.jsp页面,否则跳转到negative.jsp页面。 【第111 1 步】 安装Struts2 这一步对于Struts1.x和Struts2都是必须的,只是安装的方法不同。Struts1的入口点是一 个Servlet,而Struts2的入口点是一个过滤器(Filter)。因此,Struts2要按过滤器的方式配置。 下面是在web.xml中配置Struts2的代码: struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* 【第222 2 步】 编写Action类 这一步和Struts1.x也必须进行。只是Struts1.x中的动作类必须从Action类中继承,而 Struts2.x的动作类需要从com.opensymphony.xwork2.ActionSupport类继承。下面是计算两个整 数代码和的Action类,代码如下: package action; import com.opensymphony.xwork2.ActionSupport; public class FirstAction extendsActionSupport { private int operand1; private int operand2; public String execute() throwsException { if (getSum() >= 0) // 如果代码数和是非负整数,跳到positive.jsp页面 { return "positive"; } else // 如果代码数和是负整数,跳到negative.jsp页面 { - 3 - return "negative"; } } public int getOperand1() { return operand1; } public void setOperand1(int operand1) { System.out.println(operand1); this.operand1 = operand1; } public int getOperand2() { return operand2; } public void setOperand2(int operand2) { System.out.println(operand2); this.operand2= operand2; } public int getSum() { return operand1+ operand2; // 计算两个整数的代码数和 } } 从上面的代码可以看出,动作类的一个特征就是要覆盖execute方法,只是Struts2的execute 方法没有参数了,而Struts1.x的execute方法有四个参数。而且execute方法的返回值也不同 的。Struts2只返回一个String,用于 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 述执行结果(就是一个标志)。上面代码的其他部分 将在下面讲解。 【第333 3 步】 编写ActionForm类 在本例中当然需要使用ActionForm了。在Struts1.x中,必须要单独建立一个ActionForm 类(或是定义一个动作Form),而在Struts2中ActionForm和Action已经二合一了。从第二步 的代码可以看出,后面的部分就是应该写在ActionForm类中的内容。所以在第2步,本例的 ActionForm类已经编写完成(就是Action类的后半部分)。 【第444 4 步】 配置Action类 - 4 - 这一步 struts1.x和 struts2.x都是必须的,只是在 struts1.x中的配置文件一般叫 struts- config.xml(当然也可以是其他的文件名),而且一般放到WEB-INF目录中。而在struts2.x中 的配置文件一般为struts.xml,放到WEB-INF"classes目录中。下面是在struts.xml中配置动作 类的代码: /positive.jsp /negative.jsp 标签中可以有多个,第一个可以指定一个Servlet访问路径 (不包括动作名),如“/mystruts”。extends属性继承一个默认的配置文件“struts-default”, 一般都继承于它,大家可以先不去管它。标签中的name属性表示动作名,class表 示动作类名。 标签的name实际上就是execute方法返回的字符串,如果返回的是“positive”, 就跳转到positive.jsp页面,如果是“negative”,就跳转到negative.jsp页面。在中 可以有多个,在中可以有多个。我们可以用如下的URL来访 问这个动作: http://localhost:8080/struts2/mystruts/sum.action 注:Struts1.x的动作一般都以.do结尾,而Struts2是以.action结尾。 【第555 5 步】 编写用户录入接口(JSP页面) 1.1.1. 1. 主界面(sum.jspsum.jspsum.jsp sum.jsp ) 在Web根目录建立一个sum.jsp,代码如下: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags"%> 输入操作数 - 5 - 求代数和
在sum.jsp中使用了Struts2带的tag。在Struts2中已经将Struts1.x的好几个标签库都统一了, 在Struts2中只有一个标签库/struts-tags。这里面包含了所有的Struts2标签。但使用Struts2 的标签大家要注意一下。在中最好都使用Struts2标签,尽量不要用HTML或普通文 本,大家可以将sum.jsp的代码改为如下的形式,看看会出现什么效果: ... ... 求代数和
操作数1:
操作数2:
... ... 提示一下,在中Struts2使用定位。 2.2.2. 2. positive.jsppositive.jsppositive.jsp positive.jsp <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags"%> 显示代数和 代数和为非负整数

3.3.3. 3. negative.jspnegative.jspnegative.jsp negative.jsp - 6 - <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags"%> 显示代数和 代数和为负整数

这两个jsp页面的实现代码基本一样,只使用了一个标签来显示Action类中 的sum属性值。标签是从request对象中获得了一个对象中得到的sum属性,如 我们可以使用如下的代码来代替: <% com.opensymphony.xwork2.util.OgnlValueStack ovs = (com.opensymphony.xwork2.util.OgnlValueStack)request.getAttribute("struts.valueStack") ; out.println(ovs.findString("sum")); %> 启动Tomcat后,在IE中输入如下的URL来测试这个例子: http://localhost:8080/struts2/sum.jsp 下一篇:Struts2教程2:处理一个form多个submit Struts2Struts2Struts2 Struts2 教程222 2 :处理一个formformform form 多个submitsubmitsubmit submit 在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit 按钮,如下面的代码所示: - 7 - 由于在
中的多个提交按钮都向一个action提交,使用Struts2Action的execute方法就 无法判断用户点击了哪一个提交按钮。如果大家使用过Struts1.x就会知道在Struts1.2.9之前 的版本需要使用一个LookupDispatchAction动作来处理含有多个submit的form。但使用 LookupDispatchAction动作需要访问属性文件,还需要映射,比较麻烦。从Struts1.2.9开始 , 加入了一个EventDispatchAction动作。这个类可以通过java反射来调用通过request参数指 定的动作(实际上只是判断某个请求参数是不存在,如果存在,就调用在action类中和这个 参数同名的方法)。使用EventDispatchAction必须将submit的name属性指定不同的值以区 分每个submit。而在Struts2中将更容易实现这个功能。 当然,我们也可以模拟EventDispatchAction的方法通过request获得和处理参数信息。但这 样比较麻烦。在Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执 行不同的方法(默认执行的是execute方法)。使用这种方式也需要通过请求参来来指定要执 行的动作。请求参数名的格式为 action!method.action 注:由于Struts2只需要参数名,因此,参数值是什么都可以。 下面我就给出一个实例程序来演示如何处理有多个submit的form: 【第1步】实现主页面(more_submit.jsp) <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags" %> My JSP 'hello.jsp' starting page 在more_submit.jsp中有两个submit:保存和打印。其中分别通过method属性指定了要调用 的方法:save和print。因此,在Action类中必须要有save和print方法。 【第2步】实现Action类(MoreSubmitAction) package action; - 8 - import javax.servlet.http.*; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.interceptor.*; public classMoreSubmitAction extends ActionSupport implements ServletRequestAware { private String msg; private javax.servlet.http.HttpServletRequest request; // 获得HttpServletRequest对象 public void setServletRequest(HttpServletRequest request) { this.request = request; } // 处理save submit按钮的动作 public String save() throws Exception { request.setAttribute("result", "成功保存[" + msg + "]"); return "save"; } // 处理print submit按钮的动作 public String print() throws Exception { request.setAttribute("result", "成功打印[" + msg + "]"); return "print"; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } 上面的代码需要注意如下两点: save和print方法必须存在,否则会抛出java.lang.NoSuchMethodException异常。 Struts2Action动作中的方法和Struts1.x Action的execute不同,只使用Struts2 Action动作的 execute方法无法访问request对象,因此,Struts2Action类需要实现一个Struts2自带的拦 截器来获得request对象,拦截器如下: - 9 - org.apache.struts2.interceptor. ServletRequestAware 【第3步】配置Struts2Action struts.xml的代码如下: /result.jsp /result.jsp 【第4步】编写结果页(result.jsp) <%@ page pageEncoding="GBK"%> 提交结果

${result}

在result.jsp中将在save和print方法中写到request属性中的执行结果信息取出来,并输出到 客户端。 启动Tomcat后,在IE中执行如下的URL来测试程序: http://localhost:8080/moresubmit/more_submit.jsp 大家也可以直接使用如下的URL来调用save和print方法: 调用save方法:http://localhost:8080/moresubmit/submit!save.action 调用print方法:http://localhost:8080/moresubmit/submit!print.action - 10 - 源代码:http://www.itpub.net/attachment.php?aid=520773 Struts2Struts2Struts2 Struts2 教程333 3 :struts.xmlstruts.xmlstruts.xml struts.xml 常用配置解析 在本文中将详细讲述struts.xml文件的常用配置及注意事项。 1.1.1. 1. 使用 标签重用配置文件 在Struts2中提供了一个默认的struts.xml文件,但如果package、action、interceptors 等配置比较多时,都放到一个struts.xml文件不太容易维护。因此,就需要将struts.xml 文件分成多个配置文件,然后在struts.xml文件中使用标签引用这些配置文件。 这样做的优点如下: 结构更清晰,更容易维护配置信息。 配置文件可以复用。如果在多个Web程序中都使用类似或相同的配置文件,那么可以使用 标签来引用这些配置文件,这样可以减少工作量。 假设有一个配置文件,文件名为newstruts.xml,代码如下: /result.jsp /result.jsp 则struts.xml引用newstruts.xml文件的代码如下: - 11 - 大家要注意一下,用 引用的xml文件也必须是完成的 struts2的配置。实际上 在引用时是单独解析的xml文件,而不是将被引用的文件插入到struts.xml文件中。 2.2.2. 2. actionactionaction action 的别名 在默认情况下,Struts2会调用动作类的execute方法。但有些时候,我们需要在一个动作 类中处理不同的动作。也就是用户请求不同的动作时,执行动作类中的不同的方法。为了达 到这个目的,可以在标签中通过method方法指定要指行的动作类的方法名,并且需 要为不同的动作起不同的名子(也称为别名)。如下面代码所示: 上面代码的两个动作的class属性都指向同一个类,name为这个类起了两个动作别名:test 和my。在动作my中,使用了method属性指定要要运行的方法名为my。 在MyAction类中必须要有my方法,代码如下: package action; import com.opensymphony.xwork2.ActionSupport; public classMyAction extends ActionSupport { public String execute() throws Exception { // 处理test动作的代码 - 12 - } public String my() throws Exception { // 处理my动作的代码 } } 除了在struts.xml中配置别名,还可以通过请求参数来描述指定动作(并不需要在struts.xml 中配置)。请求参数的格式如下: http://localhost:8080/contextPath/actionName!method.action 关于通过请求指定动作的详细内容,请参阅笔者写的《Struts2教程2:处理一个form多个 submit》。 3.3.3. 3. 为actionactionaction action 指定参数 在struts2中还可以为action指定一个或多个参数。大家还记着struts1.x是如何设置的action 参数不? 在struts1.x中可以使用标签的parameter属性为其指定一个action参数, 如果要指定多个,就只能通过逗号(,)或其他的分隔符将不同的参数隔开。而在struts2中 可以通过标签指定任意多个参数。代码如下: value1 value2 /result.jsp 当然,在action中读这些参数也非常简单,只需要象获取请求参数一样在action类中定义 相应的setter方法即可(一般不用定义getter方法)。如下面的代码将读取param1和param2参数 的值: package action; import com.opensymphony.xwork2.ActionSupport; public classMyAction extends ActionSupport { private String param1; private String param2; - 13 - public String execute() throws Exception { System.out.println(param1 + param2); } public void setParam1(String param1) { this.param1 = param1; } public void setParam2(String param2) { this.param2 = param2; } } 当struts2在调用execute之前,param1和param2的值就已经是相应参数的值了,因此,在 execute方法中可以直接使用param1和param2。 4.4.4. 4. 选择resultresultresult result 类型 在默认时,标签的type属性值是“dispatcher”(实际上就是转发,forward)。开发 人员可以根据自己的需要指定不同的类型,如redirect、stream等。如下面代码所示: /result.jsp 这此result-type可以在struts2-core-2.0.11.1.jar包或struts2源代码中的struts-default.xml文 件中找到,在这个文件中找到标签,所有的result-type都在里面定义了。代码 如下: 5.5.5. 5. 全局resultresultresult result 有很多时候一个初很多使用,这时可以使用标签来定义全 局的,代码如下: /result.jsp 如果中没有相应的,Struts2就会使用全局的。 Struts2Struts2Struts2 Struts2 教程444 4 :使用validatevalidatevalidate validate 方法验证数据 在Struts2中最简单的验证数据的方法是使用validate。我们从ActionSupport类的 源代码中可以看到,ActionSupport类实现了一个Validateable接口。这个接口只 有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法 之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可 以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldError 或addActionError加入相应的错误信息,如果存在Action或Field错误,Struts2会 返回“input ”(这个并不用开发人员写,由Struts2自动返回),如果返回了“input”, - 15 - Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调 用execute方法。 这两个add方法和ActionErrors类中的add方法类似,只是add方法的错误信息需 要一个ActionMessage对象,比较麻烦。除了加入错误信息外,还可以使用 addActionMessage方法加入成功提交后的信息。当提交成功后,可以显示这些 信息。 以上三个add方法都在ValidationAware接口中定义,并且在ActionSupport类中有一个默认的实 现。其实,在ActionSupport类中的实现实际上是调用了ValidationAwareSupport中的相应的方 法,也就是这三个add方法是在ValidationAwareSupport类中实现的,代码如下: private final ValidationAwareSupport validationAware = new ValidationAwareSupport(); public void addActionError(String anErrorMessage) { validationAware.addActionError(anErrorMessage); } public void addActionMessage(String aMessage) { validationAware.addActionMessage(aMessage); } public void addFieldError(String fieldName, String errorMessage) { validationAware.addFieldError(fieldName, errorMessage); } 下面我们来实现一个简单的验证程序,来体验一个validate方法的使用。 先来在Web根目录建立一个主页面(validate.jsp),代码如下: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags" %> 验证数据 输入内容:
- 16 - 在 上 面 的 代 码 中 , 使 用 了 Struts2 的 tag : ,分别用来显示动作错误信息,字段错误信息,和动作信息。如果信息 为空,则不显示。 现在我们来实现一个动作类,代码如下: package action; import javax.servlet.http.*; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.interceptor.*; public class ValidateAction extends ActionSupport { private String msg; public String execute() { System.out.println(SUCCESS); return SUCCESS; } public void validate() { if(!msg.equalsIgnoreCase("hello")) { System.out.println(INPUT); this.addFieldError("msg.hello", "必须输入hello!"); this.addActionError("处理动作失败!"); } else { this.addActionMessage("提交成功"); } } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } - 17 - 大家从上面的代码可以看出,Field错误需要一个key(一般用来表示是哪一个属性出的错 误),而Action错误和Action消息只要提供一个信息字符串就可以了。 最后来配置一下这个Action,代码如下: /error/validate.jsp /error/validate.jsp 假设应用程序的上下文路径为demo,则可通过如下的URL来测试程序: http://localhost:8080/demo/validate.jsp 我们还可以使用ValidationAware接口的其他方法(由ValidationAwareSupport类实现)获得 或设置字段错误信息、动作错误信息以及动作消息。如hasActionErrors方法判断是否存在 动作层的错误,getFieldErrors获得字段错误信息(一个Map对象)。下面是ValidationAware 接口提供的所有的方法: package com.opensymphony.xwork2; import java.util.Collection; import java.util.Map; public interface ValidationAware { void setActionErrors(Collection errorMessages); Collection getActionErrors(); void setActionMessages(Collection messages); Collection getActionMessages(); void setFieldErrors(Map errorMap); Map getFieldErrors(); void addActionError(String anErrorMessage); void addActionMessage(String aMessage); void addFieldError(String fieldName, String errorMessage); boolean hasActionErrors(); boolean hasActionMessages(); boolean hasErrors(); boolean hasFieldErrors(); } - 18 - Struts2Struts2Struts2 Struts2 教程555 5 :使用ValidationValidationValidation Validation 框架验证数据 在《Struts2教程4:使用validate方法验证数据》中曾讲到使用validate方法来验证客户端提 交的数据,但如果使用validate方法就会将验证代码和正常的逻辑代码混在一起,但这样做 并不利于代码维护,而且也很难将过些代码用于其他程序的验证。在Struts2中为我们提供 了一个Validation框架,这个框架和Struts1.x提供的Validation框架类似,也是通过XML文件 进行配置。 一、服务端验证 下面将给出一个例子来演示如何使用Struts2的validation框架来进行服务端验证。我们可以 按着如下四步来编写这个程序: 【第111 1 步】建立Action类(NewValidateAction.java) package action; import com.opensymphony.xwork2.ActionSupport; public class NewValidateAction extends ActionSupport { private String msg; // 必须输入 private int age; // 在13和20之间 public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 下面我们来验证msg和age属性。 【第222 2 步】配置Action类,struts.xml的代码如下: - 19 -
本文档为【Struts2教程-带书签】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_677258
暂无简介~
格式:pdf
大小:581KB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2011-11-12
浏览量:5