信息系统软件设计:第3章 Struts2.0-Action知识_第1页
信息系统软件设计:第3章 Struts2.0-Action知识_第2页
信息系统软件设计:第3章 Struts2.0-Action知识_第3页
信息系统软件设计:第3章 Struts2.0-Action知识_第4页
信息系统软件设计:第3章 Struts2.0-Action知识_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.2 ActionAction基础知识1Action的实现方式2Action和页面之间传递数据的方式34Struts.xml文件配置Action56配置Result78Action异常处理机制Students.jspStudentsAction.javaexecute() ; return “hfut”; glxy.jsp struts.xmlglxy.jsp3.2.1 Action基础知识Action的作用:业务控制器处理用户请求的业务处理逻辑Action的地位:Struts开发应用主战场Action的管理机制:在struts.xml配置文件的package标签下,使用Action标签定义

2、和管理实现Action的方式方式1:POJO-普通JavaBean方式2:实现Action接口方式3:继承ActionSupport类3.2.2 Action的实现方式-POJO方式1:Action = POJO(Plain and Old Java Object)遵守规则:定义一个execute()方法示例源代码 public class LoginAction1 private String username; private String password; public String execute() throws Exception if ( 权限验证通过 ) return suc

3、cess; else return error; 3.2.2 Action的实现方式-POJO 优点1、规则简单2、不引入Struts架构任何接口,和Struts架构完全解耦3、单元测试非常简单缺点1、无法复用Struts框架功能:实现复杂业务逻辑处理很麻烦(例如数据校验)2、无法实现和web容器相关的功能,例如:访问request中的数据不推荐使用POJO方式方式2: Action类实现Action接口定义了Action处理类应该实现的规范Action接口内容:public interface Action public static final String SUCCESS = succe

4、ss; public static final String NONE = none; public static final String ERROR = error; public static final String INPUT = input; public static final String LOGIN = login; public String execute() throws Exception;示例代码 public class LoginAction2 implements Action private String username; private String

5、password; public String execute() throws Exception if (getUsername().equals(wrde) & getPassword().equals() ) return SUCCESS ; else return ERROR; 3.2.2 Action的实现方式-实现Action接口import com.opensymphony.xwork2.Action;静态常量说明SUCCESSAction执行成功。显示结果视图(页面)给用户ERRORAction执行失败。显示一个错误的视图(页面),这个页面可以要求用户再次输入相关数据INPU

6、TAction的执行成功需要更多的输入。这个结果用于用户输入无效,意味着用户需要再次输入LOGINAction不能执行,因为用户没有登录。已登录的画面会被关闭NONEAction执行成功,但是不显示一个视图。通常产生这种情况的原因是被其他视图重定向了3.2.2 Action的实现方式-静态常量说明ActionSupport类源代码public class ActionSupport implements Action , Validateable , ValidationAware , TextProvider , LocaleProvider , Serializable public St

7、ring input() throws Exception return INPUT ; public String doDefault() throws Exception return SUCCESS ; /继承webwork的功能 public String execute() throws Exception return SUCCESS ; public Object clone() throws CloneNotSupportedException return super .clone(); public void validate() public void pause(Str

8、ing result) 说明1、Action类继承ActionSupport之后, 等同于实现了如下接口 :Action、Validateable、ValidationAWare、TextProvider、LocalProvide、Serializable 2、可以提供数据校验、序列化、国际化等功能3、编程开发Action时,应该继承ActionSupport3.2.2 Action的实现方式3-继承ActionSupport类import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends Action

9、Support 3.2.3 Action和页面之间传递数据的方式方式1:属性驱动模式功能:通过Action中定义的属性传递数据方式2:模型驱动模式功能:通过专门定义的JavaBean类传递数据3.2.3 属性驱动模式方式1:属性驱动模式功能:Action本身属性传递数据,封装请求参数和处理结果示例:数据类型转换:自动完成 String int数据类型转换方式2:模型驱动模式功 能: Action和页面之间通过JavaBean模型对象传递数据Action:只负责处理用户请求JavaBean模型对象:负责封装请求参数和处理的结果Struts支持:ModelDriven接口 public T get

10、Model() 方法返回一个用于接收用户输入数据的模型对象,将Action和与之对应的模型实例关联了起来3.2.3 模型驱动模式3.2.3 模型驱动模式实例:public class LoginModelDrivenAction implements Action,ModelDrivenprivate User user = new User();public String execute() throws Exception if(wde.equals(user.getUsername() & . equals(user.getPassword() ) return SUCCESS;else

11、 return ERROR; public User getModel() return user; 模型驱动实现原理在struts-default.xml定义了模型驱动的拦截器 dojo.* 3.2.3 模型驱动模式系统默认的模型驱动拦截器栈,包含了两个拦截器引用: prams:params拦截器负责提取请 求参数; model-driven:modelDriven拦截器负责将请求参数传给Action中的模型的属性;3.2.3 模型驱动模式属性驱动模式和模型驱动模式的比较(1)属性驱动模式:编程简洁,但是结构不够清晰(2)模型驱动模式:结构清晰,但是编程繁琐,需要额外提供一个JavaBean

12、作为模型(3)编程建议:数据传输量少的情况下选择属性驱动模式,数据传输量大选择模型驱动模式3.2.3 两个驱动模式的比较3.2.4 struts.xml文件配置 Action配置Action,让Struts能够处理用户请求 物理视图地址 action标签详细说明3.2.4 struts.xml文件配置 Action属性说明name用户请求名class指定Action的实现类,如果不定义则默认使用系统的ActionSupport类method让Action调用指定方法,而不是execute方法来处理用户请求。方法遵循和execute方法相同的格式。result配置逻辑视图和物理视图之间的对应关系

13、 action 标签name属性name属性使用注意点:name默认情况下不允许出现斜杠(/)如果要是有/,在struts.xml中打开此功能不要使用点号(.)和连字符(-),否则可能出现莫名其妙的问题,但是可以有下划线(_)method属性?Struts根据method属性查找方法时的顺序:查找method属性定义的方法查找doMethod()格式的方法动态方法调用功能:直接调用Action中的非execute方法格式:actionName!methodName.action通配符映射功能:具有类似行为的Action或者Action方法可以使用通用的样式来配置 3.2.4 action 标签

14、method属性 3.2.5. Action中的异常处理机制通常的异常处理机制public class MyAction public String execute() try /业务逻辑 catch(异常1) return 结果1 catch(异常2) return 结果2 存在的问题异常处理代码和正常的业务逻辑代码混杂在一起,紧密耦合在execute方法中编写大量代码,编码工作量大3.2.5 声明式的异常处理机制含义:将一个异常类型和一个结果对应起来,由这个结果负责对这种异常类型做出响应 流程:步1:Action在执行期间抛出一个异常步2:拦截器ExceptionMappingInterc

15、eptor捕获Action抛出的异常步3: Struts根据配置文件中的异常映射,找到所定义的结果对此异常做出响应注意:result不仅可以定义为页面类型,也可以定义为Action类型示例 3.2.5 声明式的异常处理机制3.2.5 输出异常信息 拦截器ExceptionMappingInterceptor捕获Action抛出的异常后,会进行两个操作:(1)从异常映射的配置中查找对应的结果名(2)将下面两个值存放到值栈中:exception:异常对象本身,结果页面中使用Struts2的标签,使用表达式 显示异常信息exceptionStack:保存异常发生时栈跟踪信息,显示异常对象 3.2.6

16、 Result(结果).Result基础知识1配置Result23自定义Result类Result基础知识配置Result自定义Result类3.2.6 Result基础知识Result什么?在Action中定义的返回值:含义是Action处理完后的流程转向在Action中配置的返回值:含义是将定义的返回值和真正的物理资源进行对应3.2.6 Result基础知识Struts中定义的Result类型结果类型说明dispatcher用来转向页面,通常处理JSPchain处理Action链redirect重定向到一个URLredirect-action重定向到一个Actionplaintext显示原

17、始文件内容,例如文件源代码chart整合JFreeChart的结果类型freemaker处理FreeMarker模板httpheader控制特殊HTTP行为的结果类型jasper用于JasperReports整合的结果类型jsfJSF整合的结果类型tiles与Tiles整合的结果类型velocity处理Velocity模板xslt处理XML/XLST模板3.2.6 配置ResultResult配置 物理视图地址 3.2.6 配置Result-配置动态结果“动态结果”的含义根据Action的执行情况决定调用的结果内容使用表达式来配置结果,根据表达式的值来确定执行的结果实例1 $username.

18、jsp 相应的配置文件如下: $nextAction 实例2 Action源代码如下:public class loginAction extends ActionSupport private String nextAction; public String execute() throws Exception if() nextAction = “manager”; else nextAction = “student”; 3.2.6 配置Result-配置动态结果3.2.6 创建自定义Result类型开发步骤:步1:编写Result类步2:在struts.xml配置文件中配置 步3:在A

19、ction中使用 物理视图地址 3.3 Struts2.0 标签基础知识1Struts常用标签2Struts标签实例分析3OGNL 基础知识Struts常用标签Struts常用标签4Struts标签实例分析什么是OGNL?OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。OGNL可以让我们用非常简单的表达式访问对象层,例如,当前环境

20、的根对象为user1,则表达式vince可以访问到user1的person属性的第一个address的province属性。现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个textfield,hidden)和对象层某个类的某个属性绑定在一起,修改和显示自动同步。和struts1.x的formbean相比,这样做的好处非常明显:在Struts2.x中不需要为每个页面专门写formbean,可以直接利用对象层的对象。3.3.1 OGNL3.3.1 OGNLOGNL表达式最大的优点就是:*简单*

21、和 *直观* 支持对象方法调用,如xxx.doSomeSpecial(); 支持类静态的方法调用和值访问,表达式的格式为 类全名(包括包路径)方法名 | 值名,例如: java.lang.Stringformat(foo %s, bar)或 tutorial.MyConstantAPP_NAME; 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80; 访问OGNL上下文(OGNL context)和ActionContext; 操作集合对象 访问JavaBean的属性及调用方法假如有一个employee对象作为O

22、GNL上下文的根对象,那对于下面的表达式:public class Address private String country; private String city; setter/getterpublic class Employee private String name; private String address; setter/对应的java代码是 employee.getName(); 2.address.country对应的java代码是employee.getAddress().getCountry();OGNL提供了调用任何方法的能力,如:要访

23、问employee对象中的name属性的值转换为大写形式,可以使用表达式:name.toUpperCase()3.3.1 OGNL表达式OGNL的集合操作如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。可以使用如下代码直接生成一个List对象: 该OGNL表达式中,直接生成了一个List对象,该List对象中包含3个元素:e1、e2和e3。如果需要更多的元素,可以按照这样的格式定义多个元素,多个元素之间使用逗号隔开。如下代码可以直接生成一个Map对象: Map类型的集合对象,使用key-value格式定义,每个key-value元素使用冒号标

24、识,多个元素之间使用逗号隔开。e1,e2,e3e1,e2,e3 #key1:value1,key2:value2,3.3.1 OGNL表达式OGNL中的投影(projection)OGNL提供了一种简单的方式在一个集合中对每一个元素闻调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合,称之为投影。假如employees是一个包含了employee对象的列表,那么: 在投影期间,使用#this变量来引用迭代中的当前元素。#/返回所有雇员的名字的列表objects.#this instanceof String? #this: #this.toString(

25、) 3.3.1 OGNL表达式OGNL中的投影(projection) OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。3.3.1 OGNL表达式#employees.?#this.salary3000将返回薪水大于3000的所有雇员的列表。#employees.#this.salary3000将返回第一个薪水大于3000的雇员的列表。#employees.$#this.salary3000将返回最后一个薪水大于3000的雇员的列表。3.3.1 OGNL“#”主要有三种用途 访问OGNL上下文和Action上下文 用于直接取根目录中的对象,在s

26、truts2中就是contextMap中的request,session ,attr等等对象 parameters 包含当前HTTP请求参数的Map #parameters.id0作用相当于request.getParameter(id)request 包含当前HttpServletRequest的属性的Map #request.userName相当于request.getAttribute(userName)session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute(userName)a

27、pplication 包含当前应用的ServletContext的属性的Map #application.userName相当于 application.getAttribute(userName)attr 用于按request session application顺序访问其属性 #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止3.3.1 OGNL“#”主要有三种用途2. 用于过滤和反射(projecting)集合,如 books.?#this.price100; ,xxxx.#this 3. 构造Map,如#foo1:bar1,

28、foo2:bar2。 3.3.1 OGNL“$”有两个主要的用途用于在国际化资源文件中,引用OGNL表达式,如: validation.require=$getText(fileName) is required 2. 在Struts 2配置文件中,引用OGNL表达式,如: ListPhotos.action?albumId=$albumId 3.3.1 OGNL“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值 %exp用来计算exp值代入到页面中,相当于 例如: 3.3.2 基础知识在早期的WEB开发中,JSP视图控制和显示技术主要依靠Java脚本来实现,这样一来,JSP

29、页面重新嵌入了大量的Java脚本代码,给开发带来了极大的不方便。从JSP1.1规范后,JSP增加了自定义标签库的支持。标签库是一种组件技术,通过标签库,可以将复杂的Java脚本代码封装在组件中,开发者只需要使用简单的代码就可以实现复杂的Java脚本功能。提供了Java脚本的复用性,提高了开发者的开发效率。Struts2标签库相对struts1.x进行了巨大的改进,支持OGNL表达式,不再依赖任何表现层技术。3.3.2 基础知识-什么是标签?标签本质:(1)是遵循特定规范的Java类(2)封装了数据显示功能;(3)以页面标签的方式使用(4)在运行时,标签被相应的Java代码代替标签遵循特定的规范

30、sun制定了标签库规范(即JSP标准标签库JSTL(Java ServerPages Standard Tag Library)3.3.2 使用Struts 2的标签库在struts2-core-2.0.11.jar压缩文件的META-INF目录下找到struts-tags.tld文件,这个文件里定义了Struts2的标签。步1:JSP中引入标签库 prefix:表示使用struts标签库的前缀uri:表示struts标签的URI地址步2: JSP页面中使用标签库 . 3.3.3 Struts常用标签3.3.3 Struts常用标签Struts标签分类对于UI标签,则又可分为如下两类:1.表单

31、标签:表单标签主要用于生成HTML页面的form元素.以及普通表单元素的标签。2.非表单标签:非表单标签主要用于生成页面上的树、Tab页等标签。对于非UI标签,页可分为如下两类:1.流程控制标签:只要包含用于实现分支、循环等流程控制的标签。2.数据访问标签:主要包含用户输出ValueStack中的值,完成国际化等功能的标签3.3.3 Struts常用标签3.3.3 控制标签标签种类标签功能if控制选择输出elseif和if标签结合,控制选择输出else和if标签结合,控制选择输出append将多个集合组合成一个新的集合generator字符串解析器,将一个字符串解析成一个集合iterator迭

32、代器,将集合(包括:数组、List、Set、Map)迭代输出merge将多个集合组合成一个新的集合,只是和append的拼装方式有所不同sort对集合进行排序subset截取集合的部分元素,形成新的子集合3.3.3 控制标签 if/elseifif/elseif标签属性test:为必填属性,是一个Boolean类型值,决定是否显示if标签内容。该标签标准格式如下:.3.3.3 控制标签 if/elseif testname不是“Java”3.3.3 控制标签 if/elseif/else标签举例 60 老年人 35 中年人 15 id=wawa 青年人 少年3.3.3 控制标签 iterato

33、r(迭代标签)Iterator(迭代)描述:用于遍历集合(java.util.Collection)List,Map,数组或枚举值(java.util.iterator)。该标签的属性如下表:3.3.3 IteratorStauts实例包含方法int getCount():返回当前迭代过元素的总数。int getIndex():返回当前迭代元素的索引。boolean isEven():判断当前迭元素是否为偶数。boolean isOdd():判断当前迭元素是否为奇数。boolean isFirst():判断当前迭元素是否为第一个元素。boolean isLast():判断当前迭元素是否为最后一

34、个元素IteratorStauts的这些方法分别对应了count,index,even,odd,first,last属性3.3.3 控制标签 iterator标签示例3.3.3 控制标签 iterator(迭代标签)举例 day is: private List myList;private Map myMap;public String execute() throws Exception myList = new ArrayList();myList.add(第一个元素);myList.add(第二个元素);myList.add(第三个元素);myMap = new HashMap();m

35、yMap.put(key1, 第一个元素);myMap.put(key2, 第二个元素);myMap.put(key3, 第三个元素);return SUCCESS; 省略生成setter/getter方法显示List属性 显示Map 显示Map属性 3.3.3 控制标签 sort标签Sort标签根据comparator属性指定的比较器对集合进行排序,并将排序后的迭代器压入值栈的栈顶。在sort标签的内部,你可以使用iterator标签取出栈顶的迭代器对排序后的元素进行迭代。当sort标签结束时,栈顶的迭代器将被删除。3.3.3 sort标签示例3.3.3 表单标签Struts2的表单标签可以

36、分为两类,form标签本身和包装HTML表单元素的其他标签。form标签本身的行为不同于它内部的元素。Struts2表单标签包括下列标签:form textfield password radiocheckbox checkboxlist selectdoubleselect combobox optiontransferselect optgroup updownselecttextarea hidden file label reset submit token head3.3.3 表单标签3.3.3 表单标签的name和value属性很多表单标签(form标签除外)的name属性和val

37、ue属性之间存在一个独特的关系。name属性除了为HTML表单元素指定名字,在表单提交时作为请求参数的名字外,同时它还映射到Action的属性。在大多数情况下,name属性映射到一个简单的JavaBean属性,例如name属性的值为”postalCode”,在表单提交后,struts2框架将会调用Action的setPostalCode()方法来设置属性。有的时候你希望在表单元素中显示Action属性的数据,这时就轮到value属性登场了,为value属性指定表达式”%postalCode”,这将会调用Action的getPostalCode()方法,并在表单中显示返回的数据,之后, 用户可以

38、编辑这个值,然后重新提交它。3.3.3 form标签form标签输出一个HTML输入表单,此外,xhtml主题的form标签还输出表单元素外围的表格。3.3.3 textfield标签textfield标签输出一个HTML单行文本输入控件,等价于HTML代码:看下面的代码:3.3.3 password标签password标签输出一个HTML口令输入控件,等价于HTML代码:例子:3.3. 3 textarea标签textarea标签输出一个HTML多行文本输入控件,等价于HTML代码:.例子:3.3.3 select标签select标签输出一个HTML列表框,等价于HTML代码:3.3.3 s

39、elect标签示例示例一:在select标签的list属性中直接使用OGNL表达式创建了一个列表,列表中的每一项都将作为HTML列表框的一个选项。示例二:在select标签的list属性中直接使用OGNL表达式创建了一个Map。在这里要注意的是,Map的key是作为列表框选项的值,而Map中的value是作为列表框选项的内容。3.3.3 select标签示例示例三:Header选项主要用来越提示作用,因此应该将header选项的值(通过headerKey属性设置)设为无意义的值,例如此处的-1.示例四:使用emptyOption属性在header选项后添加一个空的选项。multiple属性设为

40、false,则只能从下拉列表中选择一个选项,如果设为true,则可以多选。3.3.3 radio标签radio标签输出一组HTML单选按钮,等价于一组HTML代码:例子:3.3.3 checkbox标签checkbox标签输出一个HTML复选框,等价于代码:checkbox标签创建一个value属性为true或者为false的复选框。你可以通过checkbox标签的fieldValue属性来指定创建的HTML复选框value属性的值。我们看下面的代码:复选框的值是true还是false,是由fieldValue属性来控制的,而不是由通常的value属性来设置的。3.3.3 checkboxli

41、st标签checkboxlist标签使用一个列表创建一系列复选框,属性设置与和类似,只是创建的是HTML复选框。不同的是, checkboxlist标签是多选标签。示例:3.3.3 hidden标签hidden标签输出一个HTML隐藏表单元素,等价于HTML代码:.在xhtml主题下,hidden标签与其它的标签不太一样,hidden标签并不输出表行。xhtml主题直接从simple主题继承了hidden.ftl模板。除了公共属性外,hidden标签没有特有的属性。示例:3.3.3 submit标签submit标签输出一个提交按钮。 submit标签和form标签一起使用可以提供异步表单提交功

42、能。 submit标签可以输出以下三种类型的提交按钮。input:等价于HTML代码image:等价于HTML代码button:等价于HTML代码HTML的button标签已经演进为可以分别指定提交的值(通过value属性指定)和按钮上显示的文本(通过标签的内容来指定),但只能用于IE6.0以上版本的浏览器。3.3.3 submit标签示例例1:指定image类型的提交按钮,使用method属性。上述代码在客户端浏览器中的输出如下:注意生成的input元素的name属性。3.3.3 submit标签示例例2:指定button类型的提交按钮,使用action和method属性。上述代码在客户端浏

43、览器中的输出如下: 登录注意button标签的name属性。通过上面的例子可以看到name属性有二个前缀:method和action,这是struts2提供的一种特性,即使用一些预定义的前缀来命名一个按钮,通过按钮的名字来改变执行的行为。Struts2定义了4个前缀,如下:methodmethod:loginactionaction:userManagerredirectredirect:cancel.jspredirection-actionredirect-action:register3.3.3 method前缀使用method前缀,来取代action默认的execute()方法的执行。

44、例如一个表单同时用于用户注册和登录,那么可以编写代码如下:注意:1)对于input类型的提交按钮,不能通过submit标签的label属性来设置提交按钮上的文本,只能使用value属性。2)可以在submit标签的name属性中直接使用method前缀,也可以像前面给出的例子中使用submit标签的method属性来指定处理请求的action方法。3.3.3 action前缀使用action前缀,取代form标签指定的action,将请求导向到另外的action进行处理。示例:如果用户已经注册,可以直接登录,否则单击注册按钮,转到注册页面。action前缀也可以和struts2的动态方法调用结

45、合使用,例如:name=“action:userManager!register”.3.3.3 redirect前缀使用redirect前缀将请求重定向到其他的URL,甚至可以是Web应用程序外部的URL。示例:3.3.3 redirect-action前缀使用redirect-action前缀将请求重定向到其他的action。在内部,struts2使用ServletRedirectResult来执行这个任务。示例:3.3.3 reset标签reset标签输出一个重置按钮。 reset标签与form标签一起使用,用来提供表单的重置。 reset标签可以输出以下两种类型的重置按钮:input:等价于HTML代码

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论