单击此处编辑母版标题样式,编辑母版文本样式,第二级,第三级,第四级,第五级,2021/4/28,#,JavaEE,实用教程,第,10,章,Struts,应用开发,授课教师:,第10章 Struts应用开发授课教师:,1,本章,内容,1 OGNL,2 Struts2,标签,3 Struts2,国际化,4 Struts2,中文处理,本章内容1 OGNL,2,10.1,OGNL,OGNL,称为对象图导航语言(,Object Graph Navigation Language,)。所谓对象图,即以任意一个对象为根,通过,OGNL,可以访问与这个对象关联的其它对象。,OGNL,与,EL,语言(,Expression Language,)相类似,都是功能表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能,同时,OGNL,也是实现,Struts2,标签的基础内容。,OGNL,在,Struts2,中主要实现两个方面的功能:,1,、表达式语言:实现将表单或,Struts 2,标签与特定的,Java,数据绑定起来,用来将数据移入、移出框架。,2,、类型转换:实现输入数据和输出数据的转换。,10.1 OGNLOGNL称为对象图导航语言(Object,3,1,、,OGNL,使用原理,OGNL,称为对象图导航语言。所谓对象图,就是将任意的一个对象设为根对象,通过这个对象使用,OGNL,方式,访问与这个对象相关联的对象。例如:,有一个,Student,类、,Classes,类、,Teacher,类,其中学生类关联到班级类,班级类关联到教师类,关系如图,10.1,所示。,1、OGNL使用原理,4,2 OGNL Context,OGNL,功能是基于,OGNL,上下文实现的,也就是,OGNL Context,。,OGNLContext,结构如图,10.2,所示。,OGNL Context,是,Map,类型数据,,OGNL Context,的存储内容可分为,2,部分,即,ValueStack,堆栈,和各类,Web,对象,其中,ValueStack,存放数据称为根对象,,ValueStack,中的数据,是由用户访问某个,Action,时,该,Action,各类属性值压入进栈所产生的,,ValueStack,内的数据访问时可以直接使用键名访问;而其他,Web,对象则是将各类,JSP,中的内置对象放置在,OGNL Context,中,访问时需要加,”#,号,”,。,2 OGNL Context,5,JavaEE应用开发教程_ppt课件-第十章-Struts应用开发,6,【例,10.1,】,OGNL,访问,Web,对象,打开,MyEclipse,新建一个名为,Chap10.1,的,WebProject,项目,并按例,9.1,中步骤添加,Struts2,框架,将,Struts2,添加到项目中后,双击,Web.xml,文件修改,Struts2,过滤器类,将过滤器的类改为,org.apache.struts2.dispatcher.Filter,Dispatcher,类。,选中,src,文件夹,新建一个名为,com.action,的包,选中该包新建类,类名:,OgnlTest,,如图,10.3,所示。,【例10.1】OGNL访问Web对象,7,OgnlTest,代码如图,10.4,所示。,OgnlTest代码如图10.4所示。,8,Struts.xml,文件配置如图,10.5,所示。,Struts.xml文件配置如图10.5所示。,9,选中,WebRoot,文件夹,新建一个,JSP,网页,名为,show.jsp,,具体如图,10.6,所示。,选中WebRoot文件夹,新建一个JSP网页,名为show.,10,10.2 Struts2,标签,Struts2,框架提供了丰富的标签库用来构建视图组件。,Struts2,标签库大大简化视图页面的开发,并且提高了视图组件的可维护性。按照标签库提供的功能可以把,Struts2,标签库分为,3,大类:,UI,标签、非,UI,标签和,Ajax,标签。,用户界面标签(,UI,标签):主要用来生成,HTML,元素的标签,可分为表单标签和非表单标签。,非用户界面标签(非,UI,标签):主要用来数据访问、逻辑控制,可分为数据标签和逻辑控制标签。,10.2 Struts2 标签Struts2 框架提供了丰富,11,10.2.1,表单标签,struts2,的表单标签可分为两类:,form,标签本身和包装,HTML,表单元素的其他标签。,form,标签本身的行为不同于它内部的元素。下面就对常用的标签进行讲解。,1,标签,checkbox,标签是复选框标签,格式如下:,10.2.1 表单标签,12,2,标签,checkboxlist,标签可以一次创建多个复选框,在,HTML,中可以使用多行,实现。,3,标签,combobox,标签生成一个单行文本框和一个下拉列表框的组合,两个表单元素对应一个请求,单行文本框中的值对应请求参数,下拉列表框只是起到辅助功能。,2 标签,13,【例,10.2,】,combobox,标签,接上例,在,WebRoot,中新建一个网页,名为,combobox.jsp,输入如下代码,:,combobox,标签的使用,【例10.2】combobox标签,14,4,标签,doubleselect,标签生成一个相互关联的列表框,在第一个列表框中选择某一项后,那么第二个列表框中将自动为在第一个列表框选定项的相关信息。,常用属性:,name,:指定第一个下拉列表框名称。,doubleName,:指定第二个下拉列表框的名称。,list,:指定第一个下拉列表框中选项的集合。,doubleList,:指定第二个下拉列表框中的选项集合。,listKey,:生成第一个下拉类表框,value,属性值,doubleListKey,:生成第二个下拉类表框,value,属性值,top,:指定是第一列表框。,已修改,4 标签,15,5,标签,file,标签用于在页面上生成一个上传文件的元素。上传文件的具体实现参考第,9,章例,9.7,。,6,标签,select,标签用来生成一个下拉列表框,通过指定,list,属性,系统会使用,list,属性指定的下拉列表内容。,常用属性:,size,:指定下拉文本框中可以显示的选择项个数,可选项。,multiple,:设置该列表框是否允许多选,默认值为,false,,可选项。,7,标签,token,标签的目的是为了防止用户多次提交表单,避免恶意刷新页面。,5 标签,16,8,标签,optiontransferselect,标签用来创建两个选项以及转移下拉列表项,该标签会自动生成两个下拉列表框,同时生成相关的按钮,这些按钮可以控制选项在两个下拉列表之间的移动、排序。,常用属性:,addAllToLeftLabel,:设置实现全部左移动功能的按钮上的文本。,addAllToRightLabel,:设置实现全部右移动功能的按钮上的文本。,addToLeftLabel,:设置实现左移动功能的按钮上的文本。,addToRightLabel,:设置实现右移动功能的按钮上的文本。,addAddAllToLeft,:设置全部左移动功能的按钮。,addAddAllToRight,:设置全部右移动功能的按钮。,addAddToLeft,:设置左移动功能的按钮。,addAddToRight,:设置右移动功能的按钮。,leftTitle,:设置左边列表框的标题。,rightTitle,:设置右边列表框的标题。,allowSelectAll,:设置全部选择功能的按钮。,selectAllLabel,:设置全部选择功能按钮上的文本。,multiple,:设置第一个列表框是否多选,默认是,true,。,doubleName,:设置第二个列表框的名字。,doubleList,:设置第二个列表框的集合。,doubleMultiple,:设置第二个列表框是否多选,默认是,true,。,8 标签,17,【例,10.3,】,标签,接上例,选择,com.action,包新建一个类,类名,LabelAction,,父类,Action,Support,,主要代码如下所示。其中,cnbook,enbook,两个成员添加,get,与,set,方法。,package com.action;,import java.util.ArrayList;,import java.util.List;,import javax.servlet.http.HttpServletRequest;,import org.apache.struts2.ServletActionContext;,import com.opensymphony.xwork2.ActionContext;,import com.opensymphony.xwork2.ActionSupport;,import com.entity.*;,public class LabelAction extends ActionSupport,private String cnbook;,private String enBook;,【例10.3】s:optiontransferselect,18,public String execute()throws Exception,ActionContext context=ActionContext.getContext();,HttpServletRequest request=(HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);,String cnbooks=request.getParameterValues(cnbook);,for(int i=0;icnbooks.length;i+),System.out.println(,中文图书,+cnbooksi+/t);,String enBooks=request.getParameterValues(enBook);,for(int i=0;ienBooks.length;i,+),System.out.println(,中文图书,+enBooksi+/t);,List lists=new ArrayList();,Book book1=new Book(1,struts2,权威指南,20.2);,Book book2=new Book(2,轻量级,javaeye,企业应用空实战,20.2);,Book book3=new Book(3,ajax,讲义,20.2);,lists.add(book1);,lists.add(book2);,lists.add(book3);,request.setAttribute(lists,lists);,return SUCCESS;,public String getCnbook(),return cnbook;,public void setCnbook(String cnbook),book=cnbook;,public String getEnBook(),return enBook;,public void setEnBook(String enBook),this.enBook=enBook;,public String execute()throw,19,选中,src,文件夹,新建一个名为,com.entity,的包,在该包下新建一个类,类名:,Book,,如图,10.10,所示。其中,,id,、,name,、,money,三个成员变量添加,get,与,set,方法。,选中src文件夹,新建一个名为com.entity的包,在该,20,选中,WebRoot,文件夹,新建一个,JSP,页面,文件名:,selectBo