新手关于jstl中的set 和 get的疑问?

guangguang1984 2010-11-02 11:32:36
大家好,以前都是做嵌入式c的,刚学习java j2ee不到一个月,对jstl的set很不理解,
一般使用set需要如下两个步骤:
1.
在jsp中有添加语句:
<c:set value="classB" target="classA" property="B" />
2.
在相应的bean classA中加上一个set方法:
classA{
classB B;
...
public setB(classB b){
B = b;
}

...
}
三个问题:
1.貌似各种jstl资料只提到了步骤1,到底第2步骤是不是必须的呢?
2.如果是必需的,为啥还需要这样的set方法,步骤1还不够吗,这个希望高手能给小弟详细解释一下
3.在jsp中判断某个bean的字段时,学习相应的代码时发现会提供一个get方法,这个是不是基于相同的原理?

万分感激大侠!
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
FD_lion 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 guangguang1984 的回复:]
引用 3 楼 fd_lion 的回复:
这个问题要说清楚原理涉及到的问题还蛮多的。

就你的问题而回答吧。

单纯就你的问题来说,classB 实例是在步骤1的标签中创建出来的

步骤2 并没有创建任何实例, 也就是没分配任何内存, 它只是一个说明。

就好比 造房子一样, 步骤2 是图纸, 步骤1 就是按照图纸做出来的房子

所以就单纯拿 步骤2 来看 它没创建任何的东西,……
[/Quote]

bean中方法名必须以get 和 set 开头然后加上字段的名字,

至于是怎么知道的, java里面有它自己的机制, 是用反射 技术实现的。
FD_lion 2010-11-03
  • 打赏
  • 举报
回复
不完全正确。

在“<c:set value="classB" target="classA" property="B" />
”中,

target="classA" 意味着,这个时候实例化了一个 classA实例, 然后找到这个实例中的 B 属性 然后再调用 classA实例的 set 方法 把 classB传进去。

实际上 这个标签 只实例化了一个 classA 而classB是什么实例化的 就看你在哪里 new classB() 了

guangguang1984 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fd_lion 的回复:]
这个问题要说清楚原理涉及到的问题还蛮多的。

就你的问题而回答吧。

单纯就你的问题来说,classB 实例是在步骤1的标签中创建出来的

步骤2 并没有创建任何实例, 也就是没分配任何内存, 它只是一个说明。

就好比 造房子一样, 步骤2 是图纸, 步骤1 就是按照图纸做出来的房子

所以就单纯拿 步骤2 来看 它没创建任何的东西,它只是一个说明。
[/Quote]
也就是说,若是没有步骤2的红色的set,光靠步骤1的标签是不能传递一个classB 实例给B的吧。
但是我始终不明白,标签中没有明确步骤2中set方法的具体名字,那它是如何找到这个set方法的呢?或者说这个set方法是谁 且在什么情况调用的呢?该set换个名字又如何?
guangguang1984 2010-11-03
  • 打赏
  • 举报
回复
我猜

在“<c:set value="classB" target="classA" property="B" />
”中,value="classB"意味着实例化一个classB类,也即申请了一块存放着classB类实例的内存,然后步骤2中的红色set方法只是将上述创建的内存块(classB类实例)的引用传递给
classA.B字段而已

是不是,迫切的需要求证!
谢谢大家!
FD_lion 2010-11-03
  • 打赏
  • 举报
回复
这个问题要说清楚原理涉及到的问题还蛮多的。

就你的问题而回答吧。

单纯就你的问题来说,classB 实例是在步骤1的标签中创建出来的

步骤2 并没有创建任何实例, 也就是没分配任何内存, 它只是一个说明。

就好比 造房子一样, 步骤2 是图纸, 步骤1 就是按照图纸做出来的房子

所以就单纯拿 步骤2 来看 它没创建任何的东西,它只是一个说明。
guangguang1984 2010-11-03
  • 打赏
  • 举报
回复
谢谢楼上这么晚还回答我,但我想你能否更清楚的给我解释一下2中的红色字体的set方法和1中使用的set标签的联系?

或者这么说吧,classB实例的内存是在哪在具体步骤申请的?因为我感觉步骤1的set标签和步骤2的红色set方法都只是传给字段B一个classB实例的引用,到底classB实例的内存在哪各环节申请我看不出来。。。
FD_lion 2010-11-03
  • 打赏
  • 举报
回复
C很好啊,跑来学java受罪啊。

问题1 :首先应该是现有步骤2,才有步骤1, 步骤1 只是给 步骤2 classA 中的 B 字段赋值, 只有先有东西了你才能给它赋值,对吧?


问题2,3:步骤1仅仅是一个赋值作用,并不能创建classA以及它的属性。 提供get , set 方法是体现对象的封装性,是面向对象的一种体现。和C的面向过程有点不一样,是一种思想,可以说是java的一种设计理念。虽然可以不用get,set方法,而是直接访问, 但这与java这些面向对象设计语言的思想不符合, 所以一般不采用。


从C 转java是不适应的, 时间长了就习惯了
guangguang1984 2010-11-03
  • 打赏
  • 举报
回复
貌似classB实例是在jsp的usebean中创建的(即usebean会new出来一块内存并初始化为指定的bean类), 其次字段是command,但写的get方法却是getCommand(),这个是java的规范。。。

是不是这样。。。我超级新手java。。
w791918 2010-11-03
  • 打赏
  • 举报
回复
jstl中的<c:set/>是个JSTL的标签而已,而javabeen里的set和get那是封装字段,两个不一样的概念哦,
joyce_wung 2010-11-03
  • 打赏
  • 举报
回复
使用<jsp:usebean> 是个不错的选择..
guangguang1984 2010-11-03
  • 打赏
  • 举报
回复
但是有时候 比如你的字段是command,但我看写的get方法确是getCommand(),这个'C'在get方法名变成了大写,这个难道java解析的时候会忽略大小写来找对应的get 或set?

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧