Struts通配符与值传递

通配符:

  在编写视图对应关系的时候有多种方法:

  • 一个action对象使用默认的execute方法在配置文件中一个配置:
<action name="user_add" class="me.rain.action.UserAction>
<result>user/add.jsp</result> </action>
  • 在一个action中有多种方法,这样可以减少action对象的数量,但是不会减少配置的数量:
<action name="user_add" class="me.rain.action.UserAction method="add">
 <result>user/add.jsp</result>
</action>
<action name="user_list" class="me.rain.action.UserAction method="list">
 <result>user/list.jsp</result>
 </action>
  • 采用通配符的方法:
<action name="*_*" class="me.rain.action.{1}Action method="{2}">
 <result>{1}/{2}.jsp</result>
</action> 

  这样的方式极大的简化了action对象的熟练以及配置的数量,eg:在URL地址栏输入:User_add 的时候,第一个星匹配到了User,第二个星匹配到了:add。那么{1}则表示:User,{2}表示add

  所以有一句话:约定优于配置。   在编写代码的时候就应该约定到变量的命名规范。

数据的传递:

  Srtuts的值传递的核心是Ognl表达式。 Ognl:Object-Graph Navigation Language 对象图导航语言。

  我目前的理解是这样的:有一个Context容器,里面包含了许多的对象,就像值栈一样。 每一个结点都可以当做是一个root,(可能相当于指针一样,如果不指定root是哪个节点,那么默认是栈顶的节点),在获取数据的时候可以这样:Ognl.getValue("tree",root);  如果这个阶段是一个User,user有name属性和password属性,那么tree:则是user下的一层一层属性。 而root则是user。 所以获取值:Ognl.getValue("name",user);

  如果这个Context中有多个对象,那么又该如何获取? 这时创建一个Map对象,来存放这些对象:

Map<User> ctx = new HashMap<User>();
ctx.add(new User("a","aaa");
ctx.add(new User("b","bbb");
ctx.add(new User("c","ccc");
//Ognl.getValue(tree,Map,root);  map指ctx
Ognl.getValue("#root(1)",ctx,a);
Ognl.getValue("#a",ctx,a);

这里#root(1) 可以理解成,在整个Context中就是一个大的root,加上#表示从这个ctx(Map)对象中去找,而不加#号则表示从当前的root指向的对象中去找。

 Ognl除了可以获取属性之外还可以获取执行方法:

Ongl.getValue("user.showName(‘张三‘)",user);

注意:要传递字符串的时候需要加上引号。

Struts的ValueStrack

  在整个Struts中,存放数据不外乎这两个容器:StackContext,和CompoundRoot。

  StackContext:存放的是一些request、session、response、application等  和一些我们使用ActionContext.getConntext.put("key","value");的值。

  CompoundRoot则是一个栈,Ognl的root指向栈顶,当一个对象加载的时候就会压入栈,使用之后便会弹出栈。

  在jsp中获取值时可以使用<s:property value="#key"/>, 要获取StackContext中的值,必须加上 #    eg;#username.

  而在CompoundRoot中的元素则不需要加上#,但是要保证root的指向是否正确。

 

Struts中迭代标签: <s:iterator value="#users" >var="u" status="st"

  当我们在服务器端将users使用ActionContext.getContext.put("users",users);  这里的iterator 中的value就需要加上#,然后每一次的循环都会将一个user对象压入CompoundRoot中,所以

  在迭代里面是这样获取的 <s:property value="id"/>。  每一次的循环完成之后都会弹出这个tempUser。

若:<s:iterator value="#users" var="u" >

  加上一个var, 则表示在StackContext再保存一遍user对象,和上面说的一样,每一次循环都是一次进栈、出栈操作。

时间: 2024-10-31 21:29:48

Struts通配符与值传递的相关文章

Struts与页面值传递

1.目录结构 2.struts.xml 3.login.jsp 注意点: 1)method方法控制值传递的方式,默认为get 4.Welcome.java 注意点: 1)用bean的形式获取jsp中form的值,注意属性名称和form的name相同 2)Welcome作为跳转的控制器 5.welcome.jsp 注意点: 1)用EL表达式直接获取控制它的bean的属性值

JAVA中只有值传递

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:"引用传递!",并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟

通过$broadcast或$emit在子级和父级controller之间进行值传递

1 通过$broadcast或$emit在controller之间进行值传递,不过这些controller必须是子级或者父级关系, 2 $emit只能向父级parent controller传递事件event与数据data,$broadcast只能向子级child controller传递event与data,$on用于接收event与data. 3 <script> 4 var myapp=angular.module('myapp',[]); 5 myapp.controller('Sel

值传递 引用传递

方法参数传递有2种方式: 值传递和引用传递. 值传递: 默认都是值传递.值传递有2种,值类型和引用类型的.实质是复制栈中的值. 值类型的值传递:栈中的值就是实际值. 引用类型的值传递:栈中的值是内存堆中地址. 引用传递: 参数前加ref的为引用传递,引用传递有2种,值类型和引用类型的.实质就是传递自己本身,只是多了个别名.

java值和地址值传递、字符串常量池的理解

#java值和地址值传递的理解: - 基本数据类型和基本数据类型的封装类都是:值传递 * 形式参数的改变不会影响实际参数的改变(相当于将值复制一份传递给形参,自身没做任何改变) - 引用数据类型都是 地址值传递 * 形式参数的改变会影响实际参数的改变(将地址值赋值给形参,形参就可以指向实参所指向的地址, 即形参也可以操作实参指向地址的数据了) #注意:String是个特例(当作基本类型处理) - 分析:从String类的源码可以知道,String相当于是char[]的封装类,即具有char类型的

java 引用传递和值传递

1.为什么要分值传递和引用传递: 基本类型存在在栈中,复合类型(对象)存在堆中.操作栈的速度要快于堆,且对象的复制相比基本类型不仅浪费内存而且速度比较慢. 从这里就可以看出来:对象是按照引用传递(数据库事务封装Connection对象传递的时候最能体现这点):基本类型是按照值传递. 2.那为什么String类型传递后会表现的值传递的特性:这并不是由于值传递而导致的,而是由于String类的不可变性(只读特性)导致的.String类型按照引用传递,但是一旦改变了,就变成新的对象了,原来引用指向的对

JAVA中的值传递和引用传递问题

这是个老生常谈的问题了,引起过无数争论,但可以说一直没有一个令人满意的回答. 有人总结过: 对象是按引用传递的 Java 应用程序有且仅有的一种参数传递机制,即按值传递 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本 按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本 简单总结: 对象就是传引用(引用地址的拷贝,实质也是传值) 原始类型就是传值 String等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个

java值传递or引用传递解惑

java中的參数传递本质上仅仅有值传递,无论你传的是什么,传过去的都仅仅是一个副本而已,这个副本作为方法的局部变量保存在栈中. 1.假设參数类型为基本数据类型,改动这个值并不会影响作为參数传进来的那个变量,由于你改动的是方法的局部变量,是一个副本. 2.假设传的是一个对象的引用,也是一样的,也是一个副本,可是这个副本和作为參数传进来的那个引用指向的是内存中的同一个对象,所以你通过这个副本也能够操作那个对象.可是假设你改动这个引用本身,比方让他指向内存中的另外一个对象,原来作为參数传进来的那个引用

const 值传递和引用传递

const关键字,我们用const修饰的变量表明该变量的值以后不可以修改,即相当于常亮,并且在定义的时候应当初始化. 如:const int n = 0; 这和 int const n = 0;是等价的 extern修饰:extern的原理很简单,就是告诉编译器:"你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!" 所以和一般的extern用法没有区别: file1 extern const int n = 1; //定义并初始化