• 1. Struts2 标记库
    • 2. 本讲要点与教学目标【教学要点】 1、Struts2标记库的特性 2、Web处理结果的存储方式--值栈(ValueStack) 3、OGNL的应用 4、国际化支持 【教学目标】 了解Struts2标记库的特性,理解Web对请求处理结果的存储方式与存储特点,掌握OGNL的应用。
    • 3. Struts2标记库的特性【引言】 在前面的章节中,我们讲了Action处理客户端的请求,以及处理请求时拦截器所起的作用。 (1)在完成了请求处理后还需要做什么? --将处理得到的结果数据展示给用户。 (2)在MVC模型中哪个组件实现结果数据的展示? --视图 (3)Struts2下的数据如何存储?视图组件如何访问和展示这些数据? --OGNL与Struts2标记
    • 4. Struts2标记库的特性【标记库概述】 1、标记库 在JSP页面中除了可以使用HTML的静态标记和JSP2.0规范中的标准动作外,还可以引用外部的标记库,如: JavaEE5.0规范中提供了JSP标准标记库(JSTL) FCKEditor组件中提供了FCKEditor标记库 用户也可以开发自己的标记库并使用 标记的功能本质上是由该标记关联的一个类实现的 2、外部标记库的组成 一组标记类、一个标签库文件(tld文件)阅读struts-tags.tld 3、外部标记库的引用 在JSP中通过指令<%@taglib uri="" prefix=""%>引用
    • 5. Web处理结果的存储方式【Web数据存储】可以分为两部分: (1)Value Stack :值栈,每次在Action组件调用之前,框架都会创建一个ValueStack对象。用来存储与Action请求处理相关的Action组件以及模型对象 (2)Stack Context:栈环境,用来存储本次请求相关的Web运行环境信息,如应用上下文、会话和响应等 【在JSP中查看值栈】 <s:debug/> 可以输出整个ActionContext中的数据
    • 6. 标记的语言-OGNL OGNL—Object Graph Navigation Language(对象图导航语言)是一种功能强大的表达式语言,可以通过简单的表达式来访问Struts2中的数据。 OGNL表达式一般与Struts2标记一起使用,访问Web数据分为两种情况(Value Stack /Stack Context): 对Value Stack中的数据:直接对属性进行访问,如果该属性类型是对象,则可以使用点语法获取其内部属性 如:<s:property value="username"/> 对Stack Context中的环境数据:对其属性的访问要求以“#”号开始 如:<s:property value="#session.user.username"/>
    • 7. Struts2标记的种类1、控制标记 主要包含用于实现分支,循环等流程控制的标签 如:if elseif else iterator 2、数据标记 主要提供各种数据访问相关的功能 如:action property debug bean 等 3、UI标记 表单标记:允许客户端提交信息 非表单标记:显示错误信息、支持Ajax
    • 8. 控制标记if、elseif、else:实现分支控制功能 iterator:将集合进行迭代输出(循环) append、merge:对集合进行合并操作 generator:将一个字符串解析成一个集合 sort:将集合排序 subset:取集合子集
    • 9. if、elseif、else【描述】 1、if可以单独使用,也可与else、elseif搭配使用 2、if和elseif有一个必选类属性test,用来实现逻辑判断,test属性类型是OGNL逻辑表达式 3、标签体的内容可以是JSP网页元素
    • 10. if、elseif、else<h2>age=<s:property value="#parameters.age[0]"/></h2> <h2> <s:if test="#parameters.age[0]<16"> 儿童 </s:if> <s:elseif test="#parameters.age[0]<60"> <font color="red">青年</font> </s:elseif> <s:else> 老年 </s:else> </h2>
    • 11. 迭代控制标记-- iterator【描述】 用于遍历集合(java.util.Collection的子类)中的元素:List、Set、Map和数组 该标签的属性如下: id:指定集合中元素的ID引用 value:用来指定被迭代输出的集合,通常由OGNL表达式指定 status:代表当前迭代元素的状态,是IteratorStatus实例
    • 12. IteratorStauts实例包含方法int getCount():返回当前迭代过元素的总数。 int getIndex():返回当前迭代元素的索引。 boolean isEven():判断当前迭元素是否为偶数行。 boolean isOdd():判断当前迭元素是否为奇数行。 boolean isFirst():判断当前迭元素是否为第一个元素。 boolean isLast():判断当前迭元素是否为最后一个元素 IteratorStauts的这些方法分别对应了count, index,even,odd,first,last属性
    • 13. 例1:不使用status属性的迭代【说明】 value="{1,2,3}":{}表示集合,默认为List<s:iterator value="{1,2,3}"> <s:property />|| </s:iterator>
    • 14. 例2:使用status属性的迭代<s:iterator value="{'北京','上海','广州'}" id="name" status="st"> <s:if test="#st.even"> <font color="red"> <s:property value="#st.index+1" /> &nbsp; <s:property value="#name" /> </font><br> </s:if> <s:else> <font color="blue"> <s:property value="#st.index+1" /> &nbsp; <s:property value="#name" /> </font><br> </s:else> </s:iterator> 【说明】status="st",声明的st是一个局部对象,只能在迭代体中使用,其值临时保存在Stack Context中,取其属性时以"#"号开始
    • 15. 例3:Map类型元素的迭代Map类型元素 常量式为:#{key1:value1,key2:value2,其它元素}<s:iterator value="#{'name':'lucky','age':'20','email':'lucky@163.com'}" status="st"> <s:property value="#st.index+1"/>&nbsp; <s:property value="key"/>: <s:property value="value"/><br> </s:iterator>
    • 16. 数据标记概述property 用于输出value属性指定的值 action 用于在JSP页面中调用一个Action,如果指定其executeResult,则可以将Action处理结果包含到JSP中 bean 用于创建一个JavaBean实例,如果指定其id属性,则可以将创建的实例放到stack context中 param 用于设置一个参数,一般作为其它标记的子标记
    • 17. 数据标记概述set 设置一个新变量,并可以将新变量放到指定的范围中 push 用于将某个值放到Value Stack的栈顶 include 在JSP页面中包含其他JSP或Servlet资源 url 用于生成一个URL地址 date 用于格式化输出一个日期 debug 生成一个调试链接
    • 18. property【property标签属性】 value:指定需要输出的属性值,如果没有指定则默认输出value stack栈顶对象 default:指定默认输出值,当要输出的值为null时输出 escape:是否转义输出内容中的HTML(默认true) true时转义输出: <br>&lt;br&gt; false时直接输出: 换行<s:property value="username" default="空密码"/>
    • 19. action、param标记【action属性】 id:此Action在页面中的引用标识 name:要引用的action的名字 namespace:action所在的命名空间 executeResult:是否将结果包含到当前页中(false) 【param属性】 name:要传入的参数名 标记体中的内容以String类型传入的参数值
    • 20. 例6:action标记的使用【案例说明】 在index.jsp中引用Action,并将其结果视图的内容包含到当前页中 【基本步骤】 1、创建Action类:InAction,定义一个属性name, 2、在struts.xml中配置Action的名字为"in",所在包的namespace="/",视图为in_success.jsp 3、创建in_success.jsp,核心代码 <h2> 被包含的action视图:name--<s:property value="name" default="匿名"/> </h2>
    • 21. 例6:action标记的使用4、在index.jsp中加入如下代码: 5、分析运行结果,查看Action Context中的数据,是否有inaction1、inaction2两个属性<s:action id="inaction1" name="in" executeResult="true" namespace="/"> <s:param name="name">hello</s:param> </s:action> <s:action id="inaction2" name="in" executeResult="true" namespace="/"> </s:action>
    • 22. bean标记【属性】 id:用于引用该bean对象,如果指定该属性,框架将其放到Stack Context中 name:指定要实例化的JavaBean类 例: 测试分析 Stack Context中的信息变化<s:bean name="zzu.edu.tag.Dog" id="d"> <s:param name="name">金毛</s:param> </s:bean> 输出Bean对象的属性: <s:property value="#d.name" /><br>
    • 23. set标记【属性】 name:新创建的变量名 id:用于引用该元素 说明:如果没有id,则用name值引用变量,id优先 scope:存放的范围 application session request page action,默认放置在Stack Context中 value:指定赋给变量的值 例:<s:set value="#d" id="ddd"><br> </s:set> 输出变量dd的属性值:<s:property value="#ddd.name" />
    • 24. date标记【属性】 name:要格式化的日期值 id:引用元素的id format:指定日期输出格式<s:bean name="java.util.Date" id="today"></s:bean> 今天的日期是(原始格式): <s:property value="#today"/><br> <s:date name="#today" id="formatday" format="MM/dd/yyyy"/> 今天是(MM/dd/yyyy):<s:property value="#formatday"/>
    • 25. 什么是国际化?在很多国际化的网站中,可根据不同国家地区设置不同语言的版本,以方便不同国家和地区的用户访问, 如:清华大学网站 Google网站:http://www.google.com.hk/
    • 26. 什么是国际化?【国际化(internationalization,i18n)】是指在设计软件时使软件具有支持多种语言的功能。能够在创建不同语言版本时,无须修改应用程序源代码。 【软件国际化的特征】 (1)可扩展性:支持新语言时,不需要修改程序,不需要重新编译。通过增加和修改资源文件,可以增加对某种语言的支持、实现订制指定语言的界面显示 (2)全球化:能够运行于不同区域语言环境中,可以支持不同区域的语言文字和数据信息的输入、输出、显示和存储 (3)本地化:满足特定区域和语言环境,信息的输入和输出能够符合该区域的使用习惯,例如日期显示格式。
    • 27. 什么是国际化?【国际化涉及的方面】 (1)静态的文字显示 (2)与区域习惯相关的内容,如:日期时间、邮政编码、电话号码、地址、货币、度量等 (3)提示信息,如:警告、错误、操作提示、在线帮助等 【国际化的实施】 国际化不是在产品功能和代码基本完成后的一个附加阶段,而是应该从软件需求分析开始,并贯穿软件项目实施的全过程
    • 28. 一、Java国际化【相关类】 Java国际化主要使用3个类完成:Locale、ResourceBoundle、MessageFormat 【Locale类】对应一个特定区域和语言环境 (1)静态方法:Locale getDefault() (2)静态常量标识符:US、CHINA、JAPAN,CHINESE等 (3)获取国家、语言名:getCountry()、getLanguage() (4)获取适于显示的国家、语言名 getDisplayCountry()、getDisplayLanguage()
    • 29. 案例1:Locale类的基本应用public class Test { public static void main(String[] args) { Locale[] locales = Locale.getAvailableLocales(); //获取Java支持的语言和区域 for (int i = 0; i < locales.length; i++) { System.out.println(locales[i]+"-->" +locales[i].getDisplayLanguage()+"-" +locales[i].getDisplayCountry()); } Locale lo=Locale.getDefault();//获取本地系统默认的Locale对象 System.out.println(lo.getCountry()+","+lo.getDisplayCountry()); System.out.println(lo.getLanguage()+","+lo.getDisplayLanguage()); } }
    • 30. 一、Java国际化【ResourceBundle类】用于加载一个资源文件 资源包是一组资源文件,特点是基本名相同,在此基础上按一定命名规范进行扩展。命名规范如下: 基本名_语言名_国家名_开发商或浏览器.properties 其中最后一个扩展项“_开发商或浏览器”很少用 如下就是一组资源名为message的资源包 message.properties message_zh.properties message_zh_CN.properties
    • 31. 一、Java国际化获取资源对象的方法 (1)ResourceBundle getBundle(String baseName)使用指定的基本名称、默认的语言环境获取资源对象。 (2)ResourceBundle getBundle(String baseName,Locale locale)使用指定的基本名称和语言环境获取资源对象。 说明 (1)参数baseName是具有完整路径的基本名 (2)资源文件内容是标准的键值对(key-value)格式 获取键值的方法:String getString(String key)
    • 32. 一、 Java国际化【Java国际化基本步骤】 (1)创建资源文件:为准备支持的Locale编写对应的资源文件 (2)设置Locale:在程序中的某个地方,提供Locale的设置,或者将设置放入配置文件中 (3)根据Locale创建指定的资源绑定对象 (4)通过资源绑定对象获取与Locale相关的信息
    • 33. 案例2:Java国际化【具体步骤】 1、创建资源文件。为了实现程序国际化,本例创建两个资源文件Message_zh_CN.properties、Message_en_US.properties 2、创建一个Test类 main方法中的关键代码Locale lo=Locale.getDefault();//获取本地系统默认的Locale对象 ResourceBundle rb = ResourceBundle.getBundle("i18n.Message",lo); System.out.println(rb.getString("promote")); System.out.println(rb.getString("welcome"));
    • 34. 案例2:Java国际化3、运行测试: 4、将Locale lo=Locale.getDefault();改为: Locale lo=Locale.US; 运行测试:
    • 35. 二、 Struts2对国际化的支持【Struts2的国际化支持】 (1)Action组件的基类ActionSupport实现了TextProvider接口,该接口有一个方法getText(String key),用来从资源绑定对象中获取指定信息资源 (2)每个Action组件,不需要手动创建资源绑定对象,框架将自动创建该对象 (3)不需要手动获取Locale对象,框架将自动检测Web请求的Locale属性,并根据它动态关联资源文件 (4)提供了<s:text>、<s:i18n>等标记访问本地化信息 即:开发人员把准备好的相应资源文件放到合适的位置,然后在需要显示本地化信息的位置调用资源文件中的信息即可。
    • 36. 三、访问国际化消息的方法1、Action中访问国际化消息:getText(String key) 2、JSP中访问国际化消息有三种方法: (1)<s:text name="keyName"/> 如:<s:text name="homepage.title"/> (2)<s:property value="getText('keyName')"/> 如:<s:property value="getText('homepage.title')"/> (3)Struts2的UI标记中用国际化信息设置label属性时,不直接对label设置,而使用key属性,即:key="keyName“ 如: <s:textarea name="username" key="login.username"/> <s:submit key="login_submit"/>
    • 37. 四、Struts2国际化级别【Action级】 仅在指定的Action及视图中使用,资源文件基本名是Action类名,其位置与Action组件同一个目录, 【包级】 在指定包中的所有Action及视图中使用,资源文件基本名必须是package,其位置与Action组件同一个目录 【应用级】如果用到国际化,就要使用应用级的国际化 应用程序中所有Action及视图中使用,其位置必须放在根目录,其基本名可以任意,但必须在struts.xml中进行常量声明, 如:<constant name="struts.custom.i18n.resources" value="基本名"> 【临时指定】<s:i18n>标记可临时指定资源文件,有效范围在该标记内
    • 38. 案例5:应用级资源文件的使用(登录)【案例要求】 使用应用级的国际化资源文件对用户登录业务实现国际化 【案例分析】 与语言环境相关的内容:登录页中的输入提示、登录成功的欢迎提示 针对以上内容编写资源文件,并在视图中输出与语言环境相关的信息
    • 39. 案例5:应用级资源文件的使用(登录)【基本步骤】 1、在根目录下创建2个国际化资源文件,支持2种语言环境 2、在struts.xml中配置资源文件常量 3、创建用户登录页login.jsp和登录成功页index.jsp,并将页面中的与语言环境相关的信息使用国际化输出 4、创建和配置Action组件 (1)创建Action组件DoLoginAction并配置,实现用户模拟登录) (2)在struts.xml中直接配置名为“login”的Action组件,success视图为login.jsp,(使用默认的ActionSupport类
    • 40. 案例5:应用级资源文件的使用(登录)1、在根目录下创建两个资源文件 (1)i18n_en_US.properties (2)i18n.properties 2、在struts.xml中配置资源文件常量login.title=user login page login.username=username login.password=password login_submit=login home.title=login success! home.greeting=welcome you\!<constant name="struts.custom.i18n.resources" value="i18n“ />
    • 41. 案例5:应用级资源文件的使用(登录)3、创建视图 (1)login.jsp
    • 42. 案例5:应用级资源文件的使用(登录)3、创建视图 (2)home.jsp
    • 43. 案例5:应用级资源文件的使用(登录)4、Action组件 (1)DoLoginAction.java//属性 private String username; private String password; //省略getter/setter方法 //execute方法 public String execute() throws Exception { if("lucky".equals(username)&&"123".equals(password)){ return SUCCESS; } return INPUT; }
    • 44. 案例5:应用级资源文件的使用(登录)4、Action组件 (2)struts.xml中配置 5、修改浏览器默认语言环境并执行验证<package name="default" extends="struts-default" namespace="/"> <action name="login"> <result>/login.jsp</result> </action> <action name="dologin" class="com.actions.DoLoginAction"> <result>/home.jsp</result> <result name="input">/login.jsp</result> </action> </package>
    • 45. 小结标记库概述 Struts2标记库的特性 采用OGNL作为表达式语言 Web请求处理结果数据的存储方式 Value Stack值栈 Context Stack上下文(环境)栈 标记的语言—OGNL 可以方便获取值栈、上下文栈中数据

    该用户的其他文档