zoukankan      html  css  js  c++  java
  • Struts2学习总结(完整版)

    一、搭建struts2环境

    1、jar包的导入

    主要是到

     

    解压其中的一个工程,得到里面lib下包含的jar

     

     

    把这里的所有的jar包拷贝到项目的

    WEB-INF目录下的lib文件夹下面。

    2、配置struts.xml文件

    注意:必须要放在src目录下,因为struts2源码就是这样设计的,只有在src目录下才读取得到。

     

    每一个package都要extends=”struts-default”namespace 是 访问的路径

        

    Action中的namepackage中的namespace组成完整的访问路径

    3、配置web.xml

    <filter>

            <filter-name>action2</filter-name>

    <filter-class>

    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    </filter-class>

    </filter>

    <filter-mapping>

            <filter-name>action2</filter-name>

            <url-pattern>/*</url-pattern>

    </filter-mapping>

    4、编写的Action类都要继承ActionSupport类或者implements Action接口

      默认action类访问的是里面的execute方法

     

    如果要访问特定的方法,可以这样:

    (1)action 后面指定 method=“方法名”

    (2)使用通配符  <action name=”example_*”  class=”com.XX.YY.ZZ” method=”{1}” />

    (3)使用动态表达式  比如example!execute(不常用)

     

    5、接收表单提交的数据

    (1)属性驱动获取表单参数

    --action类中定义与表单的input中  name  一样的属性(必须一样,否则注入不进去)

    同时还要生产属性对应的set 方法,因为 action类要调用set方法把表单中的参数注入到属性中

    (2)模型驱动获取表单参数

    --模型驱动首先action类要实现ModelDrivern,然后重写getModel方法

    --action类中声明并创建接收表单参数的实体类(Student user = new Student())

    --原理分析:struts2调用action类的getModel方法,得到user对象,然后利用user对象里面的set属性的方法,设置user对象的属性值

    --注意,表单的参数name必须要跟Student的属性值一致,否则注入不进去。

    (3)表达式驱动获取表单数据

    --表单提交的时候要注明是哪个类的,比如user.name

    --然后action类要生成user对象的get方法,可以让struts2获取到actionuser对象,然后调用user对象里面的get set方法,把参数注入到user对象的属性中去。

    --表达式驱动的方式的好处是,表单可以传递多个不同pojo的对象上来,比如不仅可以上传user的,也可以上传book的。这样,在表单中input中表明 name的时候,写上  user.xxx  book.xxx

    --表达式还支持  map list 表单,可以同时上传多分一样的参数(不常用)

    Map[“one”].name -> getMap<String , Student>

    List[0].name    -> getList<Student>

    下面的图是参考这货的

    http://www.cnblogs.com/lolybj/tag/struts2/

     

     

    6、把要显示的数据传给前端JSP页面

      原理是利用到struts2的值栈空间,每一次request请求,都会重新创建出一个action类出来,然后在执行action类的方法之前,要经过一系列拦截器的拦截,比如ModelDrivern过滤器进行表单参数的注入。放行后才执行action方法。

    以下是action类在值栈中设置数据的三种方法:

    1、执行action方法的时候,可以获取ValueStack,并向ValueStack中插入数据。

    2、直接在action类中定义pojo类,并创建好实例,生成get方法,方便jsp那边获取。

    3、直接在action类中定义list对象,并将pojo类存入到list对象中去。

    设置完之后,就会跳转到指定的jsp页面。

    在指定的jsp页面中必须导入<%@ taglib uri="/struts-tags" prefix="s" %> 

    Struts2的表达式,其实这个表达式底层调用的是ognl表达式,所以一开始的时候要导入ognl表达式的jar包。

    Jsp中获取值栈的数据。有3中方式

    1、<s:property value=”插入值栈的变量名”/>

    2、<s:iterator value=”list” >

       <s:property value=”user.username”/>   //对象名称.对象属性

       <s:property value=”user.password”/>

            </s:iterator>

        3<s:iterator value=”list” var=”user”>

       <s:property value=”#user.username”/>   //对象名称.对象属性

       <s:property value=”#user.password”/>

            </s:iterator>

    3种为什么要加#号,那是因为 iterator遍历的时候,先把list中的元素对象先存储到context的值栈空间里,context值栈空间的数据结构是map 的。所以要提供user作为键值,获取到user对象,然后根据对象的get方法,得到user的属性值。

    这里要说明一下,action的值栈空间有两部分组织,一部分是root空间,数据类型是list类型的;另一部分是context空间,数据类型是map的。

     

    7、最后是拦截器

    拦截器和过滤器是不同的概念的东西;

    过滤器:在容器上运行的,会过滤htmlimage... 网页文件。理论上是过滤所有的网页的

    拦截器:只是拦截某一个action操作的

     

    拦截器主要运用是 AOP 和 责任链的设计模式。所以可以做到在创建action类对象后,但是在执行action方法之间执行。

     

  • 相关阅读:
    Oracle 导入导出 创建用户等
    如何导出 Windows EventLog
    QT connect 的信号,不能写类名
    Easylogging
    Openstack Swift SLO & bulk delete 测试常用命令,文件等
    Openstack Swift Static Large Object (SLO)
    Linux 创建指定大小的文件
    Openstack Swiftclient 查看 log
    Openstack Swift 批量删除 (bulk delete)
    winsock server 示例代码中 shutdown 的选项
  • 原文地址:https://www.cnblogs.com/chencanjian/p/6566186.html
Copyright © 2011-2022 走看看