Going on
在上次我们浅试水Struts2框架之后只不过建立了一个轻型的Struts2项目,其中已经应用到了Struts2的一些标签:
在JSP页面中引入标签库(使用@taglib命令):
<%@ taglib uri="/struts-tags" prefix="s" %>
其次是使用标签库:
<s:fielderror key="dataErr"></s:fielderror>
这个标签提供了错误信息的显示接口。
struts标签库简介
struts标签为我们提供了一个便捷的JSP页面书写方式。
每个标签包含了一定了逻辑。这样,使用struts标签可以尽量避免直接在JSP页面中使用java代码,从而使视图和控制器分离地更加清晰,使得页面更容易编写和维护。
Struts标签大致分为三类:
UI标签:用来生成User Interface(用户界面),包括HTML表单和非标单控件。
控制标签:用来做条件处理,迭代,处理和显示数据。
数据标签:用于输出action值栈中的数据,或者是将数据放入值栈。
按照惯例我们动手:(电脑重装上次的工程丢了=-=然后这次以Myeclipse 10.0为例)
首先来点UI标签的应用:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>登录页面</title> </head> <body> <s:form action="login.action" method="post"> <s:fielderror key="dataErr"></s:fielderror> <s:textfield name="user.username" key="用户名"></s:textfield> <s:password name="user.password" key="密码"></s:password> <br/> <s:submit value="提交"></s:submit> <s:reset value="重置"></s:reset> </s:form> </body> </html>
这个是上次login.jsp里面的内容,我改成这样子
按下F12之后我们发现一些新东西:
没错。在jsp里面的s:from变成了<from></from>表单不说,而且还多了一个<table class="wwFormTable"></table>
Login.jsp源码中<s:textfield name=“user.username” key=“用户名”></s:textfield>标签,变成了如下一大段代码:
<tr> <td class="tdLabel"> <label for="login_user_username" class="label">用户名:</label> </td> <td> <input type="text" name="user.username" value="" id="login_user_username"> </td> </tr>
可怕=-=
同样的: Login.jsp源码中<s:submit>标签,在浏览器端变成了<input type=“submit” id=“login_0” value=“提交”>,并且也套在table中。
Login.jsp源码中<s:password name="user.password" key="密码"></s:password>标签,变成了如下一大段代码:
<tr> <td class="tdLabel"> <label for="login_user_password" class="label">密码:</label> </td> <td> <input type="password" name="user.password" id="login_user_password"> </td> </tr>
可以看出来,struts的标签,一个包含HTML、CSS和JSP逻辑在内的组件。用户通过指定标签属性来调用该组件。可以快速地搭建页面。 Struts标签的设计,深刻地影响了许多其他web开发框架(例如angular, angular2, polymer等等。 )。这种方式又称为web组件(web components)式开发。在大公司项目中,使用web组件将强化代码结构的规范性,效果的统一性,与代码的重用性。有些大公司还根据自己的需要,制作自己的标准组件库。例如雅虎的dojo系列等等。
而这意味着我可以创建一个新的CSS文件在整个工程当中,而通过标签来改变整个布局。(不用把css写到jsp里美滋滋)
而在JSP里面要使用这些,得需要工程默认的一些东西:
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<link rel="stylesheet" href="<%=basePath%>/xxx.css" type="text/css"/>
通过struts2标签实现i18n
软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。
国际化(internationalization)又称为i18n,据说是因为internationalization这个单词从i到n之间有18个英文字母,i18n的名字由此而来。
对于程序中固定使用的文本元素,例如菜单栏、导航条等使用的文本元素、或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不同语言的文本为之服务(这需要配套的资源文件)。 对于程序动态产生的数据,例如日期,货币等,软件应能根据当前所在的国家或地区的文化习惯进行显示(这需要相应的格式转换)。
(页面多语言转换岂不美滋滋)
Struts2的资源文件通常命名为如下格式:
bundlename_language_country.properties 其中,bundlename是类名,language是语言类型,country是国家名。
类名有如下几种,分别对应不同的位置,以便进行语言翻译工作:
ActionClass.properties
Interface.properties
SuperClass.properties
model.properties
package.properties
struts.properties
global.properties
多语言开发应用程序,就必须保持相应的到那些语言/区域设置多个属性文件定义的键/值对中的所有内容。
例如,如果要开发应用程序(默认)为美国英语,西班牙语,和法语就必须创建三个属性文件。
global.properties: 默认情况下,英语(美国)将被应用
global_fr.properties: 这将是法语环境中使用。
global_es.properties: 这将被用于西班牙语言环境。
那试试?
说走就走:
先创建一个web service project,应用struts2 框架。
然后再SRC下创建:
(记得用UTF-8保存中文)
创建index.jsp,我们通过struts2标签来访问:
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Employee Form with Multilingual Support</title> </head> <body> <h1><s:text name="global.heading"/></h1> <s:url id="indexEN" namespace="/" action="locale" > <s:param name="request_locale" >en</s:param> </s:url> <s:url id="indexCN" namespace="/" action="locale" > <s:param name="request_locale" >cn</s:param> </s:url> <s:a href="%{indexEN}" >English</s:a> <s:a href="%{indexCN}" >简体中文</s:a> <s:form action="empinfo" method="post" namespace="/"> <s:textfield name="name" key="global.name" size="20" /> <s:textfield name="age" key="global.age" size="20" /> <s:submit name="submit" key="global.submit" /> </s:form> </body> </html>
再创建一个success.jsp用来返回确定成功的值:
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Success</title> </head> <body> <s:property value="getText(‘global.success‘)" /> </body> </html>
创建动作:
package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; public class Locale extends ActionSupport{ public String execute() { return SUCCESS; } }
用同样方法创建Employee
package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; public class Employee extends ActionSupport{ private String name; private int age; public String execute() { return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
在struts.xml下做这样一个设置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.custom.i18n.resources" value="global" /> <package name="helloworld" extends="struts-default" namespace="/"> <action name="empinfo" class="com.yiibai.struts2.Employee" method="execute"> <result name="input">/index.jsp</result> <result name="success">/success.jsp</result> </action> <action name="locale" class="com.yiibai.struts2.Locale" method="execute"> <result name="success">/index.jsp</result> </action> </package> </struts>