struts1 action中session丢失

Struts1文件
&来源:读书人网&【读书人网():综合教育门户网站】
Struts1资料struts1 7大组件?ActionServlet 控制器?Action 包含事务逻辑?ActionForm 显示模块数据?数据模
Struts1资料
struts1 7大组件?ActionServlet 控制器?Action 包含事务逻辑?ActionForm 显示模块数据?数据模型 ActionMapping 帮助ActionServlet控制器将请求映射到操作 ActionForward 用来指示操作转移的对象 ActionError 用来存储和回收错误?Struts标记库 可以减轻开发显示层次的工作?mvc model------actionform v---------jsp contrl----actionservlet 核心控制器 业务控制器 action 1 helloworld(不带form) strutt1.2与1.3在lib上的差别 由于1.2中没有标签库包 ,所以需要相关的tld文件 (struts-bean.tld,struts-html.tld,struts-logic.tld,struts-nested.tld,struts-tiles.tld) (1)导包 拷贝需要相关的tld文件(1.2) (2)写action类 继承action 重写execute方法 public class HelloWorldAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //HelloWorldForm hwForm = (HelloWorldForm) //hwForm.setMessage("Hello World"); return mapping.findForward("success"); } } (3)在web-inf新建struts-config.xml文件 &?xml version="1.0" encoding="UTF-8" ?&&struts-config&&action-mappings&&action type="包名.类名" scope="session" path="/取个名字" input="/jsp页(如xx.jsp)"&&forward name="取个名字" path="/jsp页(如xx.jsp)"&&/forward&&/action&&action path="/取个名字" forward="/jsp页(如xx.jsp)"&&/action&&/action-mappings&&/struts-config&(4)在web.xml进行struts配置 &servlet&&servlet-name&action&/servlet-name&&servlet-class&org.apache.struts.action.ActionServlet&/servlet-class&&init-param&&span name="取个名字"&&/form-bean&&/form-beans&在action配置处加入 name=上面配置的form名 指定formbean的scope (request或者session) 可再次演示request属性值丢失问题 如下 &action type="com.Login" name="loginForm" scope="request" path="/login"&一个action只绑定一个form 演示 request或者session的formbean使用 action类中的代码 给HelloForm设置一个属性 HelloForm f=(HelloForm) f.setName("pppppppppp"); 采用BeanUtils拷贝属性值到相关的javabean中 Person p=new Person(); BeanUtils.copyProperties(p, loginForm); 在jsp页面上取出来 &/action&(3) actionform如何自动获取页面值 只需要form表单中名字与formbean名字相同即可 (4)ActionForm的类型自动转换 * 基本的数据类型都可以自动进行转换; * java.sql.Date 默认的转换格式是 yyyy-MM- * java.util.Date 默认不可以转换;可自定义类型转换器 自定义转换器的实现步骤: 1. 定义一个实现了Converter接口的类,并且实现convert方法; 2. 定义一个servlet来注册转换器,注册转换器引用ConvertUtils类的静态方法register(转换器,转换类型); * ConvertUtils.register(new UtilDateConverter(), java.util.Date.class); 3. 配置servlet时注意配上这个&load-on-startup&5&/load-on-startup&值要大于0,因为这个servlet要求在tomcat启动时初始化; 4. 第二种方法注册转换器通过实现PlugIn接口,在struts-config.xml中配置上&plug-in date.class utildateconverter convertutils.register system.out.println servletexception throws init void public httpservlet extends utildateconverterinitwithservlet administrator mons.beanutils.convertutils import javax.servlet.http.httpservlet javax.servlet.servletexception java.util.date com package d return e.printstacktrace block catch auto-generated todo e value try yyyy-mm-dd null instanceof date string sdf="new" simpledateformat stub method object type convert converter implements mons.beanutils.converter java.text.simpledateformat java.text.parseexception&&servlet-name&UtilDateConverterInitWithServlet&/servlet-name&&servlet-class&com.UtilDateConverterInitWithServlet&/servlet-class&&load-on-startup&3&/load-on-startup&方法2.使用struts中的plug-in进行注册 import java.util.D import javax.servlet.ServletE import mons.beanutils.ConvertU import org.apache.struts.action.ActionS import org.apache.struts.action.PlugIn; import org.apache.struts.config.ModuleC public class UtilDateConverterInitWithPlugin implements PlugIn { public void destroy() { } public void init(ActionServlet servlet, ModuleConfig config) throws ServletException { System.out.println("UtilDateConverterInitWithPlugin.init()"); ConvertUtils.register(new UtilDateConverter(), Date.class); } } 其中struts-config.xml文件加上 &plug-in classname="com.UtilDateConverterInitWithPlugin"&&/plug-in&* ActionForm中的其他属性 //以下属性都需要new 否则空指针 private List&string& friends = new ArrayList&string&(); private static String[] skillLevels = new String[] { "Beginner", "Intermediate", "Advanced" }; private Map&string object& skills = new HashMap&string object&(); private List tbList = new AutoArrayList(TestBean.class); public List&testbean& getTbList() { return tbL } public void setTbList(List&testbean& tbList) { this.tbList = tbL } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // TODO Auto-generated met } public void reset(ActionMapping mapping, HttpServletRequest request) { this.friends.clear(); } public Object getSkill(String key) { return skills.get(key); } public void setSkill(String key, Object value) { skills.put(key, value); } public Map getSkills() { } public String[] getSkillLevels() { return skillL } public List&string& getFriends() { } public void setFriends(List&string& friends) { this.friends = } //一下方法比上面少一个s 自己实现 public void setFriend(int index, String friend) { if (this.friends.size() & index) { /* 用指定的元素替代此列表中指定位置上的元素 */ this.friends.set(index, friend); } else { while (this.friends.size() & index) { this.friends.add(null); } this.friends.add(index, friend); } } //一下方法比上面少一个s 自己实现 public String getFriend(int index) { if (this.friends.size() & index) { return (String) this.friends.get(index); } else { } } AutoArrayList代码实现 public class AutoArrayList extends ArrayList { private Class itemC public AutoArrayList(Class itemClass) { this.itemClass = itemC } public Object get(int index) { try { while (index &= size()) { add(itemClass.newInstance()); } } catch (Exception e) { e.printStackTrace(); } return super.get(index); } } 输入页面示例 &?xml:namespace prefix = html /&&form method="post" action="collection_test.do"&Friend 1 :&text property="friend[0]"&&/text&&br&&!-- 调用setFriend(int index,String friend)--&Friend 2 :&text property="friend[1]"&&/text&&br&Friend 3 :&text property="friend[2]"&&/text&&br&java skill: &select property="skill(java)"&&!-- 调用setSkill(String key,Object value) --&&options property="skillLevels"&&/options&&/select&&br&jsp skill:&select property="skill(jsp)"&&options property="skillLevels"&&/options&&/select&&br&struts skill:&select property="skill(struts)"&&options property="skillLevels"&&/options&&/select&&br&tbList 1 :&text property="tbList[0].name"&&/text&&br&tbList 2 :&text property="tbList[1].name"&&/text&&br&tbList 3 :&text property="tbList[2].name"&&/text&&br&&input value="提交查询内容" type="submit"& &/form&输出页面示例 Friend 1:&?xml:namespace prefix = bean /&&write name="collectionForm" property="friend[0]"&&/write&&br&&/string&&/string&&/testbean&&/testbean&&/string&&/string&&/string&&/string&&/plug-in&&!-- 调用getFriend(int index)--& Friend 2:&write name="collectionForm" property="friend[1]"&&/write&Friend 3:&write name="collectionForm" property="friend[2]"&&/write&java skill :&write name="collectionForm" property="skill(java)"&&/write&&!-- 调用getSkill(String key) --& jsp skill :&write name="collectionForm" property="skill(jsp)"&&/write&struts skill :&write name="collectionForm" property="skill(struts)"&&/write& 跳转演示登录练习 地址栏斜杠的演示 / 如何精确定位action 多个方法的演示(增加,删除,修改) 3 Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的 并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 4 全局转发与局部转发 全局异常与局部异常 &global-forwards&&forward name="xxx" path="/global.jsp"&&/forward&&forward name="success" path="/uuu.jsp"&&/forward&&/global-forwards&全局转发 所有的action共用 局部转发 自己的action用 当两者重名时,优先选择局部转发 全局异常与局部异常(附件 struts1.x中的异常处理.txt) &global-exceptions&&exception type="包名.类名(如java.lang.ArithmeticException" path="/error.jsp" key="资源文件中的key"&&/exception&&/global-exceptions&在error.jsp页面 &errors&&/errors&获取异常信息 全局异常 所有的action共用 局部异常 自己的action用 当两者重名时,优先选择局部异常 5 资源文件的使用 默认情况下,Struts默认的资源文件为ApplicationResources.properties文件。 在src目录下建立一个properties文件 一般为ApplicationResource.properties 里面写着键值对信息 如 aaa=111 bbb=222 ccc=333 在 struts-config.xml中配置使用资源文件 与&action-mappings&同级别,一般在&action-mappings&后, &message-resources parameter="文件名(不需要后缀名)"&&/message-resources&如上的配置为&message-resources parameter="ApplicationResource"&&/message-resources& 如果该资源文件不在src目录下,而在其他包名下,则应加上包名,假设ApplicationResource.properties在com包下,则配置修改为 &message-resources parameter="com/ApplicationResource"&&/message-resources&资源文件中文乱码解决 native2ascii -encoding gbk ApplicationResources_zh_CN.properties temp.properties 或者用jinto插件进行编辑 在jsp页面上通过bean标记 可输出资源文件的内容 &message key="aaa"&&/message&在页面上将显示111 ActionError与ActionMessage actionError 1.1版本 1.2版本推出actionMessage actionMessage是actionError的父类 actionError从语义上一般是指错误信息 actionMessage指的是一般信息 ActionError类与ActionErrors类 ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中。ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的属性值,或是使用ActionErrors.GLOBAL_ERROR. 如下使用 ActionErrors errors = new ActionErrors(); ActionError error = new ActionError("资源文件中的key值",“要传递进去的参数值(一个或多个(字符串数组))"); errors.add(ActionErrors.GLOBAL_ERROR,error);//或者使用 errors.add("属性名",error ) saveErrors(req,errors); 在页面上通过 &errors&&/errors&显示所有错误 &errors property="属性名"&&/errors&显示对应的属性错误 ActionError类有两个构造方法 分别有一个参数和两个参数的一个参数的 参数就是资源文件中的键值两个参数的 第一个参数是资源文件中的键值,第2个参数是我们可以传进资源文件中的参数值 ActionMeaaage类与ActionMeaaages类 &messages id="aaa" property="属性名" message="true"&&write name="aaa"&&/write&&/messages&6 dispatchaction action类继承DispatchAction 不需要重写execute方法 否则失效 因为默认进入execute方法 (1)编写如下类似方法 public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("进入add方法"); return mapping.findForward(SUCCESS); } public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("进入update方法"); return mapping.findForward(SUCCESS); } (2)在action配置处加入parameter="method" (3)调用该action时传参数methoda=add或者其他方法名即可 小技巧 不需要强转 String name = (String) PropertyUtils.getSimpleProperty(form, "userName"); String password = (String) PropertyUtils.getSimpleProperty(form, "password"); 7 actionforward ActionForward aw=new ActionForward(); aw.setPath("/taglibdemo.jsp"); 8 标记库 三大核心 name property value(value可放到嵌套外 &multibox property="hobby" value="drink"&&/multibox&等价于&multibox property="hobby"&drink&/multibox&) &iterate&&write&filter="false" 显示含html标签的 输出int类型的时候加上format属性 format="#" &define&使用map中bean演示 &empty&&present&作用域是否存在当前name 复选框与下拉框使用 婚否:&checkbox property="marry"&&/checkbox& 单个复选框 &br&多个复选框爱好 :&multibox property="hobby" value="drink"&&/multibox&喝水 &multibox property="hobby" value="sleep"&&/multibox&睡觉 &multibox property="hobby" value="doxxx"&&/multibox&瞎搞 用&write&演示actionform // action中片段代码 //list中放简单基本数据 List listBasic=new ArrayList(); listBasic.add("test1"); listBasic.add("test2"); listBasic.add("test3"); listBasic.add("test4"); request.setAttribute("listBasic", listBasic); // list中 bean List listBean=new ArrayList(); TaglibBean tb=new TaglibBean(); tb.setName("TaglibBean1"); tb.setAge(11); tb.setMoney(12.4567); listBean.add(tb); tb=new TaglibBean(); tb.setName("TaglibBean2"); tb.setAge(12); tb.setMoney(12.111); listBean.add(tb); tb=new TaglibBean(); tb.setName("TaglibBean3"); tb.setAge(13); tb.setMoney(12.); listBean.add(tb); request.setAttribute("listBean", listBean); //hashmap 简单数据 Map map=new HashMap(); map.put("mapkey1", "mapvalue1"); map.put("mapkey2", "mapvalue2"); map.put("mapkey3", "mapvalue3"); request.setAttribute("map", map); //hashmap 放bean Map beanMap=new HashMap(); tb=new TaglibBean(); tb.setName("TaglibBean1map"); tb.setAge(11); tb.setMoney(12.4567); beanMap.put("mapkey1map", tb); tb=new TaglibBean(); tb.setName("TaglibBean2map"); tb.setAge(12); tb.setMoney(12.111); beanMap.put("mapkey2map", tb); tb=new TaglibBean(); tb.setName("TaglibBean3map"); tb.setAge(13); tb.setMoney(12.); beanMap.put("mapkey3map", tb); request.setAttribute("beanMap", beanMap); //html标签输出 使用filter=false String strTable=" &table border="1"&&tbody&&tr&&td&aaaa&/td&&/tr&&/tbody&&/table&"; request.setAttribute("strTable", strTable); //类似 if else String ifStr="xxx"; request.setAttribute("ifStr", ifStr); //单独bean 属性比较 if else tb=new TaglibBean(); tb.setName("onlyyou"); request.setAttribute("onlybean", tb); //jsp中片段代码 (附件taglibdemo.jsp) 1 logic:present与logic:iterate 简单集合数据&br&&present name="listBasic"&xxxx &iterate id="element" name="listBasic"&&write name="element"&&/write&&br&&/iterate&&/present&&notpresent name="listBasic"&作用域不存在listBasic &/notpresent&2 logicempty与logic:iterate 简单集合数据&br&&notempty name="listBasic"&&iterate id="element" name="listBasic"&&write name="element"&&/write&&br&&/iterate&&/notempty&&empty name="listBasic"&集合元素为空 &/empty&3 logicempty与logic:iterate list中 bean (含bean 中list)&br&&notempty name="listBean"&&iterate id="element" name="listBean"&&write name="element" property="name"&&/write&&br&&write name="element" property="age" format="#.00"&&/write&&br&&write name="element" property="money" format="#.000"&&/write&&br&&notempty name="element" property="list"&&iterate id="bean_list" name="element" property="list"&&write name="bean_list"&&/write&&br&&/iterate&&/notempty&&/iterate&&/notempty&4 logicempty与logic:iterate map&br&&notempty name="map"&&iterate id="element" name="map"&&write name="element" property="value"&&/write&&br&&/iterate&&/notempty&5 hashmap 放bean&br&&notempty name="beanMap"&&iterate id="element" name="beanMap"&&define id="map_bean" name="element" property="value"&&/define&&write name="map_bean" property="name"&&/write&&br&&/iterate&&/notempty&6 作用域中的简单字符串 html标签输出 使用filter=false&br&&present name="strTable"&&write name="strTable" filter="false"&&/write&&/present&7 类似if else&br&&equal name="ifStr" value="xxx"&等于 xxx &/equal&&notequal name="ifStr" value="xxx"&不等于 xxx &/notequal&7 类似if else 单独bean&br&&equal name="onlybean" property="name" value="xxx"&等于 xxx &/equal&&notequal name="onlybean" property="name" value="xxx"&&write name="onlybean" property="name"&&/write&&/notequal&9 动态form 不能通过new创建实例 减少actionform的个数 动态ActionForm是struts从1.1版本开始引入一项新的技术,即在创建ActionForm时 可以不用通过编程的方式而只要通过struts-config.xml文件中进行配置,以后在struts运行时,会自动根 据struts-config.xml中配置的DynaActionform来生成一个Action实例 为什么要使用DynaActionform 很显然随着应用程序的变大,数百个ActionForm 这样不仅编程起来麻烦,以后维护起来也麻烦,比如: 某个属性变化了,则需要修改源代码,然后重新编译,但是如果使用DynaActionform则只需要修改 struts-config.xml配置文件就行了。这样提高了应用程序的开发效率与应用程序的可维护性 声明动态Form 声明一个动态Form非常简单,只需要在struts- config.xml的&form-beans&元素中加入一个&form-bean&子元素,并使用&form- property&元素来定义动态Form的属性。我们可以定义的属性类型有简单属性(如String)、索引属性(如数组)、映射属性(如 HashMap)以及嵌套属性(属性类型是另一个类)。 对于动态Form来说,Form的类型必须是org.apache.struts.action.DynaActionForm或其子类。声明一个动态Form的代码如下: &form-bean type="org.apache.struts.action.DynaActionForm" name="dynamicForm"&&!-- 声明一个简单属性 --&&form-property type="java.lang.String" name="simpleProp" initial="bill"&&!-- 声明一个索引属性 --&&form-property type="java.lang.String[]" name="indexedProp"&&!-- 声明一个映射属性 --&&form-property type="java.util.HashMap" name="mappedProp"&&!-- 声明一个嵌套属性 --&&form-property type="com.bean.MyBean" name="nestedProp"&&/form-property&&/form-property&&/form-property&&/form-property&&/form-bean&动态Form的属性类型 下面列出了动态Form支持的简单属性的所有类型: java.math.BigDecimal java.math.BigInteger java.lang.Boolean java.lang.Byte java.lang.Character java.lang.Class java.lang.Double java.lang.Float java.lang.Integer java.lang.Long java.lang.Short java.lang.String java.sql.Date java.sql.Time java.sql.Timestamp DynaActionForm还支持由这些数据类型构成的数组(比如String)、Map接口的实 现类(比如java.util.HashMap)、 List接口的实现类(如 java.util.ArrayList)。如果你没有给属性设定初值,数字类属性会自动设定为0,对象类属性设定为null。 如果使用基本的 Struts标志库访问DynaActionForm对象的属性,访问的方法和访问普通ActionForm对象的方法相同。 如果使用动态Form,就无法使用泛型进行自动类型转换了 下面的代码演示了如何通过getter方法获得动态Form的属性值: DynaActionForm dForm = (DynaActionForm) String name = (String)dForm.get("name"); String[] hobbies = (String[])dForm.get(“hobbies”); String value1 = (String)dForm.get(“myMap”, “key1”); 下面的代码演示了如何通过getString和getStrings方法获得动态Form的属性值: String name = dForm.getString(“name”); // 相当于String name = (String)dForm.get("name"); String[] hobbies = dForm.getStrings(“hobbies”); // 相当于String[] hobbies = (String[])dForm.get(“hobbies”); 10 国际化 国际化资源文件命名规则: 前缀.&语言&_&地区&.properties 其中&语言&_&地区&一定要写正确,否则资源是无法正确加载的 ID lang_code lang_en lang_cn lang_hex lang_dec 1 af Afrikaans - South Africa 南非荷兰语 0x ar-ae Arabic(U.A.E.) 阿拉伯语 - 阿拉伯联合酋长国 0x 3 ar-bh Arabic(Bahrain) 阿拉伯语 - 巴林 0x3C01 15361 4 ar-dz Arabic(Algeria) 阿拉伯语 - 阿尔及利亚 0x ar-eg Arabic(Egypt) 阿拉伯语 - 埃及 0x0C01 3073 6 ar-iq Arabic(Iraq) 阿拉伯语 - 伊拉克 0x ar-jo Arabic(Jordan) 阿拉伯语 - 约旦 0x2C01 11265 8 ar-kw Arabic(Kuwait) 阿拉伯语 - 科威特 0x 9 ar-lb Arabic(Lebanon) 阿拉伯语 - 黎巴嫩 0x 10 ar-ly Arabic(Libya) 阿拉伯语 - 利比亚 0x ar-ma Arabic(Morocco) 阿拉伯语 - 摩洛哥 0x ar-om Arabic(Oman) 阿拉伯语 - 阿曼 0x ar-qa Arabic(Qatar) 阿拉伯语 - 卡塔尔 0x 14 ar-sa Arabic(Saudi Arabia) 阿拉伯语 - 沙特阿拉伯 0x ar-sy Arabic(Syria) 阿拉伯语 - 叙利亚 0x 16 ar-tn Arabic(Tunisia) 阿拉伯语 - 突尼斯 0x1C01 7169 17 ar-ye Arabic(Yemen) 阿拉伯语 - 也门 0x be Belarusian 白俄罗斯语 0x bg Bulgarian 保加利亚语 0x ca Catalan 加泰罗尼亚语 0x cs Czech 捷克语 0x da Danish 丹麦语 0x de German(Standard) 德语 - 标准 0x de-at German(Austrian) 德语 - 奥地利 0x0C07 3079 25 de-ch German(Swiss) 德语 - 瑞士 0x de-li German(Liechtenstein) 德语 - 列支敦士登 0x de-lu German(Luxembourg) 德语 - 卢森堡 0x el Greek 希腊语 0x en English 英语     30 en-au English(Australian) 英语 - 澳大利亚 0x0C09 3081 31 en-bz English(Belize) 英语 - 伯利兹 0x 32 en-ca English(Canadian) 英语 - 加拿大 0x en-gb English(British) 英语 - 英国 0x en-ie English(Ireland) 英语 - 爱尔兰 0x en-jm English(Jamaica) 英语 - 牙买加 0x en-nz English(New Zealand) 英语 - 新西兰 0x en-tt English(Trinidad) 英语 - 特立尼达岛 0x2C09 11273 38 en-us English(United States) 英语 - 美国 0x en-za English(South Africa) 英语 - 南非 0x1C09 7177 40 es Spanish(Spain - Modern Sort) 西班牙语 - 标准 0x040A 1034 41 es-ar Spanish(Argentina) 西班牙语 - 阿根廷 0x2C0A 11274 42 es-bo Spanish(Bolivia) 西班牙语 - 玻利维亚 0x400A 16394 43 es-cl Spanish(Chile) 西班牙语 - 智利 0x340A 13322 44 es-co Spanish(Colombia) 西班牙语 - 哥伦比亚 0x240A 9226 45 es-cr Spanish(Costa Rica) 西班牙语 - 哥斯达黎加 0x140A 5130 46 es-do Spanish(Dominican Republic) 西班牙语 - 多米尼加共和国 0x1C0A 7178 47 es-ec Spanish(Ecuador) 西班牙语 - 厄瓜多尔 0x300A 12298 48 es-gt Spanish(Guatemala) 西班牙语 - 危地马拉 0x100A 4106 49 es-hn Spanish(Honduras) 西班牙语 - 洪都拉斯 0x480A 18442 50 es-mx Spanish(Mexican) 西班牙语 - 墨西哥 0x080A 2058 51 es-ni Spanish(Nicaragua) 西班牙语 - 尼加拉瓜 0x4C0A 19466 52 es-pa Spanish(Panama) 西班牙语 - 巴拿马 0x180A 6154 53 es-pe Spanish(Peru) 西班牙语 - 秘鲁 0x280A 10250 54 es-pr Spanish(Puerto Rico) 西班牙语 - 波多黎各 0x500A 20490 55 es-py Spanish(Paraguay) 西班牙语 - 巴拉圭 0x3C0A 15370 56 es-sv Spanish(El Salvador) 西班牙语 - 萨尔瓦多 0x440A 17418 57 es-uy Spanish(Uruguay) 西班牙语 - 乌拉圭 0x380A 14346 58 es-ve Spanish(Venezuela) 西班牙语 - 委内瑞拉 0x200A 8202 59 et Estonian 爱沙尼亚语 0x eu Basque 巴斯克语 0x042D 1069 61 fa Farsi 波斯语 0x fi Finnish 芬兰语 0x040B 1035 63 fo Faeroese 法罗语 0x fr French(Standard) 法语 - 标准 0x040C 1036 65 fr-be French(Belgian) 法语 -
0x080C 2060 66 fr-ca French(Canadian) 法语 - 加拿大 0x0C0C 3084 67 fr-ch French(Swiss) 法语 - 瑞士 0x100C 4108 68 fr-lu French(Luxembourg) 法语 - 卢森堡 0x140C 5132 69 gd Gaelic(Scots) 盖尔语 - 苏格兰 0x043C 1084 70 gd-ie Gaelic (Ireland) 爱尔兰盖尔语 0x083c 2108 71 he Hebrew 希伯来语 0x040D 1037 72 hi Hindi 印地语 0x hr Croatian 克罗地亚语 0x041A 1050 74 hu Hungarian 匈牙利语 0x040E 1038 75 in Indonesian 印度尼西亚语 0x is Icelandic 冰岛语 0x040F 1039 77 it Italian(Standard) 意大利语 - 标准 0x it-ch Italian(Swiss) 意大利语 - 瑞士 0x ja Japanese 日语 0x ji Yiddish 意第绪语 0x043D 1085 81 ko Korean 朝鲜语 0x lt Lithuanian 立陶宛语 0x lv Latvian 拉脱维亚语 0x mk Macedonian 马其顿语 0x042F 1071 85 ms Malaysian 马来语 - 马来西亚 0x043E 1086 86 mt Maltese 马耳他语 0x043A 1082 87 nl Dutch(Standard) 荷兰语 0x nl-be Dutch(Belgian) 荷兰语 -
0x no Norwegian(Bokmal) 挪威语 - 博克马尔 0x pl Polish 波兰语 0x pt Portuguese(Standard) 葡萄牙语 - 标准 0x pt-br Portuguese(Brazilian) 葡萄牙语 - 巴西 0x rm Rhaeto-Romanic 拉托-罗马语 0x ro Romanian 罗马尼亚语 0x ro-mo Romanian(Moldavia) 罗马尼亚语 - 摩尔多瓦 0x ru Russian 俄语 0x ru-mo Russian(Moldavia) 俄语 - 摩尔多瓦 0x sb Sorbian 索布语 0x042E 1070 99 sk Slovak 斯洛伐克语 0x041B
sl Slovenian 斯洛文尼亚语 0x1 sq Albanian 阿尔巴尼亚语 0x041C
sr Serbian(Cyrillic) 塞尔维亚语 - 塞瑞利克 0x0C1A
sv Swedish 瑞典语 0x041D
sv-fi Swedish(Finland) 瑞典语 - 芬兰 0x081D
sx Sutu 苏图语 0x6 sz Sami (Lappish) 芬兰地方语言 0x043b
th Thai 泰语 0x041E
tn Tswana 茨瓦纳语 0x9 tr Turkish 土耳其语 0x041F
ts Tsonga 汤加语 0x1 uk Ukrainian 乌克兰语 0x2 ur Urdu 乌尔都语 - 巴基斯坦 0x3 ve Venda 文达语     114 vi Vietnamese 越南语 0x042A
xh Xhosa 科萨语 0x6 zh-cn Chinese(PRC) 中文 - 中华人民共和国 0x7 zh-hk Chinese(Hong Kong SAR, PRC) 中文 - 中华人民共和国香港特别行政区 0x0C04
zh-sg Chinese(Singapore) 中文 - 新加坡 0x9 zh-tw Chinese(Taiwan Region) 中文 - 台湾地区 0x0 zu Zulu 祖鲁语 0x 修改浏览器语言 2 编码实现 把语言编码放进session中,其中session的名字为org.apache.struts.action.LOCALE,此后struts1就可以格局这个session值进行选择相对应的语言配置文件进行显示 例如 if(language.equals("chinese")) session.setAttribute("org.apache.struts.action.LOCALE", Locale.CHINESE); else session.setAttribute("org.apache.struts.action.LOCALE", Locale.ENGLISH); 11 验证以及验证框架一种是通过ActionForm的validate函数进行验证,另一种就是利用validate框架进行验证 校验没有通过 返回input指定的页面 必须配置input页面 六种类的关系: 1:普通form(从下向上继承) ActionForm //不用验证框架作验证 如要验证 重写validate方法 | | validatorForm //使用验证框架时必须继承它,但只能做同一种验证(即form验证) | | validatorActionForm //使用验证框架验证时,可以更为精确的去处理业务逻辑,针对的是不同的按键的path(即可以作不同的验证,如,既可以验证是否为空,又可以同时验证是否小于几位) 2:动态form(从下向上继承) DynaActionForm //不用验证框架作验证 如要验证 写一个form类继承它 重写validate方法 struts-config.xml配置时改为你写的类 | | DynaValidatorForm | | DynaValidatorActionForm 对于 validatorForm 和DynavalidatorForm 是针对form的验证 对于 validatorActionForm 和DynavalidatorActionForm 是针对path的验证 启动验证框架 在struts-config.xml配置验证框架插件 &plug-in classname="org.apache.struts.validator.ValidatorPlugIn"&&set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"&&/set-property&&/plug-in&可以通过在struts-config.xml中配置action时指定 validate="false" 关闭验证框架 创建Validation.xml 下面介绍一下validation.xml配置文件的标签: &form-validation&&/form-validation&是总框架 &formset&&/formset&是对Form里的数据进行配置 &form name="ActionForm对应的名称"&&/form&对一个ActionForm里的数据进行验证配置 &field property="ActionForm里的属性名" depends="验证规则,可以是Validation-rules里定义好的也可以是自定义的验证规则"&这里配置一个属性的验证内容 &arg0 name="对应的验证规则名称" key="可以直接填入数值,也可填入变量表达式:${var:变量名}" resource="true/false"&&var&&/var&定义一个变量的标签体,可以在里面具体设置变量的名称以及数值 &var-name&对应Key里定义的变量名称&/var-name&&var-value&值&/var-value&&msg name="对应的验证规则名称" key="资源文件中定义的key名称"&这里定义了key后,会使用自己的定义的key,否则使用验证规则默认定义的key 在验证规则中大部分可以使用已经预定义好的规则,它们在validator-rules.xml里,当然我们自己也可以定义规则。 其实,这个文件名可以是任意的,可以起成别的名字,比如:validators.xml,不过,也要相应修改struts-config.xml文件中的加入validator框架PlugIn中的value属性。这个value属性用来指定validator-rules文件和具体的验证文件。 1)根元素: validators.xml文件的“根元素(Root)”是form-validation, 意味着整个文件的内容包含在“&form-validation&”和“&/form-validation&”之间, 2)元素global: 这个东西包含constant子元素,用来定义一个全局的“验证限制”, 以便在这个文件的其他地方使用这些验证规则。 如下global phone的应用 &golobal&&constant&&constant-name&phone constant-name& &constant-value&7&/constant-value&&/constant-name&&/constant&&/golobal&&formset&&form name="loginValidatorForm"& &field property="userName" depends="required"&&msg name="required" key="invalid"&&!-- &msg name="required" key="invalid"/& 意思是当不满足验证规则required时将会用资源文件中key为invalid的值填充actionerror,相当于 ActionErrors errors=new ActionErrors(); errors.add("userName", new ActionError("invalid"));&!--userName为验证的属性名--&,之后在页面上用&errors property="userName"&&/errors&显示相应资源文件中的键值对应的提示信息 如果没有这句话,则不满足验证规则required时将会在资源文件中寻找默认的key值。默认的key值在验证规则文件中有,如required默认的key为errors.required 而如果设置resource="false" 即 &msg name="required" key="invalid" resource="false"&,则不使用资源文件 这里的key什么值,页面上就提示什么值 --& &arg0 key="username"&&/arg0&&/msg&&/msg&&/field&&field property="password" depends="required,minlength,maxlength"&&arg0 key="password"&&msg name="minlength" key="密码不能小于6位" resource="false"&&msg name="maxlength" key="密码不能大于8位" resource="false"&&var&&var-name&minlength&/var-name&&!--变量名必须为minlength --&&var-value&${phone}&/var-value&&!--phone为上面定义的常量 --&&/var&&var&&var-name&maxlength&/var-name&&!--变量名必须为maxlength --&&var-value&8&/var-value&&/var&&/msg&&/msg&&/arg0&&/field& &/form&&/formset&传参数到minlength &field property="password" depends="required,minlength"&&arg0 key="LoginForm.password"&&arg1 name="minlength" key="${var:minlength}" resource="false"&&!--resource="false" 表示不从资源文件取值,而是用当前值。而当前值${var:minlength}表示取变量名为minlength的值 --&&var&&var-name&minlength&/var-name&&var-value&6&/var-value&&/var&&/arg1&&/arg0&&/field&正则表达式例子 &field property="password" depends="required,mask"&&arg key="logonForm.password"&&var&&var-name&mask&/var-name&&var-value&^[0-9a-zA-Z]*$&/var-value&&!--数字与字母--&&/var&&/arg&&/field&日期验证例子 &field property="date" date&depends="required,date"& &arg key="userForm.date"&&var&&var-name&datePattern&/var-name&&var-value&yyyy-MM-dd&/var-value&&/var&&/arg&&/field&基本验证规则: 名称 描述 byte,short,integer, 检验值是否能被转换成对应的基本数据类型 long,float,double creditCard 检验输入域是否是一个合法的信用卡号码 date(有点失望) 检验输入域是否是一个合法日期 form中对应的date类型为字符串类型 只验证字符串类型 有点失望 email 检验输入是否是一个合法Email地址 mask 检验输入域是否能成功匹配一个正则表达式 maxLength 检验值的长度是否小于等于给定的最大长度 minLength 检验值的长度是否大于等于给定的最小长度 range 检验值的范围是否在最大值和最小值之间 required 检验输入域是否为不为空,或不包含空格值的长度是否大于零 12 tiles框架 Tiles框架提供了一种模板机制,它可以将网页内容和布局分离,并允许先创建模板,然后在页面中再插入具体的内容。 Tiles框架是Struts的一个插件。我们可以使用Tiles框架来进行页面布局设计。 使用tiles步骤 在所使用tiles标签页面引入 1 先定义一个模板 做好一个模板页面 例如 以下两种方式均可 1.1 使用&get&标签定义模板 &table border="1"&&tbody& &tr&&td&&get name="header"&&/get&&/td&&/tr& &tr&&td&&get name="main"&&/get&&/td&&/tr& &tr&&td&&get name="footer"&&/get&&/td&&/tr& &/tbody&&/table&1.2 使用&insert&标签定义模板 &table border="1" bgcolor="red"&&tbody& &tr&&td&&insert attribute="header"&&/insert&&/td&&/tr& &tr&&td&&insert attribute="main"&&/insert&&/td&&/tr& &tr&&td&&insert attribute="footer"&&/insert&&/td&&/tr& &/tbody&&/table&2 使用模板页面 使用&insert&与&put&标签 &insert page="模板页面.jsp"&&!--page为刚刚定义的模板页面 也可用template 如 &tiles:insert template="模板页面.jsp" & --&&put name="header" value="header.jsp"&&/put&&!--name 是刚刚在模板页面定义的名字 value表示要在该位置下放的页面 也可用content &tiles:put name="header" content="header.jsp"&&/tiles:put& --&&put name="main" value="main.jsp"&&/put&&put name="footer" value="footer.jsp"&&/put&&/insert&在struts1使用tiles 1 在Struts应用程序中使用Tiles,我们需要添加如下&plug-in&定义到struts-config.xml文件。 &plug-in classname="org.apache.struts.tiles.TilesPlugin"&&set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"&&set-property property="moduleAware" value="true"&&/set-property&&/set-property&&/plug-in&2 tiles-defs.xml 以下示例 定义baseLayout friends和office都继承了它 &?xml version="1.0" encoding="UTF-8" ?&&tiles-definitions&&definition name="baseLayout" path="/模板页面.jsp"&&:put name="header" value="/header.jsp"&&/:put&&:put name="main" value="/menu.jsp"&&/:put&&:put name="footer" value="/footer.jsp"&&/:put&&/definition&&definition name="friends" extends="baseLayout"&&!--继承baseLayout--&&:put name="body" value="/friends.jsp"&&/:put&&/definition&&definition name="office" extends="baseLayout"&&:put name="body" value="/office.jsp"&&/:put&&/definition&&/tiles-definitions&3 修改struts-config.xml 注意path的值 为 tiles-defs.xml文件中的定义definition name &action-mappings&&action type="com.vaannila.LinkAction" path="/Link" parameter="method"&&forward name="friends" path="friends"&&!--这里的path 与原来不一样哦--&&forward name="office" path="office"&&/forward&&/forward&&/action&&action path="/Welcome" forward="/welcomeStruts.jsp"&&/action&&/action-mappings&13 源代码&/plug-in&&/put&&/insert&&/insert&&/get&&/msg&&/arg0&&/field&&/form-&&/form-bean&&/form-beans&&/write&&/present&&/empty&&/define&&/write&&/iterate&&/action-mappings&&/action-mappings&

我要回帖

更多关于 struts1 action 的文章

 

随机推荐