• struts学习总结


    -- struts2 是在struts1和webwork基础上发展的全新框架。

    -- struts2解决的问题:
    原始的servlet中,每需要操作一个crud的操作就要创建一个servlet,虽然后面
    使用了baseServlet,但是还是不够好。struts2就是用来解决这个问题的。
    解决问题的原理:使用过滤器,根据不同的请求来执行同一个类(Action --> 由form
    表单中的action属性得来)中的不同方法

    --- 过滤器服务器启动就创建,servlet默认第一次访问创建
    struts2访问流程:浏览器地址栏输入地址->进入struts过滤器

    -- struts2过滤器(StrutsPrepareAndExecuteFilter)所做的工作:
    1.获取请求的链接、得到路径中的最后一个‘/’后的值,例如:demo(.action)。
    2.得到src下面的struts.xml,使用dom4j解析获取得到xml文件中的内容,拿着demo值得
    到xml文件中找action标签,匹配name值是否一样。
    3.匹配action标签后,找到该action标签中的class,使用反射创建class对于的类,并
    执行里面的execute方法。
    4.得到execute执行后的返回值,再到struts.xml中去寻找与result标签,匹配到result
    标签中的name属性后,跳转到result标签中规定的页面中去。

    -- 过滤器在服务器启动的时候通过执行init()方法来创建
    init()方法中主要加载配置文件,包括我们创建的和struts2自己的配置文件 -->重
    点struts.xml和web.xml

    -- struts2核心配置文件
    标签
    -- package:类似于代码包,区别不同的action
    -- name属性:属性值和功能本身是没有关系的。配置文件中可以有多
    个,但是name值不能相同。
    -- extends属性:extends="struts-default",固定写法。让类具有、
    Action功能
    -- namespace属性:和action标签构成访问路径。
    -- action :配置action的访问路径
    -- name:和package中的namespace构成访问的路径,可以有多个但是
    不可name值不可重复
    -- class:action全路径
    -- method:请求的方法,指定action要执行的方法
    -- result:根据action的方法的返回值,跳转到不同页面
    -- name属性:和方法返回值一样
    -- type属性:配置跳转页面的方式(转发或者重定向),默认是转发

    -- 修改struts2默认常量值
    在struts.xml中配置
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>

    处理了post提交的中文乱码

    -- struts2分模块开发:就是创建不同的action的配置文件,最后在struts中使用
    include标签包含进去。

    -- struts2 中Action的编写方式
    1.一个普通类 写execute()方法就行
    2.实现Action接口
    3.继承ActionSupport类 --推荐

    -- struts2访问方法的方式
    1.在配置文件中的action标签中配置method属性 --缺陷:每个方法都要配置一个
    action
    2.通配符 *:--- *匹配任意值 {index} index为int值,例如:{1},表示取第几个*的

    例如访问m1方法,地址栏输入:http://localhost:8080/struts2/hello_m1,即可。

    3.动态配置 --不使用


    -- struts2 全局结果配置
    适用于 返回的结果和跳转的页面一致的时候使用
    <global-results>
    <result name="success">success.jsp</result>
    </global-results>

    -- struts2 局部结果配置
    就是在action标签中的result标签,局部结果配置优先于全局结果配置

    -- result 的type属性
    type属性:配置如何到路径里面(转发还是重定向)
    -- 默认值:转发。值是:dispatcher
    -- 重定向 值是:redirect
    ---------上面两种针对的是页面
    -- chain:转发到另一个Action ---- 一般不用
    -- redirectAction:重定向到另一个Action

    -- action获取表单提交数据的三种方式
    (1)使用ActionContext类
    (2)使用ServletAcitonContext类
    (3)使用接口注入,实现一个ServletRequestAware接口 -- 一般不用

    -- struts2封装获取数据
    -- 属性封装:Action中定义与数据同名的成员变量并写出与其对应的set方法
    ,他只能把数据保存到属性里面,但是无法直接封装到实体类中。 -- 不常用

    -- 模型驱动封装:直接把数据封装到实体类中。
    实现过程:
    1.实现ModelDriven;2.实现getModel方法;3.在Action成员位置中创建实
    体对象,并在getModel中返回

    -- 表达式封装(也算作属性封装)。
    实现过程:
    1.在Action里面声明实体类
    2.生成实体的get和set方法
    3.form表单中的input的name属性写法为:实体对象变量名.实体属性,例
    user.username ,user为User类的变量名,username为User类中的一个属性

    -- 使用模型驱动和属性封装注意的问题:
    不同同时使用模型驱动和属性封装来获取同一个表单数据,若同时存放,只会
    执行模型驱动
    --使用模型驱动只能把一个表单数据封装到一个实体类中,但是表达式封装可
    以将表单数据封装到多个实体类中

    -- struts2 封装数据到集合中

    --封装到List集合中
    1.在Action中声明一个List集合
    2.生成list的set和get方法
    3.在页面中写表达式 list[0].username...
    --封装数据到Map集合
    1.在Action中声明一个Map集合
    2.生成Map的set和get方法
    3.在页面中写表达式 map['one'].username ...将username封装到key为one的map中
    注:username是User实体中的一个属性

    -- ognl表达式
    -- 概述:和EL表达式一样的表达式,但是比EL表达式更加强大
    -- 在struts2里面和其标签一起操作值栈数据
    -- ognl不是struts2里面的一部分,是一个单独的项目,经常和struts2一起使用


    -- 值栈
    -- 之前servlet阶段将数据存放到域对象中,struts2中将数据存在值栈中---- -- 在action里面把数据放到值栈中,在页面中获取到值栈
    -- servlet和action的区别:
    1.servlet默认在第一次访问的时候创建,只创建一次 单例对象
    2.action访问的时候创建,每次访问都要创建 多例对象
    -- 值栈存储位置:
    每次访问action都会创建一个action,每个action对象都会有一个值栈对象(有且仅有一个)

    -- 获取值栈对象
    --方式:
    1.使用ActionContext类里面的方法得到值栈对象 --常用方法
    ActionContext context = ActionContex.getContext();
    ValueStack vs = context.getValueStack();
    2.
    -- 值栈内部结构

    -- 分为两个部分:
    第一部分:root,结构是list集合,一般都操作这个部分 CompoundRoot类
    第二部分:context,结构是map集合,不常操作 -- OgnlContext类 ,是ognl中的 ,存放的是对象的引用,key的值是固定的有:request、session、application、parameters、attr

    -- action对象里面有值栈对象,值栈对象里面有action的引用


    -- 向值栈放数据
    栈顶对象是Action的引用
    1.获取值栈的对象,调用值栈对象里面的set方法
    键值对形式,在栈顶生成一个HashMap对象
    2.获取值栈对象,调用值栈对象里面的push方法
    在栈顶生成一个String对象
    3.在Action定义变量,生成变量的get方法 ,在执行的方法中赋值 ---- 主要使用
    值直接存放到Action中,减少了空间的分配

    --

    -- struts2遍历list的机制:把每次遍历出来的对象都放在了Context里面
    在Struts2中ognl取Context(域)里面的数据,需要使用特殊符号 ,即:<s:property value="#user.username">

    -- 获取使用set方法存放到值栈的值就是使用常规的<property>标签,获取push方法存放的值,使用property标签,加 属性 value="[0].top" ,表示


    -- EL表达式为什么能够获取到值栈里面的数据 --- 不推荐使用,性能低。
    1.EL获取的是域对象里面的值
    2.域对象使用setAttribute方法存放值,使用getAttribute方法获取值
    3.底层增强request对象里面的getAttribute方法
    -- 首先从request域获取值,获取到直接返回
    -- 获取不到,就到值栈中把值获取出来,把值放到域对象里面

    --- 源码增强的是HttpServletRequest ,重写getAttribute方法,将值放到值栈中

    -- ognl表达式中 #和%的作用
    -- #:获取context里面的对象(或值),即:#context的key名称.域对象(值);例#request.username. ---------- context里面的值是固定的域名

    -- %: 在struts2标签中的表单标签中使用,因为Struts2中不认识#开头的ognl表达式,要‘#value’替换为'%{value}'

    ------  struts执行的流程&filter的功能

    --------------- 通配符访问方法

    --------------- 值栈内部结构

  • 相关阅读:
    流程图的标准画法
    java应用,直接请求没问题,通过nginx跳转状态吗400
    jenkins启动java项目的jar包总是退出
    可以通过下面的脚本直观的看一下当前系统中所有进程的得分情况:
    sonarqube安装的坑
    Windows共享设定-使用net use添加网络盘带上账号密码
    Synctoy2.1使用定时任务0X1
    如果报错,使用 journalctl -f -t etcd 和 journalctl -u etcd 来定位问题。
    NodePort 只能在node节点上访问,外部无法访问
    mysql5.7 yum安装
  • 原文地址:https://www.cnblogs.com/getchen/p/8005304.html
Copyright © 2020-2023  润新知