03

it2022-05-05  153

1.值栈: 解答Struts能够直接获取属性值: 原因:Struts并不是直接通过request隐式对象中获取,而是将整个对象封装到了ValueStack值栈中,直接匹配是否存在这个属性,找到了就取出值,执行的先后顺序是从root根目录一层一层往下找。ValueStack详解: ValueStack对象的内部有两个逻辑部分: ObjectStack: Struts把Action和相关对象压入到ObjectStack中实际上是一个OGNLContext类型,实际上也是一个Map,也是对ActionContext的一个引用ContextMap: Struts把各种映射关系(一些Map类型的对象)压入到ContextMap中,实际上就是对ActionContext的一个引用实际上是一个CompoundRoot类型,是一个使用ArrayList定义的栈,里面保存着各种和Action实例相关的对象Struts会把以下对象压入到ContextMap中: parameters:该Map中包含当前请求的请求参数request:该Map中包含当前request对象中的所有属性session:该Map中包含当前session对象中的所有属性application:该Map中包含当前application对象中的所有属性attr:该Map按照如下属性来检索每个属性值:request、session、application值栈中的属性值: 对象栈:对象栈中某个对象的属性值Map栈:request、session、application的一个属性值或一个请求参数的值Struts2自动将Action对象放入到值栈中 放入时间: Struts2终将调用Action类的Action方法,在调用该方法之前先创建一个StrutsActionProxy对象然后对其进行初始化,同时将Action放入到值栈中 2.OGNL: 概念: OGNL全拼:Object-GraphNavigationLanguage(对象导航图语言)作用:用来访问值栈中的内容OGNL: 读取对象栈中的对象里的属性 读取方式: object.propertyNameobject['propertyName']object["propertyName"]ObjectStack里的对象可以通过从零开始的下标来引用 ObjectStack里的栈顶对象通过[0]来引用下一个对象可以使用[1]来引用若要访问其中的message属性值,则可以写为: [0].message][0].['message'][0].["message"]若在指定对象中没有找到该属性值,则会自动到下一个属性中搜索,[n]表示从第n个对象开始搜索,而不是搜索n个对象,若是从栈顶开始搜索则可以省略下标默认情况下,Struts2会自动的将Action对象放到对象栈的栈顶读取Map栈里的对象的属性: 读取方式: #object.propertyName#object['propertyName']#object["propertyName"]eg:读取session里面的name属性,#session.nameproperty标签:Struts2利用s:property和OGNL表达式来读取值栈中的属性值 结合s:property属性读取对象栈里面的内容:<s:property value="[0].message" />OGNL其他作用: 调用任意一个Java类的静态字段或者方法 语法: @fullyQualifiedClassName@filedName@java.util.Calendar@DECEMBER@fullyQualifiedClassName@methodName(argumentList)@app4.Util@now()eg:注意:一般情况下,此功能被struts2默认关闭,需要使用则需要打开被封装到值栈的对象上的公共字段和方法 语法: object.fieldName:[0].datePatternobject.methodName(argumentList) :[0].repeat(3,"hello")eg:访问数组类型的属性: 用法: 有些属性将返回一个对象数组而不是单个对象,可以像读取其他对象属性一样读取它们,这种数组型属性的各个元素以逗号分隔,并且不带方括号可以使用下标访问数组指定元素:colors[0]可以调用其length字段来查看给定数组的元素个数:colors.lengtheg:访问list类型的属性 用法: 有些属性将返回的类型是java.util.List类,可以像读取其他属性一样读取,这种list的各个元素是字符串,以逗号分隔,并且带方括号可以通过下标访问可以通过其size方法或者专属size字段来查看该list的长度可以使用isEmpty方法或者专属isEmpty字段来判断其lsit是否为空还可以使用OGNL来创建一个List,创建一个list与创建一个Java数组是相同的:{"red","green"}访问Map类型的属性: 用法: 读取一个Map类型的属性会以此方式返回其所有键值对:{key1=value1,...,keyn=valuen}若需要检索出某个map的值:map[key]可以通过其size方法或者专属size字段来查看该map的键值对个数可以使用isEmpty方法或者专属isEmpty字段来判断其map是否为空可以用如下语法来创建一个map:#{key1=value1,...,keyn=valuen}eg:使用EL访问值栈中的内容: 用法:使用${productName} 也可以达到<s:property value="productName">的效果原理:Struts2将包装HttpServletRequest对象后的org.apache.struts.dispatcher.StrutsRequestWrapper对象传到页面上,并重写了其getAttribute方法 3.声明式的异常处理: 配置: exception-mapping元素:  作用:配置当前action的声明式异常属性: exception:指定需要捕获的异常类型,异常的全类名result:指定一个响应结果,该结果将在捕获到指定异常时被执行,既可以来自当前action的声明,也可以来自global-results声明可以使用global-exception-mapping元素为应用程序提供一个全局性的异常捕获映射: 缺陷:在exception-mapping中声明的异常映射,只能引用在global-results元素下生命的某个result处理机制: 声明式异常处理机制有ExceptionMappingInterceptor拦截器负责处理,当有异常信息被捕获到时,拦截器就会向ValueStack中添加两个对象: exception:表示被捕获异常的Exception对象exceptionStack:包含着被捕获异常的栈  

转载于:https://www.cnblogs.com/lxc-2017/p/8530370.html


最新回复(0)