Struts2_02

一、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 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值