Struts2学习

1,工作流程:

    用户发出一个Http请求
     经过一系列的过滤器
     调用FilterDispather,FilterDispather是控制器的核心,它通过询问ActionMapper来确定该请求是否需要某一个Action
     如果需要某个Action,FilterDispather就把请求转交给ActionProxy处理
     ActionProxy通过配置管理器Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action
     ActionProxy创建一个ActionInvocation实例
     一旦Action执行完毕,ActionInvocation实例根据struts.xml文件占到相对应的返回结果
     最后,response响应通过web.xml文件配置的过滤器返回

     FilterDispather 控制层
     Action 模型层
     Result 视图层

2,核心文件:

    web.xml:

      配置会话时间,欢迎页面,错误页面,监听器,过滤器以及一些参数等

    struts.properties:

      一般存放常量 //键值对
        struts.i18n.encoding
        struts.devMode
        struts.configuration //配置管理器

    struts.xml

      重要的配置文件
        主要用来配置Action和Http请求的对应关系,以及逻辑视图物理视图的对应关系。
        示例:

        

<?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>
                        <package name="default" namespace="/" entends="struts-default">    
                            <action name="" class="">
                                <result>/YY.jsp </result>
                            </action>
                        </package>
                    </struts>

      关键元素分析

        package元素
              配置包,在struts2框架中,包是一个独立的单位,通过name属性来唯一标识包
              四个属性:
                 name
                 extends
                 namespace   //指定命名空间,标识此包下的Action的访问路径
                 abstract
           action元素
               name
               class  //可选   如果没有指定则默认为:com.opensymphony.xwork2.ActionSupport
               method  //请求调用Action时调用的方法
               converter   //指定类型转换的类
           result元素
               当调用Action结束,下一步就是使用result元素来设置给浏览器返回的试图,通常只有name和type两个属性
               默认类型是dispater   struts2还允许redirect redirect_action
           include元素
               该元素用来在一个struts.xml配置文件中包含其他的配置文件。
               <struts>
                <include file="a.xml"/>
                <include file="b.xml"/>
               </struts> 

        global-result元素
              该元素配置包中的全局结果,如果局部结果没有对应的结果,就会查找全局结果
              <package name="p1">
                 <global-result>
                    <result name="SUCCESS">/success.jsp</result>
                 </global-result>
              </package>
           default-action-ref元素
          该元素用来配置默认的Action

    Action的动态调用:
         对Action中不同方法的调用:
          1,通过url:    如为了请求名为demo的Action中的login方法:  请求方式为:/demo!login.action
          2, 通过配置struts.xml中的action元素的method属性 
      通配符:
         在struts.xml中通配符主要是指"*","**","(\)".
         通配符“*”匹配0个或者多个字符但是不包括“/”
         通配符“**”匹配0个或者多个字符但包括“/”
         通配符“\” 转义字符

   ACTION详解
        ActionSupport类
           自定义的Action一般直接继承ActionSupport,并自定义变量,覆盖execute()方法,变量的值会通过setter方法自动赋值,execute()方法,变量的值会通过setter方法自动赋值,execute
           的返回值配置在struts.xml中的result元素
        Action接口
           定义了两个常量:error success  login input  now
           以及excute方法
       不继承任何类的Action
           struts2的Action 并不一定要继承Action接口,任何的POJO都可以作为Action,只需要有public String excute()方法

   Action与Servlet API
        1,通过ActionContext类来访问Servlet API  主要方法:
            void put(String key,Object value)
            Object get(String key)
            Map getApplication()   
            static ActionContext getContext()   //获得当前线程的ActionContext
            Map getSession(): 返回一个Map类型的HttpSession
        2,通过特定接口访问
           为了在Action中直接访问Servlet API ,可以通过实现下面的几个接口
            ServletRequestAware: 实现该接口后,可以直接访问HttpServletRequest实例
            ServletResponseAware: 实现该接口后,可以直接访问HttpServletResponse实例
            ServletContextAware: 实现该接口后,可以直接访问HttpServletContext实例
        3,通过ServletActionContext访问
           该类的几个方法:
            HttpServletRequest org.apache.struts2.ServletActionContext.getRequest()
            HttpServletResponse org.apache.struts2.ServletActionContext.getResponse()
            HttpServletContext org.apache.struts2.ServletActionContext.getContext()

  ModelDriven接口
        对于实现了该接口的Action来说,只需要定义相应的model,struts2就会自动将用户提交的http信息赋值给model
        model
        class UserModel{
           ...属性
        }
        public class LoginAction extends ActionSupport implements ModelDriven<UserModel>{

        }

  异常处理:
        在struts.xml 配置

      

<struts>    
                    <package name="p1">
                            <global-result>
                                <result name="SQLException">/SQLException.jsp</result>
                                <result name="Exception">/Exception.jsp</result>
                            </global-result>
                            <global-exception-mapping>
                                <exception-mapping exception="java.sql.exception" result="SQLException">
                                <exception-mapping exception="java.lang.exception" result="Exception">
                            </global-exception-mapping>
                    </package>
                </struts>

   struts数据检验与国际化

    数据校验
        1.com.opensymphony.xwork2.Validateable接口
           struts2中提供com.opensymphony.xwork2.Validateable接口,这个接口中只存在一个validate()方法,如果有某个类实现了该接口,
           Struts2就可以直接调用该类中的validate()方法。
           ActionSupport就是实现了该接口的一个类,但是是空实现该方法,所以用户需要重写validate()方法
           此方法可以进行服务器端的初步校验,当校验通过后才执行excute()方法,校验出错会将错误添加到ActionSupport中的fieldError
           会先执行validateX()再去执行validate()
           如果有大量的Action就会特别麻烦
        2.通过XWork校验框架实现
             字段校验方式
           在包下创建 LoginAction-validate.xml 

      

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//Xwork Validator 1.0.2//EN"
                        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
                    <validator>
                        <field name="age">     //校验年龄
                            <field-validator type="int">
                                <param name="min">10</param>
                                <param name="max">40</param>
                                <message>the age must betwen 10 and 40</message>
                            </field-validator>
                        </field>
                        <field name="name">   //校验姓名
                            <field-validator type="requiredstring">
                                <message>不能为空</message>
                        </field>
                    </validator>

      非字段校验方式

  

<validator>
                          <validator type="int">
                              <param name="fieldName">age</param>
                              <param name="min">10</param>
                            <param name="max">40</param>
                            <message>不能为空</message>
                        </validator>
                        <validator type="email">
                            <param name="fieldName">email</param>
                            <message>不能为空</message>
                      </validator>

3,校验器
         1,required校验器
            要求指定的字段必须是非空。
            <field name="name">
             <field-validator type="required">
             </field-validator>
            </field>
         2,requiredstring校验器
            字段非空且长度大于1   示例同上
         3,int校验器
            整数校验器
         4,date校验器
            <field name="birthday">
             <field-validator type="date">
              <param name="min">1991-01-01</param>
              <param name="max">2017-02-07</param>
              <message>
             </field-validator>
            </field>
         5,email校验器
         6,stringlength   //param name="minLength"  "maxLength"

  实现国际化
     1,包范围资源文件
       该资源文件只允许包下的Action访问,存放在包的根路径下
       文件名格式:package_language_country.properties
       如中文:package_zh_CN.properties
         package_en_US.properties
     2,类范围资源文件
       ActionName_language_country.properties
     3,全局范围资源文件
         src路径下
         命名格式:name.properties
         全局资源文件加载不是自动的,必须在struts2配置文件中指定
         在struts.xml配置如下:
          <constant name="struts.custom.il18.resources" value="peopertiesName"/>
         也可以在struts.properties 指定:
          struts.custom.il18.resources=propertiesName
      4,临时资源
         mess_en_US.properties
        访问国际化资源:
          1,通过ActionSupport中的getText()方法,该方法中的name参数对应国际资源文件的key值,返回value值
          2,在jsp页面使用struts2的<s:text>标签
          3,在jsp页面的表单元素中可以指定一个key
       资源文件的加载顺序:
          在action/jsp中的顺序: 类范围->父类范围->接口范围->包->全局->直接输出

 Struts标签库
    标签分类:
   1,普通标签
    1,控制标签
     用来实现分支,循环等流程控制
      if/ifelse/else/append/generator/iterator/merge/sort/subset
    2,数据标签
     用来输出后台的数据和完成其他数据访问的功能
      a/action/bean/date/debug/il8n/include/param/property/push/set/text/util
   2,UI标签
    1,表单标签
     主要用来生成HTML中的表单元素
      checkbox/checkboxlist/combobox/doubleselect/head/file/form/hidden/label/radio/reset/select/submit/textarea
    2,非表单标签
     主要生成div标签,及输出action封装的信息
      comonent/div
    3,Ajax标签
     提供ajax支持
    标签的使用:
      1,引入标签库:
       在jsp中使用taglib标签引入
       <%@ taglib prefix="s" uri="/struts-tags">
      2,OGNL(object graph navigation language) 
      3,解析控制标签
       1,if/ifelse/else
        <s:if text="表达式">
        </s:if>
        <s:elseif text="表达式1">
        </s:elseif>
        <s:else>
        </s:else>
       2,append 集合拼接成新的集合
        <s:append var="newlist">                  //合并集合
         <s:param value="{"1","2","3"}"/>
         <s:param value="{"4","5","6"}"/>
        </s:append>
        <s:iterator value="%{#newlist}" id="lst">    //迭代输出
         <s:property value="lst"/>
        </s:iterator>
       3,generator   将指定字符串按指定分隔符分割成多个字串
       4,iterator  
       5,merge   将多个集合拼接成一个集合   集合元素交叉拼接
       6,sort   指定集合元素排序
       7,subset  去除指定集合的子集
      4,解析数据标签
       1,a标签,构造超链接
       2,action标签,在jsp页面调用action
       3,bean标签 用于创建一个JavaBean实例
       4,date标签 用于输出指定格式的日期  属性:name var nice(时差 boolean) format
       5,debug标签   调试工作
       6,il8n标签 资源绑定
       7,include标签
       8,param标签
       9,property标签
       10,push标签 
       11,set标签 将某值放入某个范围
       12,text标签   国际化资源信息
       13,url标签  生成url映射地址
      5,解析struts表单标签
       1,form标签 产生对应的html<form>
       2,submit标签  产生html提交按钮
       3,checkbox      复选框
       4,checkboxlist   一次创建多个复选框
       5,combobox  创建文本框和下拉列表框
       6,doubleselect  创建两个相关联的列表框
       7,head 
       8,file  文件选择框
       9,hidden 隐藏表单元素
       10,inputtransfersselect    获取输入转到列表框中
       11,label
       12,optiontransferselect  选项转移列表组件
       13,select  下拉列表框
       14,optgroup  下拉列表框的选项组
       15,password
       16,radio 多个单选框
       17,reset 重置按钮
       18,textarea/textfield  文本域
       19,token 防止表单重复提交
       20,updownselect
      6,解析非表单标签
       actionerror   输出错误信息到客户端
       actionmessage 输出提示信息到客户端
       component  使用自定义标签,模板,主题
       div
       fielderror 

 

Struts之拦截器    //Interceptor
   拦截器概述
    位于ActionProxy与Action之间
   使用拦截器
    1,配置拦截器
     在struts.xml
      <interceptor name="interceptorName" class="interceptorClass">
    2,拦截器栈
     在struts.xml
      <interceptors>
       <interceptor name="interceptorName1" class="interceptorClass"/>
       <interceptor name="interceptorName2" class="interceptorClass"/>
       <interceptor-stack name="mystack">
        <interceptor-ref name="interceptorName1"/>
        <interceptor-ref name="interceptorName2"/>
       </interceptor-stack>
      </interceptor>
    3,默认拦截器
     默认拦截器对包下所有的action都起作用
     在struts.xml
      <interceptors>
       <interceptor name="interceptorName1" class="interceptorClass"/>
       <interceptor name="interceptorName2" class="interceptorClass"/>
       <interceptor-stack name="mystack">
        <interceptor-ref name="interceptorName1"/>
        <interceptor-ref name="interceptorName2"/>
       </interceptor-stack>
       <default-interceptor-ref name="mystack">    //默认拦截器栈
      </interceptor>
    4,使用拦截器
     在struts.xml中
      <package name="default">
       <interceptors>
        <interceptor name="interceptorName1" class="interceptorClass"/>
        <interceptor name="interceptorName2" class="interceptorClass"/>
        <interceptor-stack name="mystack">
         <interceptor-ref name="interceptorName1"/>
         <interceptor-ref name="interceptorName2"/>
        </interceptor-stack>
        <default-interceptor-ref name="mystack">    //默认拦截器栈
       </interceptor>
       <action name="loginaction" class="cn.xom.loginaction">
        <result name="success">/success.jsp</result>
        <interceptor-ref name="interceptorName1"/>     //使用拦截器1
        <interceptor-ref name="mystack"/>          //使用拦截器栈
       </action>
      </package>
   Struts2的内置拦截器
    alias拦截器
     该拦截器的作用是给参数起一个别名,当Action链中需要用到同一个HTTP请求的参数值时,该拦截器可以让这些Action的不同属性名共享同一个参数值
     page:267
    prepare拦截器
     该拦截器用来调用实现了preparable接口的Action中的prepare()方法
     在执行excute()方法之前执行prepare()方法
    timer拦截器
     输出电泳action所需的时间

   自定义的拦截器
    开发自定义的拦截器
     1,实现com.opensymphony.xwork2.interceptor接口
      void init();
      void destory();
      String intercept(ActionInvocation invocation) throws Exception
     2,继承抽象拦截器类AbstractIntercrptor   //实现了上述接口,提供init/destory方法的空实现
    拦截器的执行顺序:
     第一个拦截器->第二个拦截器->action1->action2->第二个拦截器->第一个拦截器
    方法过滤拦截器
     继承MethodFilterInterceptor抽象类,实现doIntercept()方法
     MethodFilterInterceptor还提供了两个方法:

Struts中使用Ajax
   ajax是一种web客户端技术,结合了JavaScript,CSS,Html,XMLRequest,dom等技术。异步方式与服务器进行通信
   XMLHttpRequest
    属性:readystate / status / responseXML /responseText
    方法:  abort() 暂停请求
      send() 将请求发送到服务器
      open()  访问

LoginAction: name password
                                            excute{
                                                HttpServletResponse resp=ServletActionContext.getResponse();
                                                resp.setContentType("text/html,charset=utf-8");
                                                resp.setCharacterEncoding("utf-8");
                                                PrintWrite pw=resp.getWrite();
                                                pw.println("welcome login");
                                                if(name.equals("admin")&&password.equals("admin")){
                                                    pw.println("success");
                                                }else
                                                    pw.println("error");
                                                return "success";
                                            }
                                index.jsp
                                    <script type="text/javascript">
                                        var XHR=false;
                                        funtion CreateXHR(){
                                            try{
                                                XHR=new ActiveXObject("msxml2.XMLHTTP");
                                            }catch(e1){
                                                try{
                                                    XHR=new ActiveXObject("microsoft.XMLHTTP");
                                                }catch(e2){
                                                    try{
                                                        XHR=new XMLHttpRequest();
                                                    }catch(e3){
                                                        XHR=false;
                                                    }
                                                }
                                            }
                                        }
                                        funtion sendRequest(){
                                            CreateXHR();
                                            if(XHR){
                                                var name=document.getElementById("name").value;
                                                var password=document.getElementById("password").value;
                                                var url="http://localhost:8080/AjaxDemo/login.action?name="+name+"&password="+password;
                                                XHR.open("Get",url,true);
                                                XHR.onreadystatechange=resultHeader();
                                                XHR.send(null);
                                            }
                                        }
                                        funtion resultHeader(){
                                            if(XHR.readyState==4&&XHR.status==200){
                                                alert(XHR.responseText);
                                            }
                                        }

Ajax标签
    Ajax标签依赖包
     <%@ taglib prefix="aj" usrl="/struts-dojo-tags">
    Ajax标签的共有属性
     href 指定访问的URL
     listenTopics
     notifyTopics

     1,<a>标签
      当点击时会做一个异步访问。 属性: targets 逗号分隔的html元素id列表,这些元素的内容将会被更新
                handler  制定处理请求的javascript函数
                formid 指定表单id,表单的字段将被序列化作为参数传递
      <div id="div1">div1</div>
      <s:url id="ajaxTest" value="/login.action"/>
      <sx:a id="link1" href="%{ajaxTest}" targets="div1">Update content</sx:a>
     2,<div>标签
      该标签的内容可以通过ajax异步请求来获取到,可以实现页面的局部内容更新
      属性:
       handler
       formid
       errorText
       loadingText
       autoStart
      <s:url id="ajaxTest" value="/login.action"/>
      <sx:div href="%{ajaxTest}"
        errorText="There was an error"
        loadingText="reloading..."
        updateFreq="5000"     //重新加载的频率
      />
     3,<submit>标签
      异步提交表单
     4,<datetimepicker>

    Ajax之Json插件
     <package name="jsonManager" extends="json-default">
      <action name="userJson" class="com.action.UseJson">
       <result type="json"></result>
      </action>
     </package>

     funtion resultHeader(){
      if(XHR.readyState==4&&XHR.status==200){
       var userobj=JSON.parse(XHR.responseText);
       alert("the username is"+userobj.User.name);
      }
     }

   文件控制上传和下载
    文件上传:
     <s:form action="file" enctype="multipart/form-data" method="post">
      <s:file name="uploadfile" label="选择文件"/>
      <s:submit />
     </s:form>

posted @ 2017-02-08 15:29  爱是用心码请不要说话  阅读(155)  评论(0编辑  收藏  举报