A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 敲代码--- 初级黑马   /  2018-5-17 09:13  /  449 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、Struts2简介
  1.概念:轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。低侵入性,与业务代码的耦合度很低。Struts2实现了MVC,并提供了一系列API,采用模式化方式简化业务开发过程。
  2.与Servlet对比
    优点:业务代码解耦,提高开发效率
    缺点:执行效率偏低,需要使用反射、解析XML等技术手段,结构复杂
二、Struts2使用
  1.使用步骤
    导入Struts2核心jar包
    在web.xml配置前端控制器filter  
<filter>
    <filter-name>Struts2</fileter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
<filter-mapping>
 创建struts.xml(格式可以参考核心包根路径下的DTD文件,struts-default.xml)
    编写控制器Action
      - 方法是public的
      - 返回值为String类型(返回值与struts.xml->action->result的name属性匹配,即根据此返回值找到对应result)
      - 参数列表为空
    创建JSP页面
    配置struts.xml 
<struts>
    <!--
        package:包,用于对Action进行封装
        name:包名,根元素下可以有多个包,彼此不能重名
        extends:继承,用于指定继承的包,相当于将继承包下的配置信息复制到当前包
        namespace:命名空间,用于规定Action的访问路径,必须“/”开头    -->
    <package name="test01" namespace="/test01" extends="struts-default">
        <!--action:业务控制器,用于注册业务控制器组件
            name:action名称,用于规定Action的访问路径
            class:业务控制器组件,用于指定业务控制器对应的类
            method:方法,用于指定访问当前action时要调用的方法
            *请求URL:http://ip:port/projectName/namespace/ActionName.action
        -->
        <action name="hello" class="test01.konrad.action.HelloAction" method="execute">
            <!--result:输出组件,用于转发、重定向、直接输出
                name:名称,一个action下可以有多个result,彼此不能重名
                默认值转发,元素内设置转发的页面
            -->
            <result name="success">
                /hello.jsp
            </result>
        </action>
    </package>
</struts>
三、参数传递
  1.Action从页面取值  
    a)基本属性注入(页面,Action) 
             b)域模型注入(页面,Action)
      2.页面从Action取值
    a)使用EL表达式
             b)OGNL
四、OGNL
  1.概念:Object Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。Strut2默认采用OGNL表达式访问Action的数据,实际上是通过ValueStack对象来访问Action。
  2.用法:在Struts2中,OGNL表达式要结合Struts2标签来访问数据
    EL:${user.userName} <==> OGNL:<s:property value="user.userName">
    *a)访问基本属性  <s:property value="属性名"/>
    *b)访问实体对象  <s:property value="对象名.属性名"/>
    c)访问数组/集合  <s:property value="someArray[1]"/> | <s:property value="someList[1]"/>
    d)访问Map  <s:property value="someMap.key" />
    e)运算  <s:property value="'My name is' + name" />
    f)调用方法  <s:property value="name.toUpperCase()" />
    g)创建集合  <s:property value="{'a','b','c'}" /> ArrayList
    h)创建Map  <s:property value="#{'mm':'MM','nn':'NN'}" /> LinkedHashMap
五、ValueStack
  1.概念:是Struts2中,Action向页面传递数据的媒介,封装了Action的数据,并允许JSP通过OGNL来对其访问
      2.访问ValueStack
    a)通过<s:debug>观察其结构
    b)输出栈顶:<s:property />
    c)访问Context对象:
      - OGNL表达式以"#"开头
      - 以key来访问context对象的值,即"#key"得到context中某属性值
    d)迭代集合  
        3.ValueStack栈顶的变化
    - 默认情况下栈顶为Action
    - 循环过程中,栈顶为循环变量(集合迭代时,循环变量是集合中的对象,即栈顶为实体对象,可以以实体对象为root来写OGNL表达式;数字迭代时,循环变量是数字,不能以数字为实体对象,需要通过var声明变量名,以"#变量名"来引用,此情况下,是从context对象中取出值)
    - 循环结束后,栈顶变回Action
    4.EL表达式访问ValueStack
    a)EL也是从ValueStack中取的值
    b)EL默认的取值范围是page,request,session,application
    c)Struts2重写的request的getAttribute方法,先试图从原始request中取值,如果没取到再从ValueStack中取值  
     

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马