Struts2学习_aaabc1112345的博客-程序员宅基地

技术标签: ViewUI  web.xml  json  javascript  

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>

转载于:https://www.cnblogs.com/dengyuanqi/p/6378406.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aaabc1112345/article/details/101487311

智能推荐

PMP与我 - 我的58天备考生涯_才聚PMP的博客-程序员宅基地

步入而立之年后,每天都在迷茫中做着枯燥而重复的工作,生活和工作的压力让人窒息。不想在温水煮青温的状态下继续沉沦,总想着提升技术或管理能力,可却也找不到突破口。在迎接自己30岁生日那天果断报了名,一是鞭策自己向前进步,二是送给自己一个生日礼物。提着一袋沉甸甸的PMP材料既兴奋又忐忑,兴奋的是闻到了久违的书香,忐忑的是即将开始质变的生涯。为了不给自己压力,没有给外界宣达一丝备考信息,自己偷偷开始了苦行僧的生活。白天忙于工作,深夜和周末用于复习备考。除了周末去机构听课,其他时间都是与书为伴。据说红皮书(PMB

MotionEvent和KeyEvent机制_Cdaimadada的博客-程序员宅基地

触屏操作的理解:最基本的操作类型:1.down:手指按下2.move:手指在屏幕上移动3.up:手指从屏幕上离开操作原理:现在流行的触屏手机的屏幕都是电容屏,它是通过人体微小电流和屏幕之间的电流交互来感知触屏的操作。...

c语言中乘号与%的优先级,3.5、运算符与优先级(下)_weixin_39829166的博客-程序员宅基地

好了,在我们继续之前,我们先来做一道数学题1+1*2=?一道小学数学题,在你小学数学合格的情况下,你应该回答为2而不是4为什么?因为我们都知道的运算法则:先乘除后加减在我们初中学习了乘方后,对于下面的题目3*2^2 (这里的^代表数学中的乘方)我们也能很快的得出正确的答案:12,而不是36因为应该先计算乘方。但是,对于下面的这个式子(3*2)^2它的值便是36,因为括号中的内容应该最先计算从上...

ant design pro 代码学习(七) ----- 组件封装(登录模块)_夕阳枫的博客-程序员宅基地

  以登录模块为例,对ant design pro的组件封装都相关分析。登录模块包含基础组件的封装、组件按模块划分、同类组件通过配置文件生成、跨层级组件直接数据通信等,相对来说还是具有一定的代表性。1、登录模块流程图  首先,全局了解一下登录模块的总体流程。如下图所示。该流程图主要分两部分:1、页面布局;2、组件封装。黄色实线表示页面中组件的引用。下边会对基础组件分析,以及多层级组件直接的...

微信公众号 -授权-登陆_四戒哥特的博客-程序员宅基地

/** * 微信授权-获取微信信息 控制层 */@[email protected]("/waxberry/wx")public class WechatController { protected Logger log = LoggerFactory.getLogger(this.getClass()); @Autowired private...

mac 搭建Java Spring boot 环境(idea)_weixin_30745553的博客-程序员宅基地

首先安装插件安装下面的这个插件然后重启idea,新建工程选择新建 Springboot 框架改写项目名称选择类型设置工程名称删除多余的文件编译工程然后运行1.2.参考:http://ju.outofmemory.cn/entry/326731转载于:http...

随便推点

Lua__读取指定路径下的.Lua文件_Le_Sam的博客-程序员宅基地

using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine;using XLua;public class Hotfix : MonoBehaviour { private LuaEnv luaEnv; void Awake() {...

基于Redis的Setnx实现分布式锁_一如既往的坚持的博客-程序员宅基地_redis setnx 分布式锁

实现原理获取锁的Redis命令set resource_name my_random_value NX PX 30000resource_name:资源名称,可根据不同的业务区分不同的锁my_random_value:随机值,每个线程的随机值都不同,用于释放锁的校验。NX:key不存在时设置成功,key存在则设置不成功PX:自动失效时间,出现异常情况,锁可以过期失效利用NX的原子性,多个线程并发时,只有一个线程可以设置成功设置成功获得锁,可以执行后续的业务处理如果出现异常,过了锁的有效期

Safety capacitor_YTF-Capacitor-Selina的博客-程序员宅基地

**Safety capacitorYTF websit:www.ytfcapacitor.comThe discharge of the safety capacitor is different from the ordinary capacitor. The charge will remain for a long time after the external power supp...

linux中管道通信实验_人生无根蒂,飘如陌上尘的博客-程序员宅基地_linux管道通信实验

在linux内核中,fork函数用于创建进程系统调用格式:pid=fork()fork()返回值的意义:0 在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。当大于0 在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)-1 创建失败lockf函数用于对进程进行上锁和解锁,这就相当于PV操作,对共有资源进行限制。参数定义int...

Cocos2d-js Chipmunk的使用,实现一根绳子_Edward_Storm的博客-程序员宅基地

最近笔者在学习cocos2d-js,打算和朋友合作完成一款游戏,但是在制作过程中发现现在网上cocos2d-js的资料少的可怜,特别是物理引擎这一块,熟悉Chipmunk和Box2d的朋友们都知道,这两个引擎的C++的资料是非常丰富的,但关于JS的少之又少,所以笔者想借此机会分享一点Chipmunk js的用法。笔者能力有限,不喜勿喷。首先先来介绍一下Chipmunk这款物理引擎。Ch

ansible Ansible Galaxy ansible-playbook 安装 使用 命令 笔记 生成密钥 管控机 被管控机 wget epel源..._weixin_34192993的博客-程序员宅基地

笔记ansible安装与salt对比相同都是为了同时在多台机器上执行相同的命令都是python开发不同agent(saltstack需要安装、ansible不需要)配置(salt配置麻烦,ansible基本不用配置)学习路线(salt比较陡峭,ansible比较平缓)第三方工...