-- 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的功能

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

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

struts学习总结的更多相关文章

  1. struts 学习

    1.在Struts2的Action中取得请求参数值的几种方法 public class GetRequestParameterAction extends ActionSupport { privat ...

  2. Struts学习总结 学习

    ContextMap 包含值栈包含 root(list结构)和context(map结构)  值栈包含contextMap的引用.  Actioncontext是工具类 可以获取他们 Struts2拥 ...

  3. mzy,struts学习(一)

    大家都在讲struts已经过时了,现在都是前后台分离,没有必要去学一个淘汰的框架,但是怎么讲呢?我觉得,struts能够流行那么多年,肯定有它的原因,肯定有很多优秀和好的地方,有一个指导过我的人给我讲 ...

  4. struts学习

    1.集成tomcat到eclipse http://www.eclipsetotale.com/tomcatPlugin.html 下载最新的plug后,解压.解压后的文件放到eclipse的plug ...

  5. Struts学习总结-04 上传文件

    1. upload.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  6. Struts学习总结-02 类型转换

    一 类型转换 input.jsp <%@ page language="java" import="java.util.*" pageEncoding=& ...

  7. struts 学习之问一

    今天在进行struts全局类型和局部类型转换时,发现一个问题,如下: 当输入一个点的坐标时,我使用全局转换提示错误,找不到类,当改变成局部类型转换时,可以成功转换,不知道这个是什么原因,难道全局不可以 ...

  8. Struts学习之流程汇总

    struts2 架构图如下图所示: 依照上图,我们可以看出一个请求在struts的处理大概有如下步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的 ...

  9. Struts学习之手动验证

    * 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法    * 要继承ActionSupport类或者实现Validateable接口     ...

  10. Struts学习之文件上传

    * 单文件上传:        * 在动作类action中声明相关属性:            * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型:  ...

随机推荐

  1. Head First设计模式之抽象工厂模式

    一.定义 给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:     1)系统中有多个产品族,而系统一次只可能消费其中一族产品.      2)同属于同一个 ...

  2. label按钮和文字对齐

    label按钮和文字对齐 做表单的时候,经常遇到:复选框和文字对不齐的情况 ========================== 下面方法可以对齐 <!--label [[--> < ...

  3. MapReduce工作原理流程简介

    在MapReduce整个过程可以概括为以下过程: 输入 --> map --> shuffle --> reduce -->输出 输入文件会被切分成多个块,每一块都有一个map ...

  4. Java 写三角形 空心三角形 菱形 空心菱形

    闲来无事,练习了一下Java基础中的循环语句.练习循环语句,当然少不了,用*打印出来三角形.空心三角形.菱形等这样的几何图形. 粗心大意,失误两次: 一.三角形 遇到一些小问题: 二.金字塔 由于三角 ...

  5. 什么是BIG?如何买BIG?

    谈到BIG,就要谈到BIG ONE.BigONE号称"全民交易所",也称"云币国际站".是 INBlockchian(硬币资本)旗下全球区块链资产现货交易所,是 ...

  6. 读汤姆大叔《JavaScript变量对象》笔记

    一段简单的JavaScript代码思考 先看一段简单的代码,打印结果是??为什么why?? 从上述打印结果不难看出,在打印基本变量num.函数表达式fn.函数声明fun时,就已经知道变量num.函数表 ...

  7. feed 流数据请求时机的两个思路

    最近 SF 首页 进行了大改版,效果如下: 其他地方都没什么难点,中间的 feed 流思考了不少时间,效果需要类似微博或者知乎 feed 流.之前一直没有做过类似的功能,现总结两个方案. 方案一 方案 ...

  8. 定义一个数,它可能为正 也可能为负 var num = Math.pow(-1,parseInt(Math.random() * 2) + 1);

    // 定义一个随机数范围从0 ~页面宽度 var x = parseInt(Math.random() * myCanvas.width); // 定义一个随机数 范围从0 ~页面高度 var y = ...

  9. 记录因webpack版本问题导致vue-cli快速搭建的项目运行时报错!

    今日突然在群里见到好几个小伙伴说在创建vue项目后不能跑,会报错. 刚开始还不信,花了几分钟时间自己试了下,还真报错了!如下图 小伙伴的报错,如下图!   百思不得其解,看了运行的日志也找不出原因.于 ...

  10. 队列的存储结构的实现(C/C++实现)

    存档 #include "iostream.h" #include "stdlib.h" #define max 20 typedef char elemtyp ...