struts1

原创 2011年01月19日 12:18:00

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) form;
    //hwForm.setMessage("Hello World");
    return mapping.findForward("success");
      }
     }
  (3)在web-inf新建struts-config.xml文件
     <?xml version="1.0" encoding="UTF-8" ?>

  <!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">


  <struts-config>
    <action-mappings>
        <action input="/jsp页(如xx.jsp)"  path="/取个名字" scope="session"  type="包名.类名">          
         <forward name="取个名字" path="/jsp页(如xx.jsp)" />
        </action>
        <action path="/取个名字" forward="/jsp页(如xx.jsp)"/>
    </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>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
        </servlet>
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
  (5)运行  http://localhost:端口号/应用名/配置的path
     演示不同路径访问 以及传值回jsp页面

2 helloworld(在1的基础上 带form)

    (1) 编写ActionForm  继承ActionForm 里面提供相关属性的set与get方法
       
    (2) 在struts-config.xml配置 form-bean
       
     <form-beans>
        <form-bean name="取个名字" type="包名.类名"/>
     </form-beans>
       
     在action配置处加入 name=上面配置的form名 指定formbean的scope (request或者session)  可再次演示request属性值丢失问题
   
     如下
     <action path="/login" type="com.Login" name="loginForm" scope="request">

     一个action只绑定一个form
    
      演示 request或者session的formbean使用
      action类中的代码 给HelloForm设置一个属性
       HelloForm f=(HelloForm)form;
    f.setName("pppppppppp");


         采用BeanUtils拷贝属性值到相关的javabean中
    Person p=new Person();
        BeanUtils.copyProperties(p, loginForm);




   在jsp页面上取出来
    <%
        HelloForm f=(HelloForm)session.getAttribute("helloform"); //此处的属性helloform就是在struts-config.xml的formbean名称
        out.print(f.getName());

        %>
    (3) actionform如何自动获取页面值 只需要form表单中名字与formbean名字相同即可

    (4)ActionForm的类型自动转换
     * 基本的数据类型都可以自动进行转换;
     * java.sql.Date 默认的转换格式是 yyyy-MM-dd;
     * 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

         1.先申明一个转换类
        package com;

        import java.text.ParseException;
        import java.text.SimpleDateFormat;
        import java.util.Date;
        import org.apache.commons.beanutils.Converter;
        public class UtilDateConverter implements Converter {

            @Override
            public Object convert(Class type, Object value) {
                // TODO Auto-generated method stub
                System.out.println("UtilDateConverter.value=" + value);
                if (value == null) {
                    return value;
                }

                if (value instanceof Date) {
                    return value;
                }

                Date d = null;
                if (value instanceof String) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    try {
                        d = sdf.parse((String) value);
                    } catch (ParseException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                return d;
            }

        }


            2  方法1.使用servlet注册

        package com;

        import java.util.Date;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;

        import org.apache.commons.beanutils.ConvertUtils;

        /**
         * 注册java.util.date转换器
         *
         * @author Administrator
         *
         */
        public class UtilDateConverterInitWithServlet extends HttpServlet {

            @Override
            public void init() throws ServletException {
                System.out.println("UtilDateConverterInitWithServlet.init()");
                ConvertUtils.register(new UtilDateConverter(), Date.class);
            }

        }

              其中web.xml文件加上
        <servlet>
        <servlet-name>UtilDateConverterInitWithServlet</servlet-name>
        <servlet-class>com.UtilDateConverterInitWithServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
        </servlet>

    
        方法2.使用struts中的plug-in进行注册

            package com;

        import java.util.Date;
        import javax.servlet.ServletException;
        import org.apache.commons.beanutils.ConvertUtils;
        import org.apache.struts.action.ActionServlet;
        import org.apache.struts.action.PlugIn;
        import org.apache.struts.config.ModuleConfig;
        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"/>



         * 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 tbList;
        }

        public void setTbList(List<TestBean> tbList) {
            this.tbList = tbList;
        }

        public ActionErrors validate(ActionMapping mapping,
                HttpServletRequest request) {
            // TODO Auto-generated method stub
            return null;
        }

        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() {
            return skills;
        }

        public String[] getSkillLevels() {
            return skillLevels;
        }

        public List<String> getFriends() {
            return friends;
        }

        public void setFriends(List<String> friends) {
            this.friends = 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 {
                return null;
            }
        }
   
             
          AutoArrayList代码实现

            public class AutoArrayList extends ArrayList {  
           
            private Class itemClass;  
              
            public AutoArrayList(Class itemClass) {  
            this.itemClass = itemClass;  
            }  
              
            public Object get(int index) {  
            try {  
                while (index >= size()) {  
                add(itemClass.newInstance());  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return super.get(index);  
            }  
        } 


                  输入页面示例

        <html:form action="collection_test.do" method="post">
        Friend 1 :<html:text property="friend[0]"></html:text><br>   <!-- 调用setFriend(int index,String friend)-->
             Friend 2 :<html:text property="friend[1]"></html:text><br>
             Friend 3 :<html:text property="friend[2]"></html:text><br>
        java skill: <html:select property="skill(java)">   <!-- 调用setSkill(String key,Object value) -->
                <html:options property="skillLevels"/>
                  </html:select><br>
          jsp skill:<html:select property="skill(jsp)">
                <html:options property="skillLevels"/>
                  </html:select><br>
          struts skill:<html:select property="skill(struts)">
                   <html:options property="skillLevels"/>
                 </html:select><br>
            
             tbList 1 :<html:text property="tbList[0].name"></html:text><br>
             tbList 2 :<html:text property="tbList[1].name"></html:text><br>           
             tbList 3 :<html:text property="tbList[2].name"></html:text><br>             
         
        <input type=submit></input>
        </html:form>
   
         输出页面示例
        Friend 1:<bean:write name="collectionForm" property="friend[0]"/><br><!-- 调用getFriend(int index)-->
            Friend 2:<bean:write name="collectionForm" property="friend[1]"/><br>
            Friend 3:<bean:write name="collectionForm" property="friend[2]"/><br>
         
          java skill :<bean:write name="collectionForm" property="skill(java)"/><br><!-- 调用getSkill(String key) -->
          jsp skill :<bean:write name="collectionForm" property="skill(jsp)"/><br>
          struts skill :<bean:write name="collectionForm" property="skill(struts)"/>




     





跳转演示
登录练习

地址栏斜杠的演示  /  如何精确定位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 key="资源文件中的key" type="包名.类名(如java.lang.ArithmeticException") path="/error.jsp"></exception>
</global-exceptions>

在error.jsp页面 <html: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 parameter="ApplicationResource"/>

 如果该资源文件不在src目录下,而在其他包名下,则应加上包名,假设ApplicationResource.properties在com包下,则配置修改为
 <message-resources parameter="com/ApplicationResource"/>

 资源文件中文乱码解决 native2ascii -encoding gbk ApplicationResources_zh_CN.properties  temp.properties
   或者用jinto插件进行编辑

 
在jsp页面上通过bean标记 可输出资源文件的内容
  <bean:message key="aaa"/>
  在页面上将显示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);

在页面上通过

<html:errors />   显示所有错误

<html:errors property="属性名"/>  显示对应的属性错误

ActionError类有两个构造方法 分别有一个参数和两个参数的
一个参数的 参数就是资源文件中的键值
两个参数的  第一个参数是资源文件中的键值,第2个参数是我们可以传进资源文件中的参数值


  ActionMeaaage类与ActionMeaaages类
 

    <html:messages id="aaa" property="属性名" message="true">
    <bean:write name="aaa"/>
</html: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");
return  aw;

8 标记库    三大核心   name  property   value(value可放到嵌套外  <html:multibox property="hobby" value="drink" /> 等价于<html:multibox property="hobby" >drink</html:multibox>)
 <logic:iterate>
 <bean:write>  filter="false"  显示含html标签的  输出int类型的时候加上format属性  format="#"
 <bean:define>  使用map中bean演示
 <logic:empty>
 <logic:present> 作用域是否存在当前name
 复选框与下拉框使用
  
   婚否:<html:checkbox property="marry"></html:checkbox>  单个复选框

<br>  多个复选框
爱好 :<html:multibox property="hobby" value="drink" />喝水
     <html:multibox property="hobby" value="sleep"></html:multibox>睡觉
     <html:multibox property="hobby" value="doxxx"></html:multibox>瞎搞


 用<bean: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.2222222222);
        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.2222222222);
        beanMap.put("mapkey3map", tb);
        request.setAttribute("beanMap", beanMap);
       
        //html标签输出 使用filter=false
        String strTable="<table border=1><tr><td>aaaa</td></tr></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>
    <logic:present name="listBasic">
     xxxx
    <logic:iterate name="listBasic"  id="element" >
     <bean:write name="element"/><br>
    </logic:iterate>

    </logic:present>

    <logic:notPresent name="listBasic">
    作用域不存在listBasic
    </logic:notPresent>


2 logicempty与logic:iterate 简单集合数据<br>

<logic:notEmpty name="listBasic">
 
<logic:iterate name="listBasic"  id="element" >
 <bean:write name="element"/><br>
</logic:iterate>

</logic:notEmpty>


<logic:empty  name="listBasic">

集合元素为空
</logic:empty>



3 logicempty与logic:iterate  list中    bean   (含bean 中list)<br>

<logic:notEmpty name="listBean">
 
<logic:iterate name="listBean"  id="element" >
 <bean:write name="element" property="name"/><br>
 <bean:write name="element" property="age" format="#.00"/><br>
  <bean:write name="element" property="money" format="#.000"/><br>
       <logic:notEmpty name="element" property="list">
 
            <logic:iterate name="element"  id="bean_list" property="list">
             <bean:write name="bean_list"/><br>
            </logic:iterate>

        </logic:notEmpty>
       
       
</logic:iterate>

</logic:notEmpty>


4 logicempty与logic:iterate  map<br>

<logic:notEmpty name="map">
<logic:iterate name="map" id="element">
 <bean:write name="element" property="value"/><br>
  </logic:iterate>
</logic:notEmpty>

5      hashmap 放bean<br>

<logic:notEmpty name="beanMap">
<logic:iterate name="beanMap" id="element">
 <bean:define id="map_bean" name="element" property="value"/>
 <bean:write name="map_bean" property="name"/><br>
  </logic:iterate>
</logic:notEmpty>


6 作用域中的简单字符串  html标签输出 使用filter=false<br>
<logic:present name="strTable">
<bean:write name="strTable" filter="false"/>
</logic:present>


7 类似if else<br>

<logic:equal name="ifStr" value="xxx">
等于 xxx
</logic:equal >

<logic:notEqual name="ifStr" value="xxx">
不等于 xxx
</logic:notEqual >


7 类似if else  单独bean<br>
<logic:equal name="onlybean" property="name" value="xxx">
等于 xxx
</logic:equal >

<logic:notEqual name="onlybean" property="name" value="xxx">
<bean:write name="onlybean"  property="name"/>
</logic: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 name="dynamicForm"  type="org.apache.struts.action.DynaActionForm">
        <!-- 声明一个简单属性 -->
        <form-property name="simpleProp" type="java.lang.String" initial="bill"/>
        <!-- 声明一个索引属性 -->
        <form-property name="indexedProp" type="java.lang.String[]" />
        <!-- 声明一个映射属性 -->
        <form-property name="mappedProp" type="java.util.HashMap" />
        <!-- 声明一个嵌套属性 -->
        <form-property name="nestedProp" type="com.bean.MyBean" />
    </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)form;
    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 南非荷兰语 0x0436 1078
        2 ar-ae Arabic(U.A.E.) 阿拉伯语 - 阿拉伯联合酋长国 0x3801 14337
        3 ar-bh Arabic(Bahrain) 阿拉伯语 - 巴林 0x3C01 15361
        4 ar-dz Arabic(Algeria) 阿拉伯语 - 阿尔及利亚 0x1401 5121
        5 ar-eg Arabic(Egypt) 阿拉伯语 - 埃及 0x0C01 3073
        6 ar-iq Arabic(Iraq) 阿拉伯语 - 伊拉克 0x0801 2049
        7 ar-jo Arabic(Jordan) 阿拉伯语 - 约旦 0x2C01 11265
        8 ar-kw Arabic(Kuwait) 阿拉伯语 - 科威特 0x3401 13313
        9 ar-lb Arabic(Lebanon) 阿拉伯语 - 黎巴嫩 0x3001 12289
        10 ar-ly Arabic(Libya) 阿拉伯语 - 利比亚 0x1001 4097
        11 ar-ma Arabic(Morocco) 阿拉伯语 - 摩洛哥 0x1801 6145
        12 ar-om Arabic(Oman) 阿拉伯语 - 阿曼 0x2001 8193
        13 ar-qa Arabic(Qatar) 阿拉伯语 - 卡塔尔 0x4001 16385
        14 ar-sa Arabic(Saudi Arabia) 阿拉伯语 - 沙特阿拉伯 0x0401 1025
        15 ar-sy Arabic(Syria) 阿拉伯语 - 叙利亚 0x2801 10241
        16 ar-tn Arabic(Tunisia) 阿拉伯语 - 突尼斯 0x1C01 7169
        17 ar-ye Arabic(Yemen) 阿拉伯语 - 也门 0x2401 9217
        18 be Belarusian 白俄罗斯语 0x0423 1059
        19 bg Bulgarian 保加利亚语 0x0402 1026
        20 ca Catalan 加泰罗尼亚语 0x0403 1027
        21 cs Czech 捷克语 0x0405 1029
        22 da Danish 丹麦语 0x0406 1030
        23 de German(Standard) 德语 - 标准 0x0407 1031
        24 de-at German(Austrian) 德语 - 奥地利 0x0C07 3079
        25 de-ch German(Swiss) 德语 - 瑞士 0x0807 2055
        26 de-li German(Liechtenstein) 德语 - 列支敦士登 0x1407 5127
        27 de-lu German(Luxembourg) 德语 - 卢森堡 0x1007 4103
        28 el Greek 希腊语 0x0408 1032
        29 en English 英语    
        30 en-au English(Australian) 英语 - 澳大利亚 0x0C09 3081
        31 en-bz English(Belize) 英语 - 伯利兹 0x2809 10249
        32 en-ca English(Canadian) 英语 - 加拿大 0x1009 4105
        33 en-gb English(British) 英语 - 英国 0x0809 2057
        34 en-ie English(Ireland) 英语 - 爱尔兰 0x1809 6153
        35 en-jm English(Jamaica) 英语 - 牙买加 0x2009 8201
        36 en-nz English(New Zealand) 英语 - 新西兰 0x1409 5129
        37 en-tt English(Trinidad) 英语 - 特立尼达岛 0x2C09 11273
        38 en-us English(United States) 英语 - 美国 0x0409 1033
        39 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 爱沙尼亚语 0x0425 1061
        60 eu Basque 巴斯克语 0x042D 1069
        61 fa Farsi 波斯语 0x0429 1065
        62 fi Finnish 芬兰语 0x040B 1035
        63 fo Faeroese 法罗语 0x0438 1080
        64 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 印地语 0x0439 1081
        73 hr Croatian 克罗地亚语 0x041A 1050
        74 hu Hungarian 匈牙利语 0x040E 1038
        75 in Indonesian 印度尼西亚语 0x0421 1057
        76 is Icelandic 冰岛语 0x040F 1039
        77 it Italian(Standard) 意大利语 - 标准 0x0410 1040
        78 it-ch Italian(Swiss) 意大利语 - 瑞士 0x0810 2064
        79 ja Japanese 日语 0x0411 1041
        80 ji Yiddish 意第绪语 0x043D 1085
        81 ko Korean 朝鲜语 0x0412 1042
        82 lt Lithuanian 立陶宛语 0x0427 1063
        83 lv Latvian 拉脱维亚语 0x0426 1062
        84 mk Macedonian 马其顿语 0x042F 1071
        85 ms Malaysian 马来语 - 马来西亚 0x043E 1086
        86 mt Maltese 马耳他语 0x043A 1082
        87 nl Dutch(Standard) 荷兰语 0x0413 1043
        88 nl-be Dutch(Belgian) 荷兰语 - 比利时 0x0813 2067
        89 no Norwegian(Bokmal) 挪威语 - 博克马尔 0x0414 1044
        90 pl Polish 波兰语 0x0415 1045
        91 pt Portuguese(Standard) 葡萄牙语 - 标准 0x0816 2070
        92 pt-br Portuguese(Brazilian) 葡萄牙语 - 巴西 0x0416 1046
        93 rm Rhaeto-Romanic 拉托-罗马语 0x0417 1047
        94 ro Romanian 罗马尼亚语 0x0418 1048
        95 ro-mo Romanian(Moldavia) 罗马尼亚语 - 摩尔多瓦 0x0818 2072
        96 ru Russian 俄语 0x0419 1049
        97 ru-mo Russian(Moldavia) 俄语 - 摩尔多瓦 0x0819 2073
        98 sb Sorbian 索布语 0x042E 1070
        99 sk Slovak 斯洛伐克语 0x041B 1051
        100 sl Slovenian 斯洛文尼亚语 0x0424 1060
        101 sq Albanian 阿尔巴尼亚语 0x041C 1052
        102 sr Serbian(Cyrillic) 塞尔维亚语 - 塞瑞利克 0x0C1A 3098
        103 sv Swedish 瑞典语 0x041D 1053
        104 sv-fi Swedish(Finland) 瑞典语 - 芬兰 0x081D 2077
        105 sx Sutu 苏图语 0x0430 1072
        106 sz Sami (Lappish) 芬兰地方语言 0x043b 1083
        107 th Thai 泰语 0x041E 1054
        108 tn Tswana 茨瓦纳语 0x0432 1074
        109 tr Turkish 土耳其语 0x041F 1055
        110 ts Tsonga 汤加语 0x0431 1073
        111 uk Ukrainian 乌克兰语 0x0422 1058
        112 ur Urdu 乌尔都语 - 巴基斯坦 0x0420 1056
        113 ve Venda 文达语    
        114 vi Vietnamese 越南语 0x042A 1066
        115 xh Xhosa 科萨语 0x0434 1076
        116 zh-cn Chinese(PRC) 中文 - 中华人民共和国 0x0804 2052
        117 zh-hk Chinese(Hong Kong SAR, PRC) 中文 - 中华人民共和国香港特别行政区 0x0C04 3076
        118 zh-sg Chinese(Singapore) 中文 - 新加坡 0x1004 4100
        119 zh-tw Chinese(Taiwan Region) 中文 - 台湾地区 0x0404 1028
        120 zu Zulu 祖鲁语 0x0435 1077



   1 修改浏览器语言
   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"/>
    </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"(代表是否从资源文件中读取信息,否则Key的值以参数的形式返回)>
<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>
    </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为验证的属性名-->
     ,之后在页面上用<html:errors property="userName"/>显示相应资源文件中的键值对应的提示信息
     如果没有这句话,则不满足验证规则required时将会在资源文件中寻找默认的key值。默认的key值在验证规则文件中有,如required默认的key为errors.required
     而如果设置resource="false" 即 <msg name="required" key="invalid" resource="false"/> ,则不使用资源文件 这里的key什么值,页面上就提示什么值
    
     -->
      <arg0 key="username"  />
 
     </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>
     </field>
     </form>
  </formset>


    传参数到minlength
           <field
            property="password"
            depends="required,minlength">
                <arg0 key="LoginForm.password"/>
                <arg1 key="${var:minlength}" name="minlength" resource="false"/> <!--resource="false"  表示不从资源文件取值,而是用当前值。而当前值${var:minlength}表示取变量名为minlength的值 -->
                <var>
                <var-name>minlength</var-name>
                <var-value>6</var-value>
                </var>
            </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>
            </field>

        日期验证例子
               <field
                    property="date"    <!--非常遗憾的通知你  date属性在form中的类型为字符串类型-->
                depends="required,date">
                    <arg key="userForm.date"/>
                    <var>
                        <var-name>datePattern</var-name>
                        <var-value>yyyy-MM-dd</var-value>
                    </var>
            </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标签页面引入 <%@taglib prefix="tiles" uri="/WEB-INF/struts-tiles.tld"%>
       1  先定义一个模板  做好一个模板页面  例如   以下两种方式均可
               1.1 使用<tiles:get>标签定义模板
              <table border=1>
                <tr>
                    <td><tiles:get name="header"/></td>
                </tr>
                <tr>
                    <td><tiles:get name="main"/></td>
                </tr>
                <tr>
                    <td><tiles:get name="footer"/></td>
                </tr>
               </table>
            1.2 使用<tiles:insert>标签定义模板
                  <table border=1 bgcolor="red">
                <tr>
                    <td><tiles:insert attribute="header"></tiles:insert> </td>
                </tr>
                <tr>
                    <td><tiles:insert attribute="main"></tiles:insert></td>
                </tr>
                <tr>
                    <td><tiles:insert attribute="footer"></tiles:insert></td>
                </tr>
             </table>

       2 使用模板页面  使用<tiles:insert>与<tiles:put>标签
          <tiles:insert page="模板页面.jsp" > <!--page为刚刚定义的模板页面 也可用template 如 <tiles:insert template="模板页面.jsp" >  -->
            <tiles:put name="header" value="header.jsp"></tiles:put> 
            <!--name 是刚刚在模板页面定义的名字 value表示要在该位置下放的页面 也可用content  <tiles:put name="header" content="header.jsp"></tiles:put>  -->
            <tiles:put name="main" value="main.jsp"></tiles:put>
            <tiles:put name="footer" value="footer.jsp"></tiles:put>
         </tiles: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" />
        </plug-in>
     2  tiles-defs.xml  以下示例 定义baseLayout  friends和office都继承了它
         <?xml version="1.0" encoding="UTF-8" ?>
         <!DOCTYPE tiles-definitions PUBLIC
           "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
           "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
              <tiles-definitions>
               <definition name="baseLayout" path="/模板页面.jsp">
                <put name="header" value="/header.jsp" />
                <put name="main"   value="/menu.jsp" />
                <put name="footer" value="/footer.jsp" />       
                </definition>
                <definition name="friends" extends="baseLayout"><!--继承baseLayout-->
                <put name="body" value="/friends.jsp" />
                </definition>
                <definition name="office" extends="baseLayout">
                <put name="body" value="/office.jsp" />
                </definition>
        </tiles-definitions>

     3   修改struts-config.xml   注意path的值 为 tiles-defs.xml文件中的定义definition name
     <action-mappings>
        <action path="/Link" parameter="method" type="com.vaannila.LinkAction">
             <forward name="friends" path="friends"/> <!--这里的path 与原来不一样哦-->
             <forward name="office" path="office"/>
        </action>
        <action path="/Welcome" forward="/welcomeStruts.jsp"/>
        </action-mappings>



13 源代码

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C#加密解密过程

加密代码 public static string Encode(string str, string key) { DESCryptoSe...

一起学Netty(七)之 TCP粘包拆包基本解决方案

可以看到被分了20次读取,我们可以这样理解,客户端发送了2次req字节,每个req中有10个“$$__”,这样就是第11次切割的时候其实发送了粘包,第一个req中末尾部分和第二次的头部粘在了一起,作为...
  • linuu
  • linuu
  • 2016-05-07 17:17
  • 7494

Netty4.0学习笔记系列之一:Server与Client的通讯

本文是学习Netty的第一篇文章,主要对Netty的Server和Client间的通讯机制进行验证。 Server与Client建立连接后,会执行以下的步骤: 1、Client向Server发送消息:...

Netty4.0学习笔记系列之五:自定义通讯协议

Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输,例如http协议中,就是通过HttpRequestDecoder对ByteBuf数据流进行处理,转换成http的对象。基于...

Netty之解决TCP粘包拆包(设置消息边界)

1、什么是粘包/拆包        一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往...

Netty之解决TCP粘包拆包(设置定长消息)

1、什么是粘包/拆包        一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往...

集合转换为数组

示例:ArrayList转换成Character数组 1、如果使用(Character[])arrayList.toArray();//强制转换,则会报类型转换异常 2、使用第二个方法arrayL...

Jsp中使用return时应注意

800x600 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

集合和数组的相互转换

集合和数组相互转换很多时候API的方法只支持集合或数组,比如适配器类中的数据只支持集合,这时候我们就要把数组转换集合。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)