当前位置:文档之家› struts2_day03笔记

struts2_day03笔记

Struts2 框架第三天今天重点内容安排:第一天:struts2 开发流程、访问Action,Action方法调用,结果集类型第二天:获取请求参数,请求数据校验机制,拦截器1、V alueStack 值栈的存储原理和相关操作2、Ognl 表达式语言语法3、struts2 页面控制标签4、struts2 form表单相关标签重点难点:值栈和Ognl1.值栈和Ognl表达式1.1.什么是OgnlOgnl 对象导航图语言Object Graphic Navigation Language,类似EL,比EL ${}语法要强大很多,Struts2框架使用OGNL作为默认的表达式语言必须要引入struts标签库EL Expression Language 表达式语言,用来获取JSP页面四个域范围数据pageContext、request、session、application )Ognl 主要用法:1、访问OGNL上下文值栈对象获取数据(最重要)2、操作集合对象(结合struts2 标签库使用)---- 生成checkbox 、生成select 1.2.什么是值栈ValueStack接口!值栈ValueStack 实际上是一个接口,struts2 Ognl使用都是基于值栈完成的Struts2 内部提供OgnlValueStack的接口实现类,实现了值栈接口!前端控制器每一次请求都会创建一个值栈对象源码:一次请求对应一个值栈对象值栈生命周期= request 生命周期的!!值栈是struts2 一个数据结构,贯穿整个Action实例生命周期(request生命周期),一次请求对应一个Action实例,一个Action实例对应一个值栈实例值栈保存了Action 和其它常用web对象的引用,通过值栈,间接操作这些对象!1.3.值栈的存储结构1:采用标签<s:debug>查看值栈结构图:map Context 结构图2:采用degbug模式查看值栈重要的两个部分结构如图所示:得出结论:值栈包含两个部分:root map⏹CompoundRoot对象,保存Action相关对象--- List结构⏹ContextMap 上下文Map,保存常用web对象引用---- Map结构值栈对象获取两种方式:可以由源码追踪得到:如图:1、request.getAttribute(“struts.valueStack”);2、ActionContext.getContext().getValueStack() ;值栈包括CompoundRoot (对象栈,继承ArrayList)、OgnlContext (ognl上下文,实现Map接口)OgnlContext 上下文,引入CompoundRoot,提供HashMap (values),引用常用web对象1.4.详细分析值栈内部对象的创建和生命周期值栈生命周期,就是request生命周期,一次请求,对应一个值栈实例每次新的请求对应一个新的值栈对象实例! 源码:值栈创建过程源码分析:如果请求资源是jsp静态页面而非action 值栈对象也创建:但是拦截器不起作用!如果访问的是action组件需要注意拦截器会起作用生效!!1、在StrutsPrepareAndExecuteFilter的prepare.createActionContext(request, response);创建ValueStack ,将常用web对象,保存OgnlContext的Map 中2、访问Action ,通过ActionProxy ,调用ActionInvocationDefaultActionInvocation 的init 方法stack.push(action); 将当前Action对象,压入root栈顶部V alueStack 的root 栈存在2个对象,DefaultTextProvider、ValueStackAction(Action栈顶)3、执行ModelDriven 拦截器,判断Action是否实现ModelDriven接口,如果实现了,stack.push(model); 将model压入root栈顶部,root栈三个对象1.5.ognl表达式会执行ValueStack 的findValue 搜索值栈中数据搜索顺序,先搜索Root栈每个对象的属性,如果都没有搜索Map的key直接搜索Map的key ,不会搜索root栈⏹如果访问root (CompoundRoot 对象栈内容),不需要#⏹如果访问Map 内容(request、response、session、servletContext、attr、parameters),⏹需要# 进行访问例如# 相当于request.getAttribute(“name” )1.6.案例演示:值栈存储数据和ognl获取数据1.6.1.值栈中保存基本数据类型(int double String) action 存储数据m1.jsp 获取数据2: 采用set 方法压入栈顶action 代码m2.jsp 页面获取之3: 数据存放在context map 值栈下方数据action 代码:m3.jsp1.6.2.值栈中保存对象数据类型action 存储对象因action 存放值栈对象中所以提供成员对象通过值栈存储页面获取相关数据对象存储除了栈顶之外栈顶对象: 通过属性名获取值!!非栈顶对象valuestack.find(搜索表达式); action 代码m4.jsp页面获取数据1.6.3.值栈中保存集合数据类型(list /map)迭代list集合action代码压入值栈list_map.jsp 页面迭代map存入值栈迭代数组action代码压入值栈页面迭代数据1.6.4.值栈中保存web相关的数据类型用户数据保存request session.....jsp 页面获取这些对象中保存数据通过下方context 对象#key #parameters : 获取请求参数信息request.getParameterMap()=#parameters <,String[]>demo1:#attr 搜索pageContext request valuestack session application 类型EL 按照顺序查找存储数据添加值栈!! attr 搜索的顺序如果上述对象搜索完毕都没有需要数据返回Null 如果找到不找了!!demo2#request request 存储数据demo3#session session 存储demo4action 代码:m6.jsp页面获取相关数据1.6.5.ognl之#号的使用用法一:访问OgnlContext的Map中常用web对象,添加#进行访问#attr 按照page --- request --- session --- application进行搜索Action 代码Jsp代码用法二:不加# 调用ValueStack搜索,先搜索root属性,后搜索Map Action 代码JSP代码用法3:构造Map#{…foo1‟:…bar1‟, …foo2‟:…bar2‟}相当于Map集合对象构造List集合{"睡觉","跑步","洗衣服"}例如:1.7.EL表示式也可以获取值栈数据EL 表达式原理,在pageContext、request、session、application 四个范围,调用request.getAttribute() 获取数据EL可以获取值栈数据引入struts2前端控制器改写request.getAttribute() request 对象做了一个包装重写request.getAttribute() 原来request.getAttribute() 直接从request.setAttribute(存储) 获取数据现在: struts2 getAttribute() 重写: 先去request.getAttribute(key) 找到返回!! 如果找不到返回值null 根据null 继续搜索值栈调用值栈对象findValue(expression) 如果找不到Null 找到返回request 产生变异getAttribute() EL搜索顺序pageContext、request、valueStack session、application阅读StrutsPrepareAndExecuteFilter 源码对requestStruts2 框架提供StrutsRequestWrapper 包装类,对request 的getAttribute 方法增强优先使用request.getAttribute 取值,如果取不到,执行valueStack的findValue方法当堂问题:request.setAttribute(“name“, ”aaa“ ) ;valueStack.set(“name“,”bbb“ )页面<s:property name=”name” /> ----- bbb${name} ------ aaa2.Ognl 表达式语法Struts2 存取数据,通过值栈完成的,Ognl 是访问值栈数据表示式语言语法:% 号用法$ 号用法2.1.%号的使用(jsp页面或者配置struts.xml)“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。

,在表达式添加‘’不会被ognl解析案例:主页面index.jsp编写actin 值栈中存储数据m7.jsp 获取解析数据%{} 将name按照ognl表达式解析%{'name'} 不会按照Ognl解析字符串.2.2.$号的使用$ 在struts2 配置文件【国际化、struts.xml、校验配置文件】中,使ognl表达式被解析${} 语法大括号里面字符当做ognl 表达式自动搜索值栈!!案例一:URL重定向,携带参数案例struts.xml 携带重定向数据${username} 搜索值栈获取数据重定向操作数据携带给后续组件....JSP 获取数据${ername1} = request.getParameter("username1"); 和值栈无关$(username) 搜索pageContext request valuestack session application 搜索key = username案例二:国际化资源文件会${}自动读取相关的信息${} 国际化资源文件xx.properties 自动搜索值栈找寻数据!! 在src新建messages.properties在struts.xml 配置国际化文件必须先执行Action创建值栈,请求转发到JSPm9.jsp页面小结: # % $# : 1: 获取Map 数据#request #attr 2: 构造map 结构参照struts 标签库案例% : %{} 迫使字符串按照ognl表达式解析搜索值栈!%{''} 添加单引号目标字符不按照ognl解析普通字符串或者''$ 国际化资源配置中可以搜索值栈获取值栈对应信息到国际化资源配置信息中显示$ 配置文件中例如:struts.xml 中获取值栈的数据重定向携带数据3.struts2标签库参考:docs/WW/docs/tag-reference.html3.1.关于struts2 UI 相关标签Form Tag 为什么要去应用struts2 form ?⏹数据回显s trus2 标签都可以获取值栈中的数据⏹对页面进行布局和排版(显示样式原理)如果需要对struts2 form标签,设置回显数据值,value属性中%{} 编写OGNL表达式!在struts2 form 标签中,class属性叫cssClass,style属性叫cssStyle3.1.1.<s:form> 表单元素标签3.1.2.textfield, password, hidden<s:textfield> 文本域,生成<input type=”text” ><s:password> 密码域,生成<input type=”password” > <s:hidden> 隐藏域,生成<input type=”hidden” >案例:密码默认showPassword值false ,不回显!3.1.3.submit、reset、label可以设置<s:form> 属性theme (样式),默认样式xhtml ,设置simple设置simple样式后,不会生成<table>标签,form没有样式,需要<s:label> 手动为元素添加标签提示信息3.1.4.textarea3.1.5.radio、checkboxlist、select<s:radio> 接收list或者map 生成一组单选按钮上述如果需要默认选中: 数字和字符的差异需要注意字符需要注意'm'<s:select> 接收list或者map ,生成一组下拉列表checkbox value 表示选中true false fieldVlaue 表示值<s:checkboxlist> 接收list或者map ,生成一组复选框value {'','',''}表示选中的值3.1.6.form主题样式传统表单和struts2表单的对比举例:1: 请求2: action 数据压入栈顶3: form.jsp 回显实现数据回显3.1.7.如何修改主题实际开发使用struts2标签库但是不想使用默认样式排版改写!排版default.properties 框架很多默认配置信息默认样式布局xhtml。

相关主题