上一篇文章我们介绍了过滤器于拦截器的区别,这边我们详细总结下Struts2的ognl表达式
1、介绍ognl之前首先要说说Struts2是什么?
struts2是的核心是思想aop思想,纵向提取,横向重复。核心产物是拦截器,其默认jdk的api中提供了几十种默认的选择,是可插拔式的。
struts2是一个基于mvc的框架,其重点坐落于control上,让我们在开发view和control层更方便,节省开发时间。
2、配置一个struts2的框架的两点
A:前面我们讲过,struts2的拦截器是基于过滤器的,所以需要在web.xml配置一个 Struts2核心Filter的实现类
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
B:struts.xml文件是struts2框架中的核心文件,其中主要完成负责action的映射【通过类可以反射出其类中的一切数据】,与action返回过来的result结果。
<struts>
<package name="dept" extends="comm">
<action name="dept_*" method="{1}" class="com.sh.action.DeptAction">
<interceptor-ref name="islogin"></interceptor-ref>
<result name="all">/dept/all.jsp</result>
<result name="upp">/dept/upp.jsp</result>
</action>
</package>
</struts>
3、struts2中需要注意的地方
view与control相呼应:view层返回或者需要接收什么值,都必须在action中先私有声明,然后再封装。比如jsp页面中需要得到DeptEntity的数据 ,那么我们就必须在Acation中先申明,然后再get、set封装
private Dept dept;
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
4、ognl表达式
谈到表达式就得说密码框、文本框、下拉框、单选按钮、复选按钮、上传控件、文本域
使用ognl需要在jsp中声明
<!-- 标签前缀 虚拟路径 -->
<%@ taglib prefix="s" uri="/struts-tags"%>
1:密码框
<s:password name="user.upwd" theme="simple"></s:password>
2:文本框
<s:textfield name="user.uname" theme="simple"></s:textfield>
3:下拉框
<s:select list="Dlist" name="emp.dept.pid" listKey="pid" listValue="pname" theme="simple"></s:select>
这里备注下:list通过action传递过来的集合,这里使用到了emp实体类嵌套的dept类属性,其中通过emp.dept.pid来传、取值
对比下没用hibernate框架的时候,获取dept表中的主键部门编号,然后赋值给emp中的外键
用了框架之后hibernate会通过映射与封装对应到emp中的pid中
其中listKey对应下拉框的键,listValue对应下拉框的值
4:单选按钮
<s:radio list="#{1:'男',0:'女' }" name="emp.esex" theme="simple"></s:radio>
这里构造了一个list集合,这里前面加了一个#解释下:
OGNL表达式,访问root中数据时 不需要 #, 访问 request、 session、application、 attr、 parameters 对象数据 必须写 #
值栈:简单的说,就是存放action的堆栈,当我们提交一个请求到服务器端 action时,就有个堆栈,如果action在服务器端进行跳转,所有action共用一个堆栈,当需要保存在action中的数据时,首先从栈顶开始 搜索,若找到相同的属性名(与要获得的数据的属性名相同)时,即将值取出,但这种情况可能出现找到的值不是我们想要的值,那么解决此问题需要用TOP语法 和N语法来进行解决。
5:复选框
<s:checkboxlist list="{'听歌','跳舞','上午','打游戏','郊游'}" name="emp.ahob" value="emp.ahob" theme="simple"></s:checkboxlist>
ognl表达式规范 :如果是单选构造的集合就要加# ,多选就不需要加 。
6:文本域
<s:textarea name="dept.premark" theme="simple"></s:textarea>
最后剩下一个穿上控件,下次着重说明,也练下手。
【ps:全部是自己的理解,如有错误请多多指教】