setAttribute(“name”,value)的问题
setAttribute(“name”,value)为什么同一作用域下,setAttribute之后再改变value的值。getAttribute都会拿到改变后的valu...
setAttribute(“name”,value)
为什么同一作用域下,setAttribute之后再改变value的值。getAttribute都会拿到改变后的value?
我想setAttribute这个动作应该是最后才真正发生。
谈谈关于setAttribute的源码机制,谢谢。
当personOne是一个bean时
personOne.setName("zhang");
request.setAttribute("personOne", personOne);
personOne.setName("wang");
((Person)request.getArrtibute("personOne")).getName() 得到的值是wang
当personOne是一个String时
String personOne ="zhang";
request.setAttribute("personOne", personOne);
personOne = "wang";
request.getArrtibute("personOne");得到的值是张。
为什么。。 展开
为什么同一作用域下,setAttribute之后再改变value的值。getAttribute都会拿到改变后的value?
我想setAttribute这个动作应该是最后才真正发生。
谈谈关于setAttribute的源码机制,谢谢。
当personOne是一个bean时
personOne.setName("zhang");
request.setAttribute("personOne", personOne);
personOne.setName("wang");
((Person)request.getArrtibute("personOne")).getName() 得到的值是wang
当personOne是一个String时
String personOne ="zhang";
request.setAttribute("personOne", personOne);
personOne = "wang";
request.getArrtibute("personOne");得到的值是张。
为什么。。 展开
7个回答
展开全部
无论是set还是get没有哪个先哪个后之分,要看你程序是怎么个流程。例如在你初始化对象时候拿就是你先调用的set进行的赋值,而当你使用对象的时候其实调用的是get,之后你又想改变这个对象那么就又调用了set。同理,在使用类似STRUTS时一个请求到来时,JSP页面的数据是要封装成相应的表单对象的,也就是初始化表单对象给struts,所以这个时候肯定调用的是get来获取表单的数据的。当你处理完get过来的数据后,要重新封装成相应的对象,这个时候你就得调用set了。所以这个得具体情况具体来说,不是固定的,不知道能不能懂
更多追问追答
追问
感觉答非所问啊。。。。童鞋。。。是不是我问题问的不够细致?
我的疑惑在问题补充里。
追答
~_~让我猜谜呢!
如果你前台用setAttribute(“”,“”)字符串的方式改变值,那你后台就不要用bean的方式来获取,用getParameter,如果你前台用bean的方式封装数据请用setAttribute(“”,bean),后台用bean的方式就能获取到;还有弱弱的提示你下你了解javabean吗,如果你前台确实用的是setAttribute(“”,bean),但是你的bean没有set ,get方法,那我只能祈祷佛祖了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看了一下你的问题,这个与
request.getArrtibute 这个方法的关系不大,而是对象引用的问题。
例一
1. String personOne ="zhang";
request.setAttribute("personOne", personOne);
2. personOne = "wang";
1 与 2 两处 创建 了两个字符串对象 相当于两块内存。
这个时候 1处 与 2 处的对象不是同一个了。 也就 request.getArrtibute("personOne"); 找向 第一块内存。
例2
1。personOne.setName("zhang");
request.setAttribute("personOne", personOne);
2 。personOne.setName("wang");
((Person)request.getArrtibute("personOne")).getName()
1和2 处 personOne 是同一个对象。 虽然你setName 改变了这个对象中 name属性的
你这样相当于把新的一个name的内存放到了personOne 中。
((Person)request.getArrtibute("personOne")) 这个内存没有改变
例3
1。personOne.setName("zhang");
request.setAttribute("personOne", personOne);
personOne = new PersonOne();
2 。personOne.setName("wang");
((Person)request.getArrtibute("personOne")).getName()
这样,例3就与例一等价了。
request.getArrtibute 这个方法的关系不大,而是对象引用的问题。
例一
1. String personOne ="zhang";
request.setAttribute("personOne", personOne);
2. personOne = "wang";
1 与 2 两处 创建 了两个字符串对象 相当于两块内存。
这个时候 1处 与 2 处的对象不是同一个了。 也就 request.getArrtibute("personOne"); 找向 第一块内存。
例2
1。personOne.setName("zhang");
request.setAttribute("personOne", personOne);
2 。personOne.setName("wang");
((Person)request.getArrtibute("personOne")).getName()
1和2 处 personOne 是同一个对象。 虽然你setName 改变了这个对象中 name属性的
你这样相当于把新的一个name的内存放到了personOne 中。
((Person)request.getArrtibute("personOne")) 这个内存没有改变
例3
1。personOne.setName("zhang");
request.setAttribute("personOne", personOne);
personOne = new PersonOne();
2 。personOne.setName("wang");
((Person)request.getArrtibute("personOne")).getName()
这样,例3就与例一等价了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
字符串是传值, 不是传引用 相当于一份copy 如果是类对象的话, 就是引用了
你只需要考虑下面这个就能明白
String a = "test";
String b = a;
a = "now"
此时b是什么呢, b还是test
String没有自己改变自己的功能, 只是完全的copy, 即传值
Person a = new Person();
Person b = a;
a.setName("test");
此时b的name也是test, 这就是传引用, b只是a的另一个名字, 他们都是同一个对象
setAttribute()方法中无非就是 this.xxx = xxx;这种赋值, 如果xxx是String, 那么肯定是传值(copy一份了), 如果xxx是对象, 那么就是传引用
还缓存....... 缓存不是这个级别上的技术, 你连值都没有缓存个毛啊
你只需要考虑下面这个就能明白
String a = "test";
String b = a;
a = "now"
此时b是什么呢, b还是test
String没有自己改变自己的功能, 只是完全的copy, 即传值
Person a = new Person();
Person b = a;
a.setName("test");
此时b的name也是test, 这就是传引用, b只是a的另一个名字, 他们都是同一个对象
setAttribute()方法中无非就是 this.xxx = xxx;这种赋值, 如果xxx是String, 那么肯定是传值(copy一份了), 如果xxx是对象, 那么就是传引用
还缓存....... 缓存不是这个级别上的技术, 你连值都没有缓存个毛啊
更多追问追答
追问
明白你的意思了。
突然想起来这事了。。
不过java中全都是值传递(拷贝传递)。primitive数据类型,是拷贝,引用类型也是拷贝,不过拷贝的是一个jvm可以通过它得到对象的字节组合(类似指针)。
你说的字符串属于特殊处理。从stack的常量池中找,如果没有就会创建对象。
所以其实传的也是引用,而不是值。
追答
... String这东西在java里你看上去感觉是一个类, 但是它却是一个特殊的类, 它没有自己改变自己的能力, 这就是它为什么每次赋值都是创建一份新的拷贝的原因了
比如这个
String s = "test";
s = s.subString(0, s.length);
你觉得前后s指向的是同一地址吗?
答案是 不同的
你可以认为s.subString 与 前一个s 是同一个地址(完全相同的字符串), 虽然s前后都是"test", 但是第二次却是s.subString的一个拷贝
对于String来说, 不会去找栈中是否有这个对象, 而是会分配空间来进行一份拷贝, 当然如果你之前的那个串地址如果没用了的话, 会被回收
相对的StringBuffer类就是传引用了,
StringBuffer s = "test";
s = s.append("test");
前后两个s指向的是同一个地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是页面跳转后setAttribute才起的作用吧,你可以把setAttribute写在最上面,赋个空值,将value设为全局变量,在页面跳转前赋个值,在页面跳转代码后面再赋个值,然后debug看看值的变化情况
追问
大神看下我的问题补充,好像只是对javabean 的 property 这么处理?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询