一、Struts2中如何获取Serlvet的API
1、通过ServletActionContext的静态方法获取:【*****】
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
...
2、注入的方式:
主要由servletConfig拦截器完成;
HttpServletRequest可以通过实现ServletRequestAware接口获取
HttpServletResponse可以通过实现ServletResponseAware接口获取
二、OGNL表达式:【*****】
ognl本身是一个项目,可以单独使用,单一般都与ValueStack一起使用
ognl的作用:
支持对象操作,调用对象方法:
eg:Object value = Ognl.getValue("'hello'.length()",context,root);
支持静态成员访问
eg:Object value = Ognl.getValue("@java.lang.Math@PI",context,root);
访问ognl上下文,访问ActionContext
eg:context.put("username","tom");
Object value = Ognl.getValue("#username",context,root);
eg:Map<String,String> map = new HashMap<String,String>();
map.put("username","tom");
context.setRoot(map)
Object value = Ognl.getValue("username",context,root):
---->从根中获取数据不需加#,从context中获取数据需要加#【*****】
操作集合对象;支持赋值操作和表达串联
eg:Object value = Ognl.getValue("{1,2,3,}",context,root);
-->java.util.ArrayList
context.setRoot(value);
Object value = Ognl.getValue("[0]",context,root);
-->1
eg:Object value = Ognl.getValue("#{'username':'tom','age':12},context,root);
-->java.util.LinkedHashMap
context.setRoot(value);
Object value = Ognl.getValue("username",context,root);
-->tom
Object value = Ognl.getValue("username='fox'",context,root);
-->fox
Object value = Ognl.getValue("username='fox',age=13",context,root);
-->13
ognl的三要素:
表达式:
OgnlContext上下文:
OgnlContext context = new OgnlContext(); -->java.util.Map
Root根:
Object root = context.getRoot();
ognl的使用:
Object value = Ognl.getValue(表达式,context,root);
在strts2框架中使用ognl表达式:
导入标签库:<%@ taglib uri="/struts-tags" prefix="s"%>
<s:property value="表达式"/>
三、ValueStack【******】
简介:当客户端向服务器发送一个请求,服务器就好创建一个Action来处理请求,
Struts2中的action是多例的,每次请求都会有一个新的action,所有不存在线程安全的问题,
一个ValueStack对应一个action,ValueStack贯穿action的生命周期
request-->action-->valueStack valueStack保存在request域中
ValueStack的主要组成:
CompoundRoot root: -->ArrayList
存储action相关的数据
transient Map<String, Object> context: -->Map
存储web开发的信息:
parameters:请求参数
request:
session:
application:
attr:该Map按如下顺序来检索某个属性: request, session, application
-->从root中获取数据不需使用#,从context中获取数据需要加#
如何获取valueStack:
通过request对象获取:
ValueStack stack = (ValueStack) ServletActionContext.getRequest.getAttribute(ServletActionContext.SERUTS_VALUESTACK_KEY);
通过ActionContext获取:【*****】
ActionContext context = ActionContext.getContext();
valueStack stack = context.getValueStack();
ActionContext绑定到localthread上,所有:
request-->action-->ActionContext-->valueStack(一个线程)
-->ActionContext中有ValueStack的context的引用,context中有root的引用
valueStack存储数据:
-->主要是向root中存储数据
手动存储:
valueStack.push(""); -->List
valueStack.set("",""); -->Map
自动存储:
每次请求会自动将action存储到valueStack中
如果action实现了ModelDriven接口,也会将model存储到valueStack中
valueStack获取数据:【*****】
从context中获取数据:
request:<s:property value="#request.username"/>
session:<s:property value="#session.username"/>
application:<s:property value="#application.username"/>
attr:<s:property value="#attr.username"/>
parameters:<s:property value="#parameters.cid[0]"/>
从root中获取数据不需使用
获取手动存储的数据:
valueStack.set(key,value);
--> <s:property value=key/>
valueStack.push(value);
--> <s:property value="[n].top"/> --> 根据栈结构查找存储的位置
获取Action中的属性:
根据getXXX()方法获取:
--> <s:property value="xxx"/>
获取model中的数据:
获取model的数据:
--> <s:property value="xxx"/> -->${xxx}
获取action重新赋值的数据,通过getModel()方法获取:
--> <s:property value="model.xxx"/> -->${model.xxx}
为什么EL表达式也可以从valueStack中获取数据:
因为starts2框架对request进行了增强,重写了getAttribute方法,
如果在request域中查找不到数据,就会从valueStack中获取.
Ognl表达式中的特殊字符:
#:从非root中获取数据【*****】
%:强制是否解析ognl表达式
$:从配置文件中获取valueStack中的数据
案例驱动:
1、登录失败信息处理:
方式一、将错误信息存储到valueStack中:
valueStack stack = ActionContext.getContext.getValueStack();
stack.set("msg","XXX");
-->显示错误信息:<s:property value="msg"/>
方式二、让action继承ActionSupport
this.addActionError("XXX"); -->逻辑业务操作
this.addFieldError(fieldName,errorName); -->校验
this.addActionMessage(aMessage); -->简单信息
-->显示:
<s:actionerror/>
<s:fielderror/>
<s:actionmessage/>
2.商品展示:
创建一个List集合,将商品信息保存到集合中,将集合保存到valueStack中;
或将List<Product>声明成Action的属性,并提供get/set方法,将商品信息存储到集合中,不需将集合存储到valueStack中
页面展示:
<s:iterator value="list" var="p">
<tr>
<td>
<s:property value="#p.name"/>
</td>
</tr>
<s:iterator/>
或:
<s:iterator value="list">
<tr>
<td>
<s:property value="name"/>
</td>
</tr>
<s:iterator/>
四、拦截器:
Struts的核心技术就是拦截器:interceptor
-->基于spring aop思想-->动态代理
自定义拦截器:
<interceptors>
<interceptor name="" class="">
<param name="includeMethods">xxx</param> -->指定该方法拦截
<param name="excludeMethods">xxx</param> -->指定该方法不拦截
</interceptor>
<interceptor-stack name="XXX"> -->将多个拦截器封装成拦截器栈stack
<interceptor-ref name=""/>
<interceptor-ref name="defaultStack"/> -->加上struts2默认的拦截器才有struts2框架的功能
</interceptor-stack>
</interceptors>
自定义拦截器的使用:
在action标签中配置:
<interceptor-ref name="XXX">
自定义拦截器类的编写:
实现Interceptor接口,在interceptor(ActionInvocation invocation)方法编写业务逻辑
-->实现了业务放行-->invocation.invoke();
继承MethodFilterInterceptor类
OGNL的使用总结:
1、访问属性:
<s:property value="user.username"/>
2、访问方法:
<s:property value="user.get()"/> -->值栈中对象的普通方法
3、访问静态属性和方法:
<s:property value="@struts.action.LoginAction@get()"/> -->action中的静态方法
<s:property value="@java.lang.Math@floor(13.13)"/> -->jdk中的静态方法
<s:property value="@@floor(13.13"/> -->
<s:property value="@strits.vo.Address@TIPS"/> -->普通类的静态属性
4、访问构造方法:
<s:property value="new struts.domain.User('public','asdf').username"/>
5、访问数组:
<s:property value="testList"/> -->List
<s:property value="testList[0]"/> -->List的某一个元素
<s:property value="testSet[0]"/> -->Set无序,错误
<s:property value="testMap"/> -->Map
<s:property value="testMap.keys"/> -->所有键
<s:property value="testMap.values"/>-->所有值
<s:property value="testMap['m1']"/> -->某一元素
<s:property value="testSet.size"/> -->大小
6、访问集合:
ValueStack>Model>action
1、通过ServletActionContext的静态方法获取:【*****】
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
...
2、注入的方式:
主要由servletConfig拦截器完成;
HttpServletRequest可以通过实现ServletRequestAware接口获取
HttpServletResponse可以通过实现ServletResponseAware接口获取
二、OGNL表达式:【*****】
ognl本身是一个项目,可以单独使用,单一般都与ValueStack一起使用
ognl的作用:
支持对象操作,调用对象方法:
eg:Object value = Ognl.getValue("'hello'.length()",context,root);
支持静态成员访问
eg:Object value = Ognl.getValue("@java.lang.Math@PI",context,root);
访问ognl上下文,访问ActionContext
eg:context.put("username","tom");
Object value = Ognl.getValue("#username",context,root);
eg:Map<String,String> map = new HashMap<String,String>();
map.put("username","tom");
context.setRoot(map)
Object value = Ognl.getValue("username",context,root):
---->从根中获取数据不需加#,从context中获取数据需要加#【*****】
操作集合对象;支持赋值操作和表达串联
eg:Object value = Ognl.getValue("{1,2,3,}",context,root);
-->java.util.ArrayList
context.setRoot(value);
Object value = Ognl.getValue("[0]",context,root);
-->1
eg:Object value = Ognl.getValue("#{'username':'tom','age':12},context,root);
-->java.util.LinkedHashMap
context.setRoot(value);
Object value = Ognl.getValue("username",context,root);
-->tom
Object value = Ognl.getValue("username='fox'",context,root);
-->fox
Object value = Ognl.getValue("username='fox',age=13",context,root);
-->13
ognl的三要素:
表达式:
OgnlContext上下文:
OgnlContext context = new OgnlContext(); -->java.util.Map
Root根:
Object root = context.getRoot();
ognl的使用:
Object value = Ognl.getValue(表达式,context,root);
在strts2框架中使用ognl表达式:
导入标签库:<%@ taglib uri="/struts-tags" prefix="s"%>
<s:property value="表达式"/>
三、ValueStack【******】
简介:当客户端向服务器发送一个请求,服务器就好创建一个Action来处理请求,
Struts2中的action是多例的,每次请求都会有一个新的action,所有不存在线程安全的问题,
一个ValueStack对应一个action,ValueStack贯穿action的生命周期
request-->action-->valueStack valueStack保存在request域中
ValueStack的主要组成:
CompoundRoot root: -->ArrayList
存储action相关的数据
transient Map<String, Object> context: -->Map
存储web开发的信息:
parameters:请求参数
request:
session:
application:
attr:该Map按如下顺序来检索某个属性: request, session, application
-->从root中获取数据不需使用#,从context中获取数据需要加#
如何获取valueStack:
通过request对象获取:
ValueStack stack = (ValueStack) ServletActionContext.getRequest.getAttribute(ServletActionContext.SERUTS_VALUESTACK_KEY);
通过ActionContext获取:【*****】
ActionContext context = ActionContext.getContext();
valueStack stack = context.getValueStack();
ActionContext绑定到localthread上,所有:
request-->action-->ActionContext-->valueStack(一个线程)
-->ActionContext中有ValueStack的context的引用,context中有root的引用
valueStack存储数据:
-->主要是向root中存储数据
手动存储:
valueStack.push(""); -->List
valueStack.set("",""); -->Map
自动存储:
每次请求会自动将action存储到valueStack中
如果action实现了ModelDriven接口,也会将model存储到valueStack中
valueStack获取数据:【*****】
从context中获取数据:
request:<s:property value="#request.username"/>
session:<s:property value="#session.username"/>
application:<s:property value="#application.username"/>
attr:<s:property value="#attr.username"/>
parameters:<s:property value="#parameters.cid[0]"/>
从root中获取数据不需使用
获取手动存储的数据:
valueStack.set(key,value);
--> <s:property value=key/>
valueStack.push(value);
--> <s:property value="[n].top"/> --> 根据栈结构查找存储的位置
获取Action中的属性:
根据getXXX()方法获取:
--> <s:property value="xxx"/>
获取model中的数据:
获取model的数据:
--> <s:property value="xxx"/> -->${xxx}
获取action重新赋值的数据,通过getModel()方法获取:
--> <s:property value="model.xxx"/> -->${model.xxx}
为什么EL表达式也可以从valueStack中获取数据:
因为starts2框架对request进行了增强,重写了getAttribute方法,
如果在request域中查找不到数据,就会从valueStack中获取.
Ognl表达式中的特殊字符:
#:从非root中获取数据【*****】
%:强制是否解析ognl表达式
$:从配置文件中获取valueStack中的数据
案例驱动:
1、登录失败信息处理:
方式一、将错误信息存储到valueStack中:
valueStack stack = ActionContext.getContext.getValueStack();
stack.set("msg","XXX");
-->显示错误信息:<s:property value="msg"/>
方式二、让action继承ActionSupport
this.addActionError("XXX"); -->逻辑业务操作
this.addFieldError(fieldName,errorName); -->校验
this.addActionMessage(aMessage); -->简单信息
-->显示:
<s:actionerror/>
<s:fielderror/>
<s:actionmessage/>
2.商品展示:
创建一个List集合,将商品信息保存到集合中,将集合保存到valueStack中;
或将List<Product>声明成Action的属性,并提供get/set方法,将商品信息存储到集合中,不需将集合存储到valueStack中
页面展示:
<s:iterator value="list" var="p">
<tr>
<td>
<s:property value="#p.name"/>
</td>
</tr>
<s:iterator/>
或:
<s:iterator value="list">
<tr>
<td>
<s:property value="name"/>
</td>
</tr>
<s:iterator/>
四、拦截器:
Struts的核心技术就是拦截器:interceptor
-->基于spring aop思想-->动态代理
自定义拦截器:
<interceptors>
<interceptor name="" class="">
<param name="includeMethods">xxx</param> -->指定该方法拦截
<param name="excludeMethods">xxx</param> -->指定该方法不拦截
</interceptor>
<interceptor-stack name="XXX"> -->将多个拦截器封装成拦截器栈stack
<interceptor-ref name=""/>
<interceptor-ref name="defaultStack"/> -->加上struts2默认的拦截器才有struts2框架的功能
</interceptor-stack>
</interceptors>
自定义拦截器的使用:
在action标签中配置:
<interceptor-ref name="XXX">
自定义拦截器类的编写:
实现Interceptor接口,在interceptor(ActionInvocation invocation)方法编写业务逻辑
-->实现了业务放行-->invocation.invoke();
继承MethodFilterInterceptor类
OGNL的使用总结:
1、访问属性:
<s:property value="user.username"/>
2、访问方法:
<s:property value="user.get()"/> -->值栈中对象的普通方法
3、访问静态属性和方法:
<s:property value="@struts.action.LoginAction@get()"/> -->action中的静态方法
<s:property value="@java.lang.Math@floor(13.13)"/> -->jdk中的静态方法
<s:property value="@@floor(13.13"/> -->
<s:property value="@strits.vo.Address@TIPS"/> -->普通类的静态属性
4、访问构造方法:
<s:property value="new struts.domain.User('public','asdf').username"/>
5、访问数组:
<s:property value="testList"/> -->List
<s:property value="testList[0]"/> -->List的某一个元素
<s:property value="testSet[0]"/> -->Set无序,错误
<s:property value="testMap"/> -->Map
<s:property value="testMap.keys"/> -->所有键
<s:property value="testMap.values"/>-->所有值
<s:property value="testMap['m1']"/> -->某一元素
<s:property value="testSet.size"/> -->大小
6、访问集合:
ValueStack>Model>action