struts2学习--解读struts.xml配置文件和值栈的学习

来源:互联网 发布:catia软件书籍 编辑:程序博客网 时间:2024/06/04 17:48
-- Struts2一.解读核心配置文件struts.xml1.常量设置a.设置访问路径后缀名<constant name="struts.action.extension" value="do,,"/>b.开启动态调用方法<constant name="struts.enable.DynamicMethodInvocation" value="true"/>c.静态方法的访问<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>2.标签<package><package name="demo" namespace="/test" extends="struts-default">a.name:包的名字,起名任意,但是必须唯一b.namespace:命名空间,以"/"开头,而且不能为空c.extends:一般继承包struts-default3.标签<action><action name="login" class="com.bjpn.actions.LoginAction" method="doSome">a.name:请求路径的格式(package-namespace + action-name)b.method:指定action方法.默认是execute,如果不是需指定方法名,这里的方法名不带()       可能报的异常 java.lang.NoSuchMethodException        最重要的一点是:有几个method就有几个action标签 c.class:类的全限定类名4.<result>标签a.name:指定action执行完毕所转向的资源视图,默认是"success"b.type:视图转向类型,共有11种,常用如下:--dispatcher:默认的,请求转发--redirect:重定向<param value="location">/XXX.jsp</param><param value="uname">${username}</param><param value="charset">utf-8</param>   注意:username对应的是action中的属性名 uname是地址栏上的参数--redirectAction:重定向到action<result type="redirectAction">second</result>注意:second是另一个action的name属性,而且不能带扩展名--chain:链5.<global-results>标签6.获取ServletAPIActionContextServletActionContext--获取真正的API二.OGNL与值栈1.OGNL概念:OGNL有一个上下文的概念即Context,本质是一个Map,存放了很多Javabean对象.Struts2中用ActionContext作为上下文分为根对象(不使用标记直接访问)和非根对象(使用#访问)2.值栈的创建用户提交请求,会马上创建一个Action对象和一个值栈对象OgnlValueStack(是接口ValueStack的实现类)3.值栈的组成root:(根对象) CompoundRoot类型,是增强版的ArrayListcontext:(非根对象) Map<String,Object>类型4.获取值栈对象ValueStack valueStack = ActionContext.getContext().getValueStack();5.向root中显式放入数据a.对值栈的操作,本质上就是对根对象root的操作valueStack.push(obj);b.通过操作rootvalueStack.getRoot().push(obj);c.添加map,可以添加有名对象map.put("objName",obj);valueStack.push(map);访问--<s:property value="objName.属性"/>d.直接添加有名对象valueStack.set("objName",obj);e.root本质是数组valueStack.getRoot().add(obj);6.向root中隐式放入对象即操作action中的属性7.向context中显式放入数据(#)  a.直接放入数据  ActionContext.getContext().put("objName",obj);  访问--<s:property value="#objName.属性名"/>  等同于--<s:property value="#request.objName.属性名"/>   ${objName.属性名}/${requestScope.objName.属性名}  b.向session中放入数据  ActionContext.getContext().getSession().put("objName",obj);  访问--<s:property value="#session.objName.属性名"/>        ${objName.属性名}/${sessionScope.objName.属性名}  c.向application中放入数据  ActionContext.getContext().getApplication().put("objName",obj);   访问--<s:property value="#application.objName.属性名"/>             ${objName.属性名}/${applicationScope.objName.属性名}  d.访问不存在的数据  <s:property value="#attr.objName.属性名"/>8.向context中隐式放入数据a.在提交Action请求时携带的参数,会自动放入context中的parameters属性中  如果Action中有该参数的属性,属性也放入root中<s:property value="#parameters.参数名"/> b.Action对象  <s:property value="#action.属性名"/>  9.root中数据的加载顺序从root中读取数据,即直接访问,先去值栈中找,找不到再去context中找而带#访问,直接去context中找10.request中数据的加载顺序先去request中找--再到root中找--最后去context中找