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

被折叠的 条评论
为什么被折叠?



