Struts2知识复习之三

Struts2的MVC思想以及面向AOP切面编程

1 MVC简单概述:
M Model(业务逻辑模型,service层,dao层)
V View(视图,html,css,js页面)
C Controller(前端控制器,servlet,jsp,action)
2 Struts2MVC的流程:
客户端发送请求,struts2核心过滤器filter进行拦截处理后传递到Action --Controller
Action中调用service,dao层的业务方法 ---Model
Action返回结果,进行页面跳转 --View
3 Aop切面编程
精简含义:纵向重复代码,横向抽取。
典型应用:

  • Servlet时代,使用过滤器filter统一处理多个Servlet类的乱码问题
  • Action时代,使用Interceptor拦截器将相同的参数传递给多个不同的action中

    Struts2与OGNL语言(Struts的默认表达式语言)

    1 概述:OGNL(Object Graph Navigation Language )对象图导航语言是一种开源表达式语言。
    它可通过表达式语法,存取java对象的属性和调用java对象的方法,同时可自动实现类型转换。
    2 功能:

    (1)支持对象方法调用的方式。如 objectName.method()
    (2)支持类静态方法调用和值访问,格式为:@全类名@方法名|值名,
             如:[email protected](xx)
    (3)支持赋值操作和表达式串联。
    (4)可访问OGNL上下文对象OGNL Context和Action上下文对象ActionContext
    (5)可操作集合对象

    3 OGNL详解
    (1)概述:OGNL表达式语言结构由三要素组成:表达式(Expression),根对象(Root Object),上下文环境(Context)。
    <1>OGNL的表达式(规定OGNL做什么)
    & 它是OGNL的核心,所有OGNL操作都是针对表达式进行的。
    & 它是一个带语法含义的字符串,该字符串规定了操作类型和操作内容。
    & 它不仅支持链式对象访问路径,还支持在表达式中进行简单的计算。
    <2>OGNL的根对象(规定对谁操作)
    & 它是OGNL的操作对象,它能以任意对象为根,通过OGNL可以访问该对象关联的其他对象。
    & 设置了Root对象,OGNL可以对Root对象进行任何取写操作。
    <3>Context对象(规定了在哪里操作)
    & Root对象所在的环境就是OGNL的上下文对象Context。
    & 上下文对象Context是一个Map类型对象,使用表达式访问Context中的对象时,
    需使用“#”号加上对象名称。
    (2)OGNL的API
    <1>OgnlContext和Root对象的创建
    //创建一个User对象作为Root对象的数据
    User rootUser=new User("tom", 18);
    //创建一个Map集合作为OgnlContext对象的数据
    Map<String,User>map=new HashMap<String,User>();
    map.put("user1",new User("jack",18));
    map.put("user2",new User("rose",19));

          //创建OgnlContext对象
          OgnlContext oc=new OgnlContext();
          //把map数据封装到OGNLContext中
          oc.setValues(map);
          //将rootUser数据封装到Root
          oc.setRoot(rootUser);
    <2>获取OgnlContext的root对象和其他对象数据。
            //获取OgnlContext中整个Root对象
            User root = (User) Ognl.getRoot(oc);
            //获取OgnlContext中Root对象的name和age的属性值
            String name = (String) Ognl.getValue("name",oc,oc.getRoot());
            int age= (int) Ognl.getValue("age",oc,oc.getRoot());
            System.out.println("root:"+root+",rootName:"+name+",rootAge:"+age); 
    
            //获取OgnlContext其他对象数据
            //获取OgnlContext内整个user1对象
            User user1 = (User) Ognl.getValue("#user1",oc,oc.getRoot());
            //获取OgnlContext内user1对象的name和age属性
            String user1_name = (String) Ognl.getValue("#user1.name",oc,oc.getRoot());
            Integer user1_age = (Integer) Ognl.getValue("#user1.age",oc,oc.getRoot());
            System.out.println("user1:"+user1+",user1Name:"+user1_name+",user1Age:"+user1_age);
    <3>修改OgnlContext的root对象和其他对象数据。
              //修改OgnlContext中Root对象的name和age属性数据
              Ognl.getValue("name=‘flower‘",oc,oc.getRoot());
              Ognl.getValue("age=100",oc,oc.getRoot());
              //获取修改后的Root对象
              User root = (User) Ognl.getRoot(oc);
              System.out.println("root:"+root);
    
              //修改OgnlContext中其他对象user1的name和age属性
              String user1_name = (String) Ognl.getValue("#user1.name=‘panda‘",oc,oc.getRoot());
              Integer user1_age = (Integer) Ognl.getValue("#user1.age=200",oc,oc.getRoot());
              //获取修改后Context内的user1对象
              User user1 = (User) Ognl.getValue("#user1",oc,oc.getRoot());
              System.out.println("user1:"+user1);
    <4>OGNL的操作之调用对象方法
              //调用 OgnlContext中root对象和user1对象的setName方法
              Ognl.getValue("setName(‘root1111‘)",oc,oc.getRoot());
              Ognl.getValue("#user1.setName(‘u11111‘)",oc,oc.getRoot());
    
              //取掉用方法后的root对象和user1对象
              User root = (User) Ognl.getRoot(oc);
              User user1 = (User) Ognl.getValue("#user1",oc,oc.getRoot());
              System.out.println("root:"+root);
              System.out.println("user1:"+user1);
    <4>OGNL的操作之调用工具类的静态方法
            //自定工具类MyUtils如下
            public class MyUtils {
                //回音方法
                public static Object echo(Object o) {
                    return o;
                }
            }
             //调用 自定义工具类静态方法格式:@+完整类名[email protected]静态方法
              String value = (String) Ognl.getValue("@[email protected](‘hello flower‘)",oc,oc.getRoot());
              System.out.println(value);
              //调用 jdk内置工具类 Math的静态属性 PI
              Double pi=  (Double) Ognl.getValue("@[email protected]",oc,oc.getRoot());
              Double pi2=  (Double) Ognl.getValue("@@PI",oc,oc.getRoot());//简写
              System.out.println(pi2);
    <5>GONL的操作之 存储List单列集合对象数据到OgnlContext内,注意这里没有  用到 #  号
              //在OgnlContext内创建List集合对象--注意里面元素字母超过一个才可识别字符串,否则作为字符集合处理
              Ognl.getValue("{‘aa‘,‘bb‘,‘cc‘}",oc,oc.getRoot());
              //从OgnlContext里重新获取整个list集合对象以及集合的其他数据
              List<String> list = (List<String>) Ognl.getValue("{‘aa‘,‘bb‘,‘cc‘}",oc,oc.getRoot());
              Integer size = (Integer) Ognl.getValue("{‘aa‘,‘bb‘,‘cc‘}.size()",oc,oc.getRoot());
              String name1 = (String) Ognl.getValue("{‘aa‘,‘bc‘,‘cc‘}[0]",oc,oc.getRoot());
              String name2 = (String) Ognl.getValue("{‘aa‘,‘bc‘,‘cc‘}.get(0)",oc,oc.getRoot());
              System.out.println("list:"+list+";\n"+"listSize:"+size+
                                ";listName1:"+name1+";listName2:"+name2);
    <6>GONL的操作之 存储Map双列集合对象数据到OgnlContext内,注意这里用到了 # 号
          //创建Map双列集合--用#识别
          Ognl.getValue("#{‘name‘:‘zs‘,‘age‘:18}",oc,oc.getRoot());
          //获取整个Map集合以及Map集合的数据
          HashMap<String,Object> map =
            (HashMap<String, Object>) Ognl.getValue("#{‘name‘:‘zs‘,‘age‘:18}",oc,oc.getRoot());
          Integer size2 = (Integer) Ognl.getValue("#{‘name‘:‘zs‘,‘age‘:18}.size()",oc,oc.getRoot());
          String name3 = (String) Ognl.getValue("#{‘name‘:‘zs‘,‘age‘:18}[‘name‘]",oc,oc.getRoot());
          String name4 = (String) Ognl.getValue("#{‘name‘:‘zs‘,‘age‘:18}.get(‘name‘)",oc,oc.getRoot());
          System.out.println(map+"\n"+size2+";"+name3+";"+name4);

    (3)Ognl总结
    Ognl表达式语言,其运行在一个上下文对象环境OgnlContext里,
    该环境由Root对象和一个Map集合类型的Context组成。

    Struts2的值栈(ValueStack)

    1 概述
    (1)值栈ValueStack的产生:
    Ognl表达式要想运行必须有Ognl环境OgnlContext。
    struts2为结合Ognl技术,产生了一个OgnlContext,名为ValueStack。
    ValueStack由两个部分组成,一部分为Root,是一个栈,
    另一部分为ActionContext数据中心,是一个map集合。
    (2)值栈特点:
    & 值栈ValueStack是Struts2的一个接口,OgnlValueStack是ValueStack的实现类。
    & 客户端发送请求,struts2创建一个Action实例的同时创建一个OgnlValueStack值栈实例。
    & struts2通过OGNL在值栈中存取,读写Action参数数据。
    2 OgnlValueStack的内部结构
    (1) 概述:OgnlValue包括两部分,值栈(CompoundRoot)和 Map<String,Object>Context(ognl的上下文对象 OgnlContext).
    (2) CompoundRoot细述
    <1>它作为OgnlContext的Root对象,存储action实例数据。
    <2>它继承了ArrayList实现压栈和出栈功能,拥有先进后出的特点,我们称其为对象栈。
    CompoundRoot中的Action实例位于栈顶,struts2会先从栈顶的Action实例查找相应的属性,
    若找不到则从栈顶往下找其他对象。
    <3>CompoundRoot(自定义栈)是struts2对Ognl的Root使用的改进,
    调用OgnlValueStack的findValue()方法即可查找CompoundRoot栈中的对象及其属性。
    (3)OgnlContext细述
    <1>它是一个Map<String,Object>结构,存储一些引用,parameters,request,session,application,attr等.
    <2>Ognl的一些引用
    & parameters:该Map为当前请求的请求参数。
    & request:该Map为request域中的数据
    & session:该Map为session域中的数据
    & appliaction:该Map为application域中的数据。
    & attr:该Map按如下顺序检索以上对象,request,session,application
    3 ValueStack细述
    (1) ActionContext和ValueStack的关系

    • Struts2创建ActionContext的同时也创建ValueStack值栈对象。
    • ActionContext内有一个ValueStack的引用,ValueStack内也有一个ActionContext的引用。
    • ActionContext获取ServletApI依赖ValueStack值栈。
      (2)ValueStack相应ApI操作
      <1>获取值栈对象
      • 方式一(通过ActionContext):
        ValueStack valueStack = ActionContext.getContext().getValueStack();
      • 方式二(通过ServletActionContext):
        String vs=ServletActionContext.STRUTS_VALUESTACK_KEY;
        ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute(vs);
        <2>操作值栈对象
      • 方式一:在Action中 提供get方法的方式
        因为Action本身在值栈中,所以可通过属性的get()方法从值栈中获取Action的属性值。
      • 方式二:手动操作值栈
        调用值栈的push和set方法手动操作值栈中数据。
        <3>struts2的El表达式
      • #号的使用
        & 获取值栈中的 上下文对象OgnlContext内的数据,如request的数据
        示例:<s:property value="#request.name"/>
        &遍历集合的值
        <s:iterator value="#{‘aaa‘:‘111‘,‘bbb‘:‘222‘ }" var="entry">

        ------------------------------

      • %号的使用
        & 强制解析Ognl的表达式
        <s:textfield name="name" value="%{#request.name}"></s:textfield>
        & 强制不解析Ognl的表达式
        <s:property value="%{‘#request.name‘}"/>
      • $号的使用
        在struts2配置文件中书写ognl表达式时使用。

        Struts2结合ognl技术封装数据的过程

        1 属性驱动
        (1)客户端发送请求参数,struts2的param拦截器进行拦截,ognl对参数进行处理。
        (2)ognl先从ValueStack值栈的Root栈里获取 Action实例里的 相关属性,为该属性赋值。
        2 对象驱动
        (1)客户端发送请求参数,struts2的param拦截器进行拦截,ognl对参数进行处理。
        (2)ognl先从ValueStack值栈的Root栈里获取 Action实例里的 相关对象,为该对象属性赋值。
        3 模型驱动
        (1)客户端发送请求参数,struts2的param拦截器进行拦截,ognl对参数进行处理。
        ()ognl先从ValueStack值栈的Root栈里获取 Action实例里的 相关对象,为该对象属性赋值。

原文地址:http://blog.51cto.com/14008076/2310435

时间: 2024-08-28 21:35:53

Struts2知识复习之三的相关文章

Struts2知识复习之一

#Struts2知识复习之一 概述:struts2是一个基于MVC设计模型的轻量级web应用框架,它本质上相当于servlet.它是 Struts1(早期基于MVC模式的轻量级Web框架) 和 WebWork(openSymphony组织的J2EE Web框架)技术的合并.它的核心是WebWork,采用拦截器的机制来处理用户请求,使业务逻辑控制器与ServletAPI脱离. struts2优势: 提供Exception异常处理机制 提供良好的Ajax支持 Result方式的页面导航,通过Resu

Struts2知识复习之四

Struts2的拦截器 1 需求概述 在CRM系统中,有用户登录功能,如果访问者知道后台的访问页面路径, 可以没有登录直接进入CRM系统,所以要对没有登录的用户要进行拦截. 2 拦截器 (1)概述 * 在AOP(aspect-oriented progaramming)面向切面编程中 用于在访问某个方法和字段之前 进行拦截操作. * 拦截是AOP的一种实现策略. * 在Struts2的WebWork的中文文档解释拦截器为 动态拦截Action调用的对象. (2)拦截器在strust2的作用 *

Spring知识复习之三

Spring整合JDBC 1 Spring提供了很多持久层技术模板类 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core.JdbcTemplate Hibernate3.0 org.springframework.orm.hibernate3.HibernateTemplate IBatis(MyBatis) org.springframework.orm.ibatis.SqlMapClientTemplate JPA org.springframew

struts2知识系统整理

1.MVC 和 JSP Model 2 **   a.:M-Model 模型 包含两部分:业务数据和业务处理逻辑  b.V-View 视图:视图(View)的职责是负责显示界面和用户交互(收集用户信息).  c.C-Controller 控制器 项目中写的ActionServlet.--------------------------------------------------2.我们写的模式被我们称为JSP Model1,在其中我们有模型层(M),但是视图层(V)的  JSP中包含了业务逻

考试备战系列--软考--02基础知识复习

这部分主要是计算机基础知识的概念介绍,相关系列文章如下所示. 考试备战系列--软考--01基础架构概念 考试备战系列--软考--02基础知识复习 考试备战系列--软考--03综合知识复习 考试备战系列--软考--04考题收集 考试备战系列--软考--05案例收集 考试备战系列--软考--06论文准备 操作系统时计算机系统的核心系统软件,其他软件均建立在其上,其分类包括:单用户操作系统和批处理操作系统.分时操作系统和实时操作系统.网络操作系统和分布式操作系统.嵌入式操作系统.其4大特征为并发性.共

struts2 知识梳理

一:struts.xml配置详解: 1.<include> 表示引入其他配置文件 2.<constant> 定义常量 3.<package>:  属性 是否必需 描述name 是 包名,作为其它包应用本包的标记extends 否 设置本包继承其它包namespace 否 设置包的命名空间,会改变url,abstact 否 设置为抽象包 4<action>和<result> <action>有name,class,method,conv

php高级进阶系列文章--第二篇(PHP基础知识复习)

php基础知识复习 本文中对于简单的知识点只会提及一下(例如什么控制结构什么的),对于较有难度的详细复习下(例如面向对象的反射等等) 再次申明,本系列文章不是从最基础的开始复习,对于零基础的可能不适用,本文的初衷是我要准备攻读源码,在攻读前将之前的知识牢固下,太过简单的就写在文中了 1,echo print echo 可以输出一个或者多个字符串 print 只可以输出一个字符串,返回值总为1 2,PHP7中的组合比较符 echo 1 <==> 1 // 0 echo 1 <==>

c基础知识复习

C的发展历程 C原本是为了开发UNIX操作系统而设计的语言:如此说,应该C比UNIX更早问世,而事实并非如此,最早的UNIX是由汇编写的: C语言本来是美国人开发的,解读C的声明,最好还是用英语来读: 解读C声明的步骤: 1.首先着眼于标识符(变量名或者函数名) 2.从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针.数组和函数).优先顺序说明如下: a.用于整理声明内容的括号: b.用于表示数组的[ ],用于表示函数的( ) c.用于表示指针的* 3.解释完成派生类型,使用 “of”.

Struts2 知识体系

1.struts2是什么 struts2是用于企业级Web开发的框架,基于struts2开发Web应用程序,在开发效率.可扩展性.可维护性上都会大有提升. 2.struts2的优点 struts2框架是典型的实现了MVC架构的框架,使用struts框架,通过struts2.xml文件配置非常容易的将数据层(模型).控制层和视图展现层分离,开发出架构清晰的项目. 3.struts2的运行机制 参见博客:http://www.cnblogs.com/tengpan-cn/p/5210155.html