• struts1(转)


    Struts1.x学完,整理一下:
    Struts1.x是基于MVC框架的,学Struts1.x前先了解MVC

    一、MVC
    model         业务逻辑 有关数据库的操作
    view           展示         jsp动态页面
    controller 控制器     截取数据 分发 转向      
    Struts中MVC模式执行流程:                                  

    browse
       /            /
           request            response
          /                             /
    actionServlet--forward---jsp
    /       /                    
       config.xml    actionForm                      
            |               
    Model    

     

    二、Struts配置过程:
    1、配置struts
    * 拷贝struts lib下的所有jar到WEB-INF/lib下
    * 修改web.xml文件,配置ActionServlet
    * 提供struts-config.xml文件
    <action-mappings>
       <action path="/login"
         type="com.struts.LoginAction"
         name="loginForm"
         scope="request"
         validate="false"
    ...
    >
        <forward name="success" path="/success.jsp"/>
         </action>
    </action-mappings>

    <action>标签中的属性含义描述如下:

    1).name:表示ActionForm的名称。也就是<form-bean>标签中的name属性的值。

    2).path:表示Struts动作,必须以“/”开头。

    3).scope:表示ActionForm类的对象实例(在本例中是SimpleValidationForm类的对象实例)保存的范围。
    这个属性值只能取request和session。默认值是session。
    如果scope的值为request,表示将SimpleValidationForm类的对象实例以simpleValidationForm
    作为键值保存到了request的属性中。如果scope的值为session,
    表示不将SimpleValidationForm类的对象实例保存到request的属性中。但不管scope的值是request还是session。
    Struts都会将SimpleValidationForm类的对象实例保存到session的属性中。

    4). type:表示SimpleValidationAction类的全名。

    5). input:表示如果客户端提交的数据未通过简单验证后要跳转到的页面,也就是在SimpleValidationForm类的validate方法中返回的ActionErrors对象中含有错误描述信息。Struts会自动跳转到input属性所指的JSP页面。
    <action>标签中的子标签<forward>定义了可以在动作类(在本例中就是SimpleValidationAction类)中读取的forward页的URL。

     

    2、创建登录项目
    * 创建jsp页面(login.jsp,login_success.jsp,login_error.jsp)
    * 创建LoginActionForm.Java
    * 创建LoginAction.java
    * 配置struts-config.xml文件

       处理登陆失败:
       forward name="error" path="/login_error.jsp"/> 配置登陆失败转向信息

    三、struts标签的配置和使用

    配置:
    * 在struts-config.xml文件中加入
    <message-resources parameter="MessageResources" />
    * 拷贝MessageResources.properties文件到src下
    使用:
    * 采用taglib指令引入
    <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
    <%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic"%>

    四、JSTL
    jstl标签库的配置
    * 将jstl.jar和standard.jar拷贝到WEB-INF/lib下(如果使用el表达式,不用拷贝这两个jar)
    标签库的使用
    * 采用taglib指令引入
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

    五、自定义函数库:
    a、定义类和方法(方法必须是public static)
    b、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下
    c、在jsp中采用taglib指令引入自定义函数库
    d、采用 前缀+冒号+函数名 调用即可
    mytaglibfn.tld
    <?xml version="1.0" encoding="UTF-8" ?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>JSTL 1.1 functions library</description>
    <display-name>JSTL functions</display-name>
    <tlib-version>1.1</tlib-version>
    <short-name>my</short-name>
    <uri>http://com.java</uri><!-- 自定义前缀-->
    <function>
        <name>sayHello</name><!--自定义方法名-->
        <function-class>com.struts.JSTL.TestMyTaglibFn</function-class><!--对应的方法类-->
        <function-signature>java.lang.String sayHello(java.lang.String)</function-signature><!--返回值类型和参数类型-->
    </function>
    </taglib>
    引入指令后直接使用:
    <%@ taglib prefix="my" uri="http://com.java"%>
    EL表达式 ${my:sayHello(“Tom”)}

    六、I18N国际化
    a.了解缺省Locale是由操作系统决定的,Locale是由语言和国家代码组成

    b.国际化资源文件是由baseName+locale组成,如:MessageBundle_en_US.properties
    baseName是任意合法的文件名

    c.native2ascii命令的位置和用法
    * 位置:JAVA_HOME/bin
    * 使用native2ascii.exe o.properties MessagesBundle_zh_CN.properties

    JAVA国际化:
    国际化资源文件(MessagesBundle_en_US.properties)
    key1=hello,{0}
    key2=good by
    主要方法
    Locale defaultlocale = Locale.getDefault(); //获取本地默认语言信息
    ResourceBundle rb = ResourceBundle.getBundle("res.MessagesBundle",defaultlocale);//配置国际化资源文件
    System.out.println(rb.getString("key1"));//取出对应的信息
    //国际化资源文件中带站位符{0}时,处理方法:
    MessageFormat mf = new MessageFormat(rb.getString("key1"));
    System.out.println(mf.format(new Object[]{"Tom"}));

    struts国际化的配置
    * 在struts-config.xml文件中加入:<message-resources parameter="MessageResources" />
    *提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode
    *在jsp中采用<bean:message>标签来读取国际化消息文本
    *了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置
    currentLocale = new Locale("zh","CN");
       this.setLocale(request,currentLocale);

    消息文本的国际化处理,共有三个步骤:
    * 创建国际化消息
    * 传递国际化消息
    * 显示国际化消息

    如何创建国际化消息?
    理解ActionMessage和ActionMessages两个对象的区别

    如何传递国际化消息?
    * 调用saveMessage()传递普通消息,调用saveErrors传递错误消息

    如何显示国际化消息?
    通过<html:messages>标签显示消息(可以显示普通消息和错误消息)
    通过<html:errors>显示消息(只能显示错误消息)  


    七、动态ActionForm
    动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准
    ActionForm的所有功能
    * 在struts-config.xml文件中定义动态ActionForm,如:
    <form-beans>
       <form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
        <form-property name="username" type="java.lang.String" />
        <form-property name="age" type="java.lang.Integer"/>
       </form-bean>
    </form-beans>
    *在Action中使用动态ActionForm,参见DynaActionFormTestAction.java
       DynaActionForm daf = (DynaActionForm)form;
       String username = (String)daf.get("username");
       Integer age = (Integer)daf.get("age");
      
    动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值
    动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}
    动态Action的验证,通常使用动态验证框架validator

    八、采用struts上传文件
    * 页面的配置,如:
       <form action="upload.do" method="post" enctype="multipart/form-data">
       标题:<input type="text" name="title"><br>
       文件:<input type="file" name="myfile"><br>
       <input type="submit" value="提交">
    </form>
       * ActionForm中使用FormFile来接收上传的文件,参见:
    UploadFileActiomForm ufaf = (UploadFileActiomForm)form;
       String title = ufaf.getTitle();
       FormFile myfile = ufaf.getMyfile();//注意使用FormFile对象,来实现Struts文件上传
       if(myfile!=null){
        FileOutputStream fos = new FileOutputStream("d://"+myfile.getFileName());
        fos.write(myfile.getFileData());
        fos.flush();
        fos.close();
       }
       * 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传。
       * 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>
      
    九、空字段测试
    * 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串
    * 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串

    十、测试ActionForm类型的自动转换
    * boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false
    * Date类型的转换:
       * 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换
       * 如果是java.util.Date,默认情况下struts无法转换

    * 自定义转换器的实现步骤
       * 实现converter接口,实现convert方法
       * 将实现的conerter注册,通常情况采用servlet注册
       * 采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>(也可以采用struts plugin注册)
      
    Struts对ActionForm的自动搜集过程:
    * 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
    * 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
        根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型
       
    可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。

    十一、ActionMapping
    struts-config.xml文件中,每个<action>标签对应一个ActionMapping实例
    了解<action>标签中的forward和unknown属性的含义
    <action path="/unknown"
         unknown="true"
         forward="/unknown.jsp"
       >
       </action>
    了解采用jstl和struts标签保持页面数据

    十二、ActionForward的使用
    a.理解全局和局部ActionForward的概念
    b.redirect的使用redirect = "true" 为重定向 url会变
    c.struts-config.xml文件不允许动态修改
    d.理解动态ActionForward,动态的ActionForward是可以运行期修改的(
    ActionForward af = new ActionForward();
       af.setPath("/"+page+".jsp");  
       return af;

    十三、动态验证框架struts validator
    1、配置:
    * 加入国际化配置在struts-config.xml文件中,如:
       <message-resources parameter="MessageResources" />
    * 提供国际化资源文件
    * 引入validator插件在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>
    * 提供validation.xml和validator_rules.xml文件,将此文件拷贝到WEB-INF下

    2、validator服务器端验证
    * 配置validation.xml文件

    3、validator客户端验证(JavaScript)
    ) * 配置validation.xml文件
    * 在jsp页面中包含< html:javascript>
    * 对需要验证的表单定义onsubmit事件,其中事件名称为validate+ActionForm的名称,如:validateLoginForm
    <!------------------------------------------------------validation.xml------------------------>
    ...........................................
    <form-validation>
        <formset>
            <form name="loginForm">
                <field property="username" depends="required">
                        <arg key="prompt.username"/>
                </field>
                <field property="password" depends="required,mask">
                        <arg key="prompt.password"/>
                        <var>
                            <var-name>mask</var-name>
                            <var-value>^[0-9a-zA-Z]*$</var-value>
                        </var>
                </field>
            </form>
        </formset>
    </form-validation>

    十四、异常

    a、编程式异常
    * 截获异常
    * 创建相应的异常消息
    * 传递异常消息
    * 转向相应的页面处理异常
    b、声明式异常(自动处理的异常)
    * 在struts-config.xml文件中配置<exeception/>标签
    * 理解局部和全局exception
    * 注意局部<exception/>标签需要配置到<forward/>标签的前面,详见dtd中的约束

    <exeception/>标签中的属性说明:
       * key:指异常信息对应的国际化消息文本,这个key值需要在国际化资源文件中定义
       * type: 处理那种异常
       * path: 定义一但出现异常,需要转向那个页面,如果不定义path,
               默认情况下将使用<action>标签中input属性对应的页面
       * scope:可以取值request和session,默认为request
       * handler:异常的处理类,struts默认采用org.apache.struts.action.ExceptionHandler,
                  如果做个性化的异常处理可以继承此类覆写相应的方法
                  

    十五、DispatchAction
    DispatchAction是一个特殊的Action,通过统一命名规则,配置相关的属性parameter="command",来减少Action数量,同时也减少了Action的配置量。
    DispatchAction中unspecified方法,Struts找不到在parameter配置的参数对应的值时,Struts会默认执行重写的该方法。

  • 相关阅读:
    eclipse中jdk源码调试步骤
    [POJ2777] Count Color
    [HNOI2004] L语言
    [USACO08DEC] 秘密消息Secret Message
    The XOR Largest Pair [Trie]
    前缀统计 [Trie]
    于是他错误的点名开始了 [Trie]
    Palindrome [Manecher]
    兔子与兔子 [Hash]
    [CF985F] Isomorphic Strings
  • 原文地址:https://www.cnblogs.com/happy0120/p/6117191.html
Copyright © 2020-2023  润新知