目录
》6.3.3 在action中定义变量,生成变量的get方法(常用)
1.Struts2执行过程
2.核心配置文件struts.xml标签以及属性
<struts>
<package name="hellodemo" extends="struts-defalut" namespace="/">
<action name="hello" class="com.action.Action">
<result name="ok">/hell.jsp</result>
</action>
</package>
</struts>
constant
用于修改常量
name:struts.i18n.encoding
value:UTF-8
还有两种方式(了解)
- 在src下面创建 struts.properties,进行修改
- 在web.xml进行配置
package
package里面才能配置action
name:只是为了区分不同package,和功能本身没有关系
extends:属性值固定->struts-defalut,写了这个属性之后package才具有action功能
namespace:要和action标签里面的name属性值构成访问路径 比如 /(namespace) + hello(action) 不过默认为/
action
配置action的访问路径,指定通过什么路径来访问哪个类
可以有多个action但是name不能相同
name:和namespace构成访问路径
class:要访问的那个类的全路径
method:action默认执行execute方法,但可以用method来让action的多个方法执行
result
根据调用action的class指定的类的方法返回值 配置到不同的路径(页面)中去
name:同方法的返回值
type:配置如何到路径(转发or重定向)
默认为转发(dispatcher),重定向(redirect)
-chain:转发到action,一般不用,有缓存问题
-redirectAction:重定向到action
3.action方法访问的三种方式
3.1 用action标签的method属性值指定方法
没有指定method的话 则执行execute()方法
3.2 通配符方式实现
{1}代表第一个* 比如访问book_add.action,此时{1}就代表add
可以有多个*
3.3 动态访问实现(不用)
4.结果页面配置
4.1全局结果页面配置
如果多个action,返回值是相同的,指向的页面也是相同的(多行相同的<result></result>)
在<package>标签里面配置
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
配置完之后就不用写result了 对当前package内所有action(全局)生效
4.2局部结果页面
就是一般地用<result>标签(一个action对应一个result)
5.获取表单提交数据
5.1原始方式request
5.1.1ActionContext类
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();
5.1.2ServletActionContext类
HttpServletRequest request = ServletActionContext.getRequst();
String username = request.getParameter("username");
5.1.3接口注入(一般不用)
让action实现接口-->为了得到request对象
ServletRequestAware接口
5.2 Struts封装方法
5.2.1属性封装(继承ActionSupport)
步骤:
1)将表单会提交的数据,定义在action里面
-变量名称和表单输入项的name属性值一样
2)生成变量的set方法(get/set)
原理:内省
缺点:不能把数据直接封装到实体类的对象
5.2.2模型驱动封装(重点)
步骤:
1)action实现接口ModelDriven
2)实现接口方法getModel -将创建对象返回 (也需要变量名称和表单输入项的name一样)
3)在action里面创建实体类对象
5.2.3表达式封装
步骤:
1)声明实体类(User)
2)生成实体类变量的set和get方法
3)表单输入项的name属性值用表达式形式(eg: name="user.username")
6.值栈
6.0如何得到值栈
actionContext.getValueStack()
6.1什么是值栈
值栈:Struts2里面自己的存储机制(类似于web中的request域)
每次访问action都会创建action对象,每个action对象都会有且只有一个值栈对象
6.2值栈的内部结构
主要的两部分:root和context
6.2.1 root (list集合)
操作的是root里面的数据
6.2.2 context (map集合)
value中存储的是对象的引用
6.3三种方式向值栈中存取数据
6.3.1 set方法
stack.set("username", "hello");
少:在jsp中用<s:property value="username"/>可以获取"hello"
6.3.2 push方法
stack.push("hello");
少:<s:property value="[0].top"/> 取到栈顶的值
6.3.3 在action中定义变量,生成变量的get方法(常用)
eg:①定义一个变量name,设置对应的②get方法,在action中③赋值name="abcdefgh";
优点:直接在action中存储数据,不会造成存储空间的浪费
6.4 从值栈中取list集合
6.4.1
6.4.2 遍历list集合
6.4.3 遍历list集合
注意:遍历list出来的user对象是放到context里面的!!
EL表达式也可以取到值栈数据
原因:
底层增强request对象里面的方法getAttribute方法
1)先从request域获取值,如果获取到就直接返回
2)如果获取不到值,就从值栈中把值获取再存到域对象里面
6.5 用OGNL操作值栈
作用:和Struts标签一起使用来操作值栈
6.5.1 #的使用
6.5.2 %的使用
在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。
7.拦截器(interceptor)
*位置
struts2-core-xxxx.jar内的struts-default.xml中
*执行时间
action对象创建之后,action方法执行之前
*底层原理
1)aop思想
不修改源代码(不是通过调用拦截器的方法)
而是通过配置文件,来建立和拦截器的关系
2)责任链模式
java中的设计模式之一,和过滤链相似
过滤链:一个请求有可以有多个过滤器进行过滤,而只有过滤器进行放行之后才能进行下一个过滤器
责任链中就是进行 不是过滤的操作 但之后要放行 才能向下运行
*执行原理
主刀医生 -- 递工具的护士
默认的过滤器 -- 过滤器中的过滤器(一个一个按顺序执行)
*和过滤器区别
1)过滤器:过滤器理论上可以过滤任何内容,html、jsp、servlet、图片路径
2)拦截器:拦截器只可以拦截action
*Servlet和action区别
1)Servlet默认第一次访问的时候创建,创建一次,单实例对象
2)action每次访问时创建,创建多次,多实例对象
*自定义拦截器功能
1)创建类,继承MethodFilterInterceptor类(好处:可以让某个方法不进行拦截)
2)重写里面的方法,拦截器的逻辑,(放行 return invocation.invoke())
3)配置action和拦截器的关系(注册拦截器)
>>>在拦截的action的package声明拦截器<interceptors>...</interceptors>
>>>在具体的action里面使用拦截器 <interceptor-ref name=""></interceptor-ref>
>>>配置了自定义拦截器之后,默认的拦截器就不会执行了,所以要再手动使用默认拦截器<interceptor-stack name="defaultStack"></interceptor-stack>
4)配置不需要拦截的方法:在interceptor-ref标签中<param name="excludeMethods">方法名</param>
8.Struts2的标签库
常用标签
s:property:和ognl表达式在jsp页面获取值栈数据
s:iterator:获取值栈list集合数据,表示list集合
s:debug:查看值栈结构和数据