zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    Selenium开发环境搭建
    如何抓取移动端崩溃日志?
    html+ashx + NPOI 实现导出Excel文件并且预览和下载
    oss 文件上传:Web端上传介绍
    事务控制和锁定语句
    索引的设计和使用
    最近几年读过的书籍
    053.NET5_EFCoreMigration
    052.NET5_EFCoreDbFirst
    051.NET5_中间件的多种引用方式
  • 原文地址:https://www.cnblogs.com/dengyuanqi/p/6378406.html
Copyright © 2011-2022 走看看