独门架构java web开发应用详解_第1页
独门架构java web开发应用详解_第2页
独门架构java web开发应用详解_第3页
独门架构java web开发应用详解_第4页
独门架构java web开发应用详解_第5页
免费预览已结束,剩余20页可下载查看

付费下载

下载本文档

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

文档简介

1、第 13 章Strtus 2 的常用Struts 2 和 Struts 1 一样,也提供了大量的。但 Struts 2库整合了 DOJO 技术,可以生成的页面效果。除此之外,Struts 2 还提供了很多在 Struts 1 中没有的和功能,如日期选择器、树形结构、和模板等。13.1控 制Struts 2 的非 UI包括控制和数据。其中控制主要完成条件逻辑、循环逻辑的控制,以及对集合的合并、排序等操作。本节将主要介绍如下几个控制:if:用于控制条件逻辑的,可以和 elseif、else 配合使用,也可以单独使用。elseif:与 if 结合使用,用于控制条件逻辑的else:与 if 结合使用,

2、用于控制条件逻辑的。iterator:用于处理循环逻辑。一般用于处理集合对象。append:用于将多个集合拼接成一个新的集合。13.1.1if/elseif/elseif/elseif/else 这 3 个都可用于控制条件逻辑,其中 if、elseif通过 test 属性返回一个值,并根据该值是否为 true 来决定是否执行体,当 if、elseif的 test 属性值都为 false 时,执行 else的体。可以单独使用,也可以与和这 3 个中的组合使用,但和不能单独使用,这两个必须和组合使用。if/elseif/else组合使用的语法格式如下:体体实际上,这 3 个的使用方法和 Java

3、语言中相应的条件控制语句的用法相似,如在下面的 JSP 代码中使用这 3 个来判断请求参数 grade 的值,并输出相应的等级信息:在浏览器地址栏中输入如下的 URL:按正常的逻辑,上面的代码应该在浏览器中输出“优秀”,但并未输出这条信息,而是抛出了图 13.1 所示的异常。也许有的读者会感到奇怪,condition.jsp 页面在 Struts 2.x 的版本中可正确输出信息,但是却在本书所使用的 Struts 版本中抛出异常。实际上,原因也非常简单,读者可以选择一个 Struts 2 的老版本,如 Struts 2.0.6,并打开jar 包中位于 META-INF 目录中

4、的 struts-tags.tld 文件,可查找到如下所示的 if 和 elseif置代码:的配402if.apache.struts2.views.jsp.IfTagif/elseif/else=90¶m.grade优秀=80¶m.grade良好=70¶m.grade中等=60¶m.grade及格不及格体图 13.1condition.jsp 页面抛出的异常从上面的配置代码可以看出,if 和 elseif的 test 属性的值都是 true,说明在 Struts 2.0.6 中 if 和 elseif的 test 属性可以使用 EL 表达式。读者可以按同样的方

5、式打开本书所采用的 Struts 的 struts-tags.tld 文件,会发现 if和 elseif的 test 属性的值都是 false,也就是说,在 Struts 中默认情403testtruetrueelseif.apache.struts2.views.jsp.ElseIfTagtesttruetrue况下 if 和 elseif的 test 属性都不支持 EL 表达式。事实上,从 Struts 2.0.10 开始,的值就已经是 false 了,据 Apache认情况下,将 EL 表达式关闭了。解释,由于 EL 存在着潜在的安全风险,因此,在默如

6、果读者想在 Struts 2.0.10 及以后的版本中的 if 和 elseif中使用EL 表达式,可以先将struts-tags.tld 文件解压,并将 if 及 elseif 的值改为 true 后,将 struts-tags.tld 文件重新加入到 struts 的 jar 包中,并覆盖原来的 struts-tags.tld 文件即可。打开其他的EL 表达式支持,也可采用同样的方法。按上述方法修改了 if 和 elseif 的值后,再次下面的 URL:这时浏览器将输出“优秀”。如果读者不想修改 struts-tags.tld 文件,也不想使用 EL 表达式,可以在 te

7、st 属性中使用 OGNL 表达式。但要注意,如果判断请求参数,不能写成如下的形式:在 Struts 2 中,要取得请求参数的值,然后进行逻辑运算,应先在 Action 类中定义属性来封装请求参数,并通过结果转入 condition.jsp 页面,再使用 OGNL 表达式进行逻辑运算。如下面 Action 类的代码所示:在通过 SUCS 结果转入 condition.jsp 页面后,可以通过如下的代码来进行逻辑运算:13.1.2iteratoriterator主要用于对集合进行扫描,这里的集合包括数组、List、Set 以及 Map 对象。使用对集合进行迭代时可以使用如下 3 个属性:404=

8、90&grade优秀public class Condition extendionSupportprivategrade; publicgetGrade()return grade;/grade 属性的setter 方法public void setGrade(grade)this.grade=grade;/处理控制逻辑的execute 方法public String execute()return SUCS;=90图 13.2使用 iterator迭代import import publiccom.opensymphony.xwork2.*; java.util.*;class Itera

9、torAction extend输出集合中的所有元ionSupportprivaistpoetry=new ArrayList();public ListgetPoetry()return poetry;public void setPoetry(Listpoetry)this.poetry = poetry;public String execute()throws Exceptionpoetry.add(白日依山尽);poetry.add(入海流);poetry.add(欲穷千里目); poetry.add(更上一层楼);return SUCS;405.jspIteratorAction

10、类的配置代码如下:使用输出 poetry 属性的代码如下:在浏览器地址栏中输入如下的 URL:浏览器将显示和图 13.2 相同的信息。通过的 sus 属性,可以获得每一个被迭代的集合元素的各种信息,sus 属性指定了描述当前集合状态信息的 IteratorSus 对象,IteratorSus 类包括如下几个方法:getCount:该方法返回一个getIndex:该方法返回一个isEven:该方法返回一个类型的值,表示当前已经迭代的集合元素个数。 类型的值,表示当前集合元素的索引(从 0 开始)。类型的值,表示当前迭代的元素索引是否为偶数。类型的值,表示当前迭代的元素是否为集合的第一个元素。类型

11、的值,表示当前迭代的元素是否为集合的最后一个is:该方法返回一个isLast:该方法返回一个元素。isOdd:该方法返回一个类型的值,表示当前迭代的元素索引是否为奇数。下面的代码利用 IteratorSus 类的 odd 属性实现偶数行改变背景色,并在第一列显示 index属性值:406tr style=background-color:#CCCCCC/chapter13/iterator.jsp在浏览器地址栏中输入如下的 URL:浏览器显示的信息如图 13.3 所示。除此之外,还可以扫描 Map 类型的对象。在扫描 Map 类型的对象时,将每一个 key-value 对象看做一个元素,也就是

12、有几个 key-value 对,就会循环几次。在扫描的过程中,可以分别输出当前元素的 key 和 value,这两个值可以通过当前元素的Mntry 类的 key 和 value 属性输出,如下面的代码所示:在浏览器地址栏中输入如下的 URL:浏览器显示的信息如图 13.4 所示。图 13.3根据 odd 属性改变偶数行背景色图 13.4使用 iterator 扫描 Map 对象407类型tr style=background-color:#CCCCCC13.1.3appendappend用于将多个集合合并成一个新集合,以便通过可以对这个新集合进行扫描,并处理该集合中的每一个元素。使用时需要指定

13、一个 id 属性,该属性指定一个新集合的名字。在中可以指定多个子,每一个子指定一个集合。下面的代码将两个集合合并成一个集合,并使用个元素:输出合并集合中的每一在浏览器地址栏中输入如下的 URL:end.jsp浏览器显示的信息如图 13.5 所示。除了可以合并多个集合外,还可以合并 Map 类型的对象,甚至可以将 Map 类型的对象和 List对象进行合并,如下面的代码所示:图 13.5 使用append合并两个集合,飞流直下三千尺,疑是,Visual Studio:408tr style=background-color:#CCCCCCtr s:if test=#ss:propertys:pr

14、opertyus.oddstyle=background-color:#CCCCCCvalue=key/value=value/如果将 List 对象和 Map 对象合并,将生成一个新的 Map 对象,而且 List 对象的元素都将作为新 Map对象的 key,而 value 为空。在浏览器地址栏中输入如下的 URL:append.jsp浏览器显示的信息如图 13.6 所示。图 13.6使用 append合并 List 和 Map13.2数 据数据主要用于提供各种与数据相关的功能,如创建一个类的对象实例、输出国际化信息和包含其他的 Web 资源等。本节将介绍如下几个数据:action:该用于在

15、 JSP 页面中直接使用一个 Action,可以将 executeResult 属性设为true,还可以将该 Action 的处理结果直接包含到本页面中。bean:该用于创建一个 JavaBean 对象实例。如果指定 id 属性,可以将创建的 JavaBean对象实例放入 Stack Context 中。include:该param:该set:该用于在 JSP 页面中包含其他的 Web 资源(如 JSP、Servlet 等)。用于设置一个参数,通常作为 bean、append 等的子。用于定义一个新变量,并将该变量保存在指定的范围内。property:该中的值。用于输出某个值,包括输出 Val

16、ueStack、Stack Context 和 Action Context13.2.1actionaction允许在 JSP 页面中调用 Action。在Action 时,Action 的名字是必不可少的。当然,如果 Action 所在的包指定了 namespace 属性,还必须在调用 Action 时指定 namespace。除了调用 Action 外,action包含在当前页面中。action还可以通过 executeResult 属性选择是否将处理结果(视图资源)有如下几个属性:name:该属性指定了要调用的 Action 的名字。id:该属性指定了要Action 的对象实例。的 Ac

17、tion 的对象实例名,在 JSP 页面中可以通过该名字来409namespace:该属性指定了 Action名空间名。executeResult:该属性指定了是否将处理结果页面包含在当前页面中。该属性的默认值为 true,即包含处理结果页面。executeResult 属性的默认值为 false,即不包含。ignoreContextParams:该属性指定是否将当前页面的请求参数传给 action的Action。该属性的默认值为 false,即将当前页面的请求参数传入被的 Action。flush:该属性指定了是否应该在 action结束时刷新缓存。该属性的默认值为 true,即在 acti

18、on结束时刷新缓存。下面的 Action 类将在 JSP 页面中被调用。这个 Action 类非常简单,有一个 value 属性(该属性用于封装请求参数)和一个逻辑处理方法 execute。该 Action 类的实现代码如下:MyAction 类的配置代码如下:其中 succ.jsp 是 sucs 结果转入的页面,代码如下:410调用成功调用成功,value=/chapter13/succ.jsppackage chapter13;import com.opensymphony.xwork2.*;public class MyAction extendionSupportprivate Str

19、ing value; public String getValue()return value;public void setValue(String value)this.value=value;Overridepublic String execute()throws Exceptionreturn SUCS;下面的 JSP 代码通过来MyAction:在上面的 JSP 代码中,通过 executeResult 属性来控制是否将 Action 的处理结果包含在当前页面中。并在第一次调用 MyAction 时将的 id 属性设为 myAction,然后通过如在浏览器地址栏中输入如下的 URL

20、:浏览器显示的信息如图 13.7 所示。从图 13.7 显示的内容可以看出,在action.jsp 页面时包含了一个名为 value 的请求参数,而在第一次MyAction 时,将请求参数传给了 MyAction,因此,在页面中输出了请求参数411action调用Action,将结果包含到本页面中,并将请求参数传入Action直接Action 的属性:MyAction.value:调用Action,将结果包含到本页面中,未将请求参数传入Action调用Action,未将结果包含到本页面中,将请求参数传入Action直接获得请求参数,value=直接Action 的属性:MyAction.val

21、ue:的值。而在第二次MyAction 时,并未将请求参数传入 MyAction,因此,在 succ.jsp 中输出的 value 属性值为空串。而在第三次调用 MyAction 时,虽然未包含处理结果页面,但仍然将请求参数传入 MyAction,因此,通过 MyAction 对象实例的 value 属性仍然可以输出请求参数值。图 13.7使用 action调用 Action13.2.2beanbean用于创建一个 JavaBean 的对象实例。如果在创建JavaBean 对象时,需要设置 JavaBean的属性,可以在 bean体内使用。从技术层面看,bean和 action该 Action

22、,而都可以调用 Action 类,但 action的调用相当于通过 Action 的 Web 路径bean只是简单地创建 Action 类的对象实例,相当于 Java 中的 new 关键字。在使用 bean 和action时应注意它们的区别。bean有如下几个属性:name:该属性指定要创建对象实例的 JavaBean 的实现类。id:该属性指定了 JavaBean 对象的实例名。如果指定该属性,则 JavaBean 的对象实例会被放入 Stack Context(不是 ValueStack)中,并允许通过 id 属性所指的对象实例名来访问该 JavaBean 的对象实例。由于 bean在创建

23、 JavaBean 对象时,将该对象放在了 ValueStack 的栈顶,因此,在 bean体内可以直接使用 JavaBean 的属性。一旦 bean结束,JavaBean 对象会从 ValueStack的栈顶删除,这时要想象实例名。该 JavaBean 对象,必须在 bean中使用 id 属性指定 JavaBean 对下面是一个简单的 JavaBean,这个 JavaBean 将在 JSP 页面中被。该JavaBean 有两个属性:name 和 grade,这两个属性在中输出这两个属性值。中被赋值,并在当前页面412下面的 JSP 代码通过创建了 Student 的对象实例,并在体内为该对象

24、的两个属性赋值,并输出这两个属性的值:在浏览器地址栏中输入如下的 URL:浏览器显示的信息如图 1如果想在对象实例,可以在 JSP 代码所示:示。外使用该创建的 JavaBean中指定 id 属性,如下面的图 13.8使用 bean创建JavaBean 的对象实例413 Student 的属性值: name:grade:package chapter13; public class Studentprivate String name; privategrade;/name 属性的 getter 方法public String getName()return name;/name 属性的 se

25、tter 方法public void setName(String name)=name;/grade 属性的 getter 方法publicgetGrade()return grade;/grade 属性的 setter 方法public void setGrade(grade)this.grade=grade;在上面的 JSP 页面后,将会得到和图 13.8 完全相同的输出信息。13.2.3includeinclude如下几个属性:用于在当前页面包含另外一个 Web 资源,如 Html、JSP、Servlet 等。该有value:该属性指定被包含的 Web 资源的 URL

26、,如 included.jsp、/chapter3/css html 等。id:该属性指定 include的 ID。给被包含的 Web 资源传递请求参数。在下面的 JSPinclude还可以通过代码中,通过 include包含了一个 css.html 页面和一个 included.jsp 页面:在浏览器地址栏中输入如下的 URL:浏览器显示的信息如图 13.9 所示。图 13.9使用 include包含其他的页面414include css.html 页面的内容Student 的属性值: name: grade:13.2.4paramparam主要用于为其他的下几个参数:提供参数,如 incl

27、ude、append 等。param有如name:该属性指定要设置的参数名。value:该属性指定要设置的参数值。id:该属性指定该元素的 ID。param是 param除了可以通过 value 指定参数值外,还可以在 param的两种用法,通过 value 属性指定参数值:体中指定参数值,下面在 param体中指定参数值:bill上面两条语句为 name 属性设置了一个字符串值(bill)。在使用3 点需要注意:时有如下在为属性设置字符串值时,如果使用 value 属性设置该值,需要加单引号(),如果使用param体设置该值时,不需要加单引号()。如果使用 value 属性指定参数值时未加单

28、引号,则表示该值是一个对象,如果该对象不存在,则为属性赋 null 值。如果在 param中指定 name 属性,则外层指定的对象必须有该属性相对应的 setter方法,如果外层Parametric 接口。指定的对象没有相应的 setter 方法,则外层必须实现 Unnamed13.2.5propertyproperty的作用就是输出指定的值。该输出的值用 value 属性指定,如果未指定该有如下几个属性:属性,则输出 ValueStack 栈顶的值。propertyvalue:该属性指定需要输出的值,如果未指定该属性的值,则默认输出 ValueStack 栈顶的值。default:如果需要输

29、出的值为 null,则输出 default 属性指定的值。esc:该属性指定是否忽略输出值中的 HTML 代码,该属性的默认值是 true,即忽略输出值中的 HTML 代码。id:该属性指定property的 ID 值。的主要功能,读者也可以参下面的代码演示了的使用方法。面章节中的415property在浏览器地址栏中输入如下的 URL:浏览器显示的信息如图 13.10 所示。13.2.6setset用于将某一个值保存在指定的范围内, 例如application 范围、request 范围等。如果某个值需要很深的访问层次的话,例如 ,在每次该值时不仅会降低性

30、能,而且会使程序变得不易,为了避免这个问题,可以使用 set将该值保存在指定的范围内,当图 13.10使用 property 输出信息有如下几个属性:再次该值时,只需要从某个范围取得该值即可。setname:该属性指定一个新的变量名。value:该属性指定赋给新变量的值,如果未指定该属性,则将 ValueStack 栈顶的值赋给新变量。scope:该属性指定保存变量的范围,该属性可以是 application、ses、request、page和 action 5 个范围。如果未指定该属性,则默认将变量保存在 Stack Context 中。id:该属性指定该的 ID 值。下面的代码将 stud

31、ent 对象及其属性值分别保存在了 application、ses默认的 Stack Context 中,而且将变量保存在 Stack Context 时由于未指定 set、request、page 和的 value 属性,因此,setpush会取 ValueStack 栈顶的值赋给新变量。而页面当前 ValueStack 栈顶的值是通过放入的。416set将 保存在 application 中s:property value=name esc=true/s:property value=name esc=false/在浏览器地址栏中输入如下的 URL:浏览器显示的信

32、息如图 13.11 所示。单击【Debug】,可以看到不同范围中的 student 对象及其属性的值,如图 13.12 所示。图 13.11使用 set将某个值保存在图 13.12使用 debug显示保存在指定的范围内不同范围内的变量值417将 student.grade 保存在 ses中将 student.grade 保存在 request 中将 Student 对象保存在 page 中将 student 对象放到 ValueStack 的栈顶,并保存在 Stack Context 中13.3表 单Struts 2 的表单通常用于向服务端提交用户输入的信息。大多数表单都有与其对应的HTML的

33、表单,例如,对应于 HTML 中的。在 Struts 2中有很多属性,这些属性中的大多数都和相应的 HTML相对应。13.3.1form、submit 和 resetform、submit 和 reset分别和 HTML 表单的 form、submit 以及 reset 相对应。其中 form是其他表单的上一层。可以通过 form的 action 属性指定 Action 名字,Struts 2中的 form的 action 属性不能是其他的 Web 资源,因为表单在提交时会在 action 属性值后面加上.action。如果 action 属性指定的 Action 需要指定命名空间,则需要指定

34、属性,代码如下:的 namespace上面的代码提交时会产生如下的 URL:其中/ssubmitles 是上下文路径,/action 是命名空间。用于提交表单,reset用于将当前表单中所有的表单元素都恢复到默认值,也就是在加载页面时,表单元素的 value 属性的初始值,如下面的代码如示:上面的代码是一个典型的表单,在该表单中有两个文本框,其中【】文本框的 value 属性有一个默认值,而【】文本框的默认值为空串,【学生】复选框的默认值为未选中。在浏览器地址栏中输入如下的 URL 会显示图 13.13 所示的页面。418form、reset、submit13/registor.jsp】按钮会

35、向 register 动作提交,单击单击【重置】按钮,会将表单中相应的表单元素恢复到默认值,也就是 value 属性的值。13.3.2checkboxlistcheckboxlist可以地创建多个复选框,也就是说,可以地生成多个图 13.13form.jsp 页面的显示效果。checkboxlist有如下几个常用属性:list:该属性指定要生成的复选框的数据。该属性值可以是数组、List、Map 和对象数组等类型。如 list=checkbox1, checkbox2。listKey:如果 list 属性值是对象数组,则该属性表示对象中作为 key 的属性,如 product.id。listV

36、alue :如果 list 属性值是对象数组,则该属性表示对象中作为 value 的属性,如product name。下面的代码使用 3 个 checkboxlist生成了 3 个项,这 3 个 checkboxlist 的 list 属性值分别是 List 对象、Map 对象和对象数组。上面代码中的第 3 个 checkboxlist使用了 Cities 类的 cities 属性返回了一个对象数组,该对象是 City 类的实例。City 类的实现代码如下:419checkboxlistCities 类的实现代码如下:在 checkboxlist.jsp 页面中还涉及一个 investigat

37、e 动作,该动作对应的 Action 类是 Investigate Action,在该类中定义了 3 个属性,分别对应 3 个 checkboxlist 表单提交的值,InvestigateAction类的实现代码如下:420package chapter13;import com.opensymphony.xwork2.*;public class InvestigateAction extendionSupportpackage chapter13; public class Citiespublic City getCities()City cities=new City4; citie

38、s0=new City(bj, );cities1=new City(sh, );cities2=new City(gz, 广州);cities3=new City(others, 其他); return cities;package chapter13; public class Cityprivate String abbreviation; private String name;public City(String abbreviation, String name)this.abbreviation=abbreviation; =name;public String

39、 getAbbreviation()return abbreviation;public void setAbbreviation(String abbreviation)this.abbreviation=abbreviation;public String getName()return name;public void setName(String name)=name;InvestigateAction 类的配置代码如下:用于显示用户结果的 investigate.jsp 页面的代码如下:421结果/chapter13/investigate.jspprivate S

40、tring hobbies;private java.util.Listj2eeServers; private java.util.Listcities; public java.util.ListgetCities()return cities;public void setCities(java.util.Listcities)this.cities=cities;public java.util.ListgetJ2eeServers()return j2eeServers;public void setJ2eeServers(java.util.List servers)j2eeSer

41、vers=servers;public String getHobbies()return hobbies;public void setHobbies(String hobbies)this.hobbies=hobbies;Overridepublic String execute()throws Exceptionreturn SUCS;在浏览器中输入如下的 URL:浏览器显示页面后,按图 13.14 所示选择复选框,单击【确定】按钮提交结果,浏览器显示的信息如图 13.15 所示。图 13.14使用 checkboxlist生成多个复选框图 13.15显示结果13.3.3combobox

42、combobox用于生成一个单行文本框和下拉列表框的组合,但这两个元素对应于一个请求参数,只有单行文本框中的值才是请求参数真正的值,而下拉列表框只是起到了辅助输入的作用。在使用该时,需要通过一个 list 属性来指定 combobox中列表项的数据源,该数据源可以是数组、List、Map 和对象数组。下面的代码中的 combobox对象:的 list 属性是一个 List如果 list 属性是一个数组或 List 对象,则选择下拉列表框后,被选中的项的相应信息就会被赋给单行文本框。在浏览器地址栏中输入如下的 URL:bobox.jsp在下拉列表框中选择其中任意一项,会出现图 13.16 所示的效果。从图 13.16 可以看出,被选中的“Android/OPhone 开发完全讲义”列表项被赋给了上面的单行文本框。如果 list 属性值是 Map 对象或对象数组,则选中列表值是 Map 或对象数组中相应元素的 key,如下面的代码如下:,被赋给单行文本框的422bobox name=book label=请选择您感的 labelition=top在上面的代码中,第一个

温馨提示

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

评论

0/150

提交评论