Struts2框架学习总结

本文详细介绍了Struts2框架的基本概念,包括环境搭建、配置文件解析、过滤器配置、执行流程等。深入探讨了action、result标签的使用,以及OGNL表达式、拦截器、自定义拦截器的实现方法。同时,讲解了如何通过Struts2标签库和OGNL进行数据操作。

day01

1、Struts2入门

(1)导入jar包

(2)创建action

(3)配置action类访问路径

1. 创建Struts2核心配置文件:

名称必须是struts.xml 。位置必须在src下

2. 引入dtd约束

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

3. action配置

(4)配置struts2过滤器(StrutsPrepareAndExecuteFilter)

访问路径:http://127.0.0.1:8080/Struts2/hello.action

 

2、Struts2基本执行过程

(1)浏览器输入地址,通过struts2的过滤器获取请求路径

(2)到src下找struts.xml,使用dom4j解析xml的内容,通过获得的请求路径在xml中找action标签,匹配有name相同的action

(3)当匹配到name相同的action标签,获得action标签中class属性值,通过反射,执行该class类的execute方法

(4)得到execute方法的返回值,在action标签中找result标签,匹配是否有name相同的,如果有,就跳转到配置的页面

 

3、package标签

* 类似于代码包,用来区分不同的action,要写action必须先写package标签

* 属性:

name:name本身和功能没有关系,可以写多个package,但是每个package标签的name不能相同

extends:属性值是默认的。struts-default

添加了这个属性,代表里面配置的类具备了action的功能

namespace:namespace属性值和action标签里面的name属性值构成访问路径

默认可以不写,默认值为 /

 

4、action标签

* action标签用来配置action的访问路径

* 属性:

name:与package标签的namespace属性值构成访问路径,在package标签里面可以有多个action,但是name值不能相同

class:action的全路径

method:让action类多个方法进行执行,使用method进行配置

 

5、result标签

* 根据action的方法返回值,配置到不同的路径

* 属性:

name:和返回值相同,值是路径

type:配置如何到路径中(转发或重定向),默认是做转发

 

6、常量配置

修改struts2默认常量值,常用方法在struts.xml进行配置:

<constant name="" value=""></constant>

常用常量:

struts.i18n.encoding=UTF-8

(如果在action获取表单通过post方式提交中文,中文乱码已经解决,不需要自己配置)

 

7、分模块开发

思想:每个开发人员单独写配置文件,把配置文件引入到核心配置文件中(include标签)

 

8、action的编写方式

(1)创建普通类,不继承任何类,不实现任何借口

(2)创建类,实现接口Action

(3)创建类,继承ActionSupport(建议使用)

ActionSupport实现了接口Action

 

9、访问action的方法:有三种方式(重点)

(1)使用action标签的method属性,在这个属性里面写执行的action的方法

定义方法:

使用method配置:

(2)使用通配符方式实现

A:在action标签的name属性,使用*符号表示任意字符

B:在method属性写name使用第几个*的位置,格式是{1}

(3)动态访问(一般不用)

 

* 在action的方法里,如果有返回值,返回值类型必须是String

* 如果没有返回值,result标签不需要配置

(1)可以使用void

(2)可以返回“none”或Action.NONE, NONE

 

day02

1、结果页面配置

(1)全局结果页面配置

如果多个action的方法返回值相同,到的页面也相同,这个时候可以使用全局结果页面配置

在package里面有效!!

(2)局部结果页面配置

如果即配置了全局结果页面配置,又配置了局部的,以局部的为准

 

2、result标签的type属性(重点)

属性意义:如何到路径去(转发还是重定向)

属性值:

dispatcher:默认值,转发操作

redirect:重定向

(上面两个一般针对到页面中)

chain:转发到action(一般不用,会存在缓存)

redirectAction:重定向到action(写的是action的name值)

 

3、获取表单数据(三种方式)

(1)使用ActionContext类

A:得到ActionContext对象

B:调用getParameters方法得到表单数据,value是数据的形式

(2)使用ServletActionContext类(程序员比较喜欢使用)

A:使用ServletActionContext的静态方法得到request对象

B:通过request对象获取表单数据

(3)使用接口注入方式

A:action类实现ServletRequestAware接口

B:实现方法,得到request对象

C:通过request对象获取表单数据

 

4、在action操作域对象

使用ServletActionContext得到域对象(request、session、ServletContext )

HttpServletRequest request= ServletActionContext.getRequest();

HttpSession session = request.getSession();

ServletContext scontext = ServletActionContext.getServletContext();

 

5、属性封装

直接把表单提交属性封装到action的属性里面

实现步骤:

(1)在action成员变量位置定义变量

- 变量名称和表单输入项的name属性值一样

(2)变量生成set方法(可以把get、set方法都写出来)

使用属性封装获取表单数据到属性里面,并不能把数据直接封装到实体类对象里!

 

6、模型驱动封装(重点)

可以直接把数据封装到对象里面

实现步骤:

(1)action类实现ModelDriven<T>接口

(2)在成员变量位置new一个T对象

(3)实现接口里的方法,返回T对象

注意问题:

在一个action中,不能同时使用属性封装和模型驱动封装获取同一个表单数据,如果同时使用,只会执行模型驱动封装。

 

7、表达式封装(了解)

可以把数据封装到对象里面

实现步骤:

(1)在action的成员变量位置声明实体类

private User user;

(2)生成实体类变量的set和get方法

(3)在表单输入项的name属性值写表达式形式(user.username)

 

8、数据封装到list集合

(1)在action声明List

(2)生成list的get和set方法

(3)在页面的表单输入项的name值写表达式

 

9、数据封装到Map集合

(1)在action声明List

(2)生成list的get和set方法

(3)在页面的表单输入项的name值写表达式

 

day03

1、OGNL

OGNL是一种表达式,功能很强大。

* 在struts2里面操作值栈

* 一般和struts标签一起使用操作值栈

* OGNL不是struts2的一部分,只是经常和struts2一起使用

 

2、引入struts2标签库

<%@ taglib prefix="s" uri="/struts-tags" %>

使用ognl+struts2标签计算字符串长度,value值使用ognl表达式:

<s:property value="'seses'.length()"/>

 

3、值栈

什么是值栈:

在struts2里面提供本身的一种存储机制,类似于域对象,就是值栈。可以存值和取值,是在action里面将数据存到值栈中,在页面从值栈中去出来。

存储位置:

(1)每次访问action时,都会创建action对象

(2)每个action对象里面都会有一个值栈对象(只有一个值栈对象)

 

4、servlet和action的区别

(1)servlet:默认在第一次访问时候创建,创建一次。是单实例对象

(2)action:访问时创建,每次访问action时,都会创建action对象。是多实例对象

 

5、获取值栈方式

获取值栈有很多方式。

常用的方式:使用ActionContext对象的方法得到值栈对象

 

6、值栈的内部结构

第一部分:root,结构是list集合,继承自ArrayList

一般主要操作root里面的数据。

第二部分:context,结构是map集合,实现Map接口

(1)使用struts2标签s:debug可以查看值栈的结构。

(2)通过action访问jsp页面,会出现一个链接,点击就可以看到值栈结构

(3)在action没有任何操作,栈顶元素是action的对象引用

 

6、值栈中存放数据

第一种方式:获取值栈对象,调用值栈对象里面的set方法

stack.set("key","value");

在值栈里的root部分,存放的是HashMap

第二种方式:获取值栈对象,调用值栈对象里面的push方法

stack.push("haha");

在值栈里的root部分,存放的是push放的类型,string

第三种方式:在action里成员变量位置定义变量,生成变量的get方法(主要用的)

好处:可以节省空间

(1)在成员变量位置定义变量

(2)生成get方法

(3)在执行方法中设置变量的值

name = "lisi";

在值栈里的root部分,存放在action对象里面

 

7、向值栈中放对象

(1)定义对象变量

(2)生成get方法

(3)在执行方法中设置对象的值

在值栈里的root部分,存放在action对象里面

 

8、向值栈中放list集合

(1)定义list变量

(2)生成get方法

(3)在执行方法中向list设置值

在值栈里的root部分,存放在action对象里面

 

9、从值栈中获取数据

获取字符串:在jsp页面使用struts2标签+ognl表达式获取

获取对象:

获取list集合:

方式一:<s:property value="list[0].username"/>

方式二:使用<s:iterator>标签遍历值栈的list集合

方式三:使用#+ognl表达式取context里面的数据

 

10、获取set、push放的数据

(1)获取set方法存放的数据:根据名称获取

设置:stack.set("key","value");

获取:<!-- 获取set方法存放的数据 -->

<s:property value="key"/>

(2)获取push方法存放的数据:因为没有名称,只有设置的值,所以strtus2会将数据放到数组里面,数组名称为top,然后根据数组获取数据

获取栈顶:<s:property value="[0].top"/>

 

11、EL表达式获取值栈的数据

为什么?

EL表达式获取的是域对象里面的数据,而struts2底层是增强了request对象里面的getAttribute方法,先从request域获取值,如果能获取到,直接放回,如果不能获取到,就从值栈中获取值,把值放到域对象里再返回。

 

12、# 符号

获取context里面的数据:<s:property value="#user.username"/>

获取request域的数据:<s:property value="#request.key"/>

 

13、%符号

在struts2的表单标签里面使用ognl表达式,直接使用struts2是不认识的,得加上%{}才会识别!

 

 

day04

1、拦截器

* 拦截器在action对象创建之后,方法执行之前 执行。

* 底层原理:

(1)aop思想:面向切面编程

(2)责任链模式:和过滤链很相似,要执行多个操作,先执行第一个操作,要执行类似于放行操作才能执行第二个操作,以此类推。

拦截器在action对象创建之后,方法执行之前执行,就是利用aop思想,而要执行很多拦截器是,就是使用责任链模式执行多个拦截器。

 

2、过滤器和拦截器的区别

(1)过滤器:过滤器理论上可以过滤任意内容

(2)拦截器:拦截器只拦截action

 

3、自定义拦截器

第一步、创建类,继承MethodFilterInterceptor类

第二步、重写MethodFilterInterceptor的方法,写拦截器逻辑

第三步、配置action和拦截器的关系(注册拦截器)

(1)在要拦截的action标签所在的package标签里面声明拦截器

(2)在具体的action标签里面使用声明的拦截器

(3)struts2里面执行了很多拦截器,但是如果在action里面配置了自定义拦截器,默认的拦截器就不会执行,解决方案就是手动使用一次默认拦截器

*** 配置拦截器,会对action里面的所有方法都进行拦截。

第四步、配置不拦截方法

在自定义拦截器里面配置不拦截的方法,使用<param>标签,name值为excludeMethods

 

5、struts2常用标签

(1)s:property:和ognl表达式在jsp页面中获取值栈中的数据

(2)s:iterator:获取值栈中的list集合数据,表示遍历list集合

(3)s:debug:查看值栈结构和数据

表单标签:

s:form:form表单标签

s:textfield:普通输入项

属性:name:名称 label:会将此处的值放在该标签的前面

s:password:密码输入项

s:radio:单选输入项

属性:list:单选的值

s:checkboxlist:复选框

s:select:下拉输入框

s:file:文件上传项

s:hidden:隐藏项

s:submit:提交按钮

s:reset:重置按钮

s:textarea:文本域

属性:rows:行 cols:列

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值