![Board logo](images/default/logo_bg.jpg)
标题: jsp问题 [打印本页]
作者:
kingofworl 时间: 2005-1-13 10:25
txladd.jsp
<form name=f1 action="txladdnew.jsp" method=post>
<td align=left><input type=text name=name> <font color=blue size=5>*</font></td>
这是表单里的控件名,提交这个控件保存的姓名值
txladdnew.jsp
<jsp:useBean id="txlInfo" scope="page" class="txl.TxlInfo">
<jsp:setProperty name="txlInfo" property="*"/>
</jsp:useBean>
TxlInfo.java
public class TxlInfo{
String name;
String dz;
String dh;
int yb;
String oicq;
public void setName(String name){
this.name=name;
}
public void setDz(String dz){
this.dz=dz;
}
我不明白的是usebean的自醒机制到底怎么去判断提交的变量用哪个方法其执行,比如这里我提交的是“name”,但TxlInfo里不止有一个set方法,是根据哪个值判断name用相应的set方法处理呢
作者:
金圭子 时间: 2005-1-13 11:08
不理解你的这句话:“但TxlInfo里不止有一个set方法,是根据哪个值判断name用相应的set方法处理呢”
你的意思是问,我一个程序里面10个函数,然后里面有一个函数处理的是一个变量a,其他都不是,然后程序怎么知道变量a过来以后是用哪个函数处理的??
这个问题就很奇怪了:你自己不写着么:
public void setName(String name){
this.name=name;
}
public void setDz(String dz){
this.dz=dz;
}
他自然是用setName来处理name,用setDz来处理dz啊。
(当然这个和函数名无关,如果你改成:
public void setName(String dz){
this.dz=dz;
}
public void setDz(String name){
this.name=name;
}
那就是setName处理dz,setDz处理name了
作者:
loranrowe 时间: 2005-1-13 11:10
原帖由kingofworl于2005-01-13, 10:25:54发表
<jsp:setProperty name="txlInfo" property="*"/>
...
如果以"*"为值意味着,所有的名称与bean的属性匹配的request参数都将被传递到相应的属性设置方法。
前面已经设置了request参数的名称为"name"
<input type=text name=name>
bean中的属性列表:
...
String name;
String dz;
String dh;
int yb;
String oicq;
...
所以,name属性的默认set方法setName会被调用
作者:
Maxwell 时间: 2005-1-13 11:17
不懂jsp,不过看起来有点像属性的样子,不知道是否setXXXX自动为XXXX属性的写函数,如果是的话,name=name就应该调用name的写函数了,或者另有其他方法把一个函数跟一个属性关联起来。
看了楼上的好像我猜对了
作者:
kingofworl 时间: 2005-1-13 11:21
我大致看明白两位说的了,就是说关键在于TxlInfo.java中
String name;
String dz;
String dh;
int yb;
String oicq;
这个name属性要和前面的name同名,所以能正确传递
而maxwell说的也是我之前一直有疑惑的问题,现在看来不可能了
作者:
kingofworl 时间: 2005-1-13 11:25
原帖由Maxwell于2005-01-13, 11:17:21发表
不懂jsp,不过看起来有点像属性的样子,不知道是否setXXXX自动为XXXX属性的写函数,如果是的话,name=name就应该调用name的写函数了,或者另有其他方法把一个函数跟一个属性关联起来。
看了楼上的好像我猜对了
不是把,我怎么理解的是 之所以正确传递,是因为
public void setName(String name){
this.name=name;
}
里面的this.name,而不是setName
,就是说是红色的决定,而不是蓝色的决定
作者:
loranrowe 时间: 2005-1-13 11:33
原帖由
kingofworl于2005-01-13, 11:25:31发表
原帖由Maxwell于2005-01-13, 11:17:21发表
不懂jsp,不过看起来有点像属性的样子,不知道是否setXXXX自动为XXXX属性的写函数,如果是的话,name=name就应该调用name的写函数了,或者另有其他方法把一个函数跟一个属性关联起来。
看了楼上的好像我猜对了
不是把,我怎么理解的是 之所以正确传递,是因为
public void setName(String name){
this.name=name;
}
里面的this.
name,而不是set
Name
,就是说是红色的决定,而不是蓝色的决定
java里面
类(class)的属性(property)有两个默认的存取方法:get和set
在对对象的属性值进行存取的时候,sun推荐大家都用这两个方法而不是直接修改
其实Maxwell和kingofworl说的都没错
jsp和bean只负责到setName被调用
setName里面写的到底是什么还是由程序员决定的
作者:
金圭子 时间: 2005-1-13 11:35
原帖由kingofworl于2005-01-13, 11:21:55发表
我大致看明白两位说的了,就是说关键在于TxlInfo.java中
String name;
String dz;
String dh;
int yb;
String oicq;
这个name属性要和前面的name同名,所以能正确传递
而maxwell说的也是我之前一直有疑惑的问题,现在看来不可能了
跟这个没关系…………
写成name、dz只是懒罢了…………
这儿改成不一致以后只要把用到这个变量的地方改掉就可以了
这儿两个jsp文件里面的name和java文件里面的name(String name;)和setName函数里面的public void setName(String name)不是一样的,为了方便取了同名而已
我jsp一年没摸了,有些地方也不是很记得了。
好像需要一致的只是maxwell里面说的
txladd.jsp里面的那个<input type=text name=name>和接收这个表单的jsp里面的jsp:setProperty一致就可以了。
作者:
kingofworl 时间: 2005-1-13 11:35
不好意思再问个问题<jsp:setProperty name="txlInfo" property="name" param="name"/>
我怎么都试不出来是哪个颜色传给后面的setName方法处理,这两个的值有什么联系吗
作者:
金圭子 时间: 2005-1-13 11:36
原帖由
kingofworl于2005-01-13, 11:25:31发表
原帖由Maxwell于2005-01-13, 11:17:21发表
不懂jsp,不过看起来有点像属性的样子,不知道是否setXXXX自动为XXXX属性的写函数,如果是的话,name=name就应该调用name的写函数了,或者另有其他方法把一个函数跟一个属性关联起来。
看了楼上的好像我猜对了
不是把,我怎么理解的是 之所以正确传递,是因为
public void setName(String name){
this.name=name;
}
里面的this.
name,而不是set
Name
,就是说是红色的决定,而不是蓝色的决定
你说的没错啊,不就是我前面说的,你把setName改成setSex,不影响内部内容啊。
关键是Maxwell说的和你这个完全没关系啊…………
作者:
金圭子 时间: 2005-1-13 11:37
原帖由kingofworl于2005-01-13, 11:35:50发表
不好意思再问个问题<jsp:setProperty name="txlInfo" property="name" param="name"/>
我怎么都试不出来是哪个颜色传给后面的setName方法处理,这两个的值有什么联系吗
我要吃饭去了,你看看这个吧:
http://www.cn-java.com/target/book.php?news_id=1482
作者:
kingofworl 时间: 2005-1-13 11:45
谢谢各位,我猜我真的明白了,<jsp:setProperty name="txlInfo" property="name" param="name"/>
property="name" 的名字是由txlInfo中的String name属性决定的,一致即可
param="name"/和表单中的控件名一致,然后把蓝色的通过方法赋值给红色的属性
作者:
金圭子 时间: 2005-1-13 12:52
kingofworl太客气了…………
作者:
Maxwell 时间: 2005-1-13 12:52
晕了,有些语言在访问XXXX属性时自己去找GetXXXX或者SetXXXX函数,金圭子的说法好像jsp不是这么办的,而是去分析哪个函数修改了XXXX?可是如果某个函数内同时修改了name和dz呢?或者有两个函数修改了name呢?
作者:
金圭子 时间: 2005-1-13 12:56
我现在连MaxWell的话都看不懂了…………maxwell先去看看我给的链接,看完了还有什么问题再问吧…………(我头晕了,今天工作事情太多,昨天熬夜做太阁5全商人图文攻略截图100余,到午睡时间脑子现在已经迷迷糊糊了)
作者:
Maxwell 时间: 2005-1-13 13:12
大致看了一下,不懂。
我的意思是这样,如果出现这样的情况
public void setName(String name)
{
this.name = name;
this.dz = name;
}
或者
public void setName(String name)
{
this.name = name;
}
public void setDz(String dz)
{
this.name = dz;
}
那name=name的时候会出现什么情况?
作者:
金圭子 时间: 2005-1-13 13:22
要回去看看jsp的书了。
反正就算不是jsp,这么用顶多就三种情况:
1.一个值付给两个变量
2.一个变量被付了两次值,后面的覆盖前面的。
3.报错
作者:
kingofworl 时间: 2005-1-13 13:37
原帖由Maxwell于2005-01-13, 13:12:16发表
大致看了一下,不懂。
我的意思是这样,如果出现这样的情况
public void setName(String name)
{
this.name = name;
this.dz = name;
}
或者
public void setName(String name)
{
this.name = name;
}
public void setDz(String dz)
{
this.name = dz;
}
那name=name的时候会出现什么情况?
我也晕了,容我晚上试试
作者:
Maxwell 时间: 2005-1-13 13:45
原帖由金圭子于2005-01-13, 13:22:39发表
要回去看看jsp的书了。
反正就算不是jsp,这么用顶多就三种情况:
1.一个值付给两个变量
2.一个变量被付了两次值,后面的覆盖前面的。
3.报错
就是基于这种比较晕的情况,我觉得还是用如下的方法好
1. XXXX属性的读写自动由GetXXXX和SetXXXX完成,我怎么记得java就是这么做的? 好像vb也这样?
2. 指定read=xxxx, write=xxxx,bcb是这么做的,我比较习惯
作者:
kingofworl 时间: 2005-1-13 13:50
原帖由
Maxwell于2005-01-13, 13:45:28发表
原帖由金圭子于2005-01-13, 13:22:39发表
要回去看看jsp的书了。
反正就算不是jsp,这么用顶多就三种情况:
1.一个值付给两个变量
2.一个变量被付了两次值,后面的覆盖前面的。
3.报错
就是基于这种比较晕的情况,我觉得还是用如下的方法好
1. XXXX属性的读写自动由GetXXXX和SetXXXX完成,我怎么记得java就是这么做的? 好像vb也这样?
2. 指定read=xxxx, write=xxxx,bcb是这么做的,我比较习惯
刚才金给的连接上的文档没提这种用法,setName()能直接取Name首字母小写后的变量
作者:
kingofworl 时间: 2005-1-13 14:08
行了,无关的话请maxwell删除,我上学去了,等我试过之后给大家答案
作者:
loranrowe 时间: 2005-1-13 15:20
给个例子就清楚了
Bean:
public class GuestBean{
private String firstName;
private String lastName;
private String email;
public void setFirstName(String name){
firstName = name;
}
public String getFirstName(){
return firstName;
}
public void setLastName(String name){
lastName = name;
}
public String getLastName(){
return = lastName;
}
...
}
JSP:
...
<jsp:useBean id = "guset" scope = "page" class = "GuestBean" />
<jsp:setProperty name="guest" property="*" />
...
<form method = "post" action = "XXXX.jsp">
<input type = "text" name = "firstName" />
<input type = "text" name = "lastName" />
<input type = "text" name = "email" />
...
以上代码是作为例子出现在高级java大学教程中的
当表单中的属性名和Bean中的属性名同名时,可以不必声明属性的对应关系而直接使用“*”作为默认
显然,当表单将参数firstName、lastName和email的值传递给Bean时,由于相应属性为private,是不能直接对其进行修改的,必须通过相应的set、get方法
推荐在编写实际代码时参考以上写法
作者:
loranrowe 时间: 2005-1-13 15:34
这个例子就更清晰了:
Bean:
public class Rotator {
private String images[] = { "images/image1.jpg",
"images/image2.jpg",
"images/image3.jpg",
"images/image4.jpg",
"images/image5.jpg"};
private String links[] = { "http://http://www.xycq.net/forum/index.php?page=1",
"http://http://www.xycq.net/forum/index.php?page=2",
"http://http://www.xycq.net/forum/index.php?page=3",
"http://http://www.xycq.net/forum/index.php?page=4",
"http://http://www.xycq.net/forum/index.php?page=5"};
private int selectedIndex = 0;
public String getImage(){
return images[selectedIndex];
}
public String getLink(){
return links[selectedIndex];
}
public void nextAd(){
selectedIndex = (selectedIndex + 1) % images.length;
}
}
JSP
<jsp:useBean id = "rotator" scope = "application" class = "Rotator" />
<jsp:getProperty name="rotator" property="link" />
<jsp:getProperty name="rotator" property="image" />
这个例子里面,Bean的属性名和表单请求的属性名是不同的,同样可以顺利执行,说明Bean是将表单的请求发送给了相应的函数,而跟Bean的属性名没有必然的联系
以上。
作者:
Maxwell 时间: 2005-1-13 15:37
好像明白点了。
作者:
kingofworl 时间: 2005-1-13 23:55
原帖由Maxwell于2005-01-13, 15:37:10发表
好像明白点了。
我保证你听完我的又糊涂了,经过2个小时的反复试验,发现在指定方法时
<jsp:setProperty name="txlInfo" property="name" param="name"/>
public void setName(String name)
{
this.name = name;
}
红色部分一致才能取到值,和其他如控件名蓝色部分无关,property="*"估计也差不多
不过还没完如果按你之前设想的
public String userName;
public String password;
public int age;
public void setUserNamea(String name)
{
this.password=name;
}
public void setPassworda(String password)
{
this.userName=password;
}
public void setAgea(int age1)
{
this.age=age1;
}
我把name和password换位置,如果之前得到的结果是 1、2、3 现在就是2、1、3
注册成功:
--------------------------------------------------------------------------------
使用bean属性方法:
用户名:2
密码: 1
年龄: 3
--------------------------------------------------------------------------------
使用 getProperty
动作)
用户名:2
密码: 1
年龄: 3
这么说又好像推翻了我开始的结论,我彻底晕了
作者:
loranrowe 时间: 2005-1-14 09:16
原帖由kingofworl于2005-01-13, 23:55:10发表
我保证你听完我的又糊涂了,经过2个小时的反复试验,发现在指定方法时
<jsp:setProperty name="txlInfo" property="name" param="name"/>
public void setName(String name)
{
this.name = name;
}
红色部分一致才能取到值,和其他如控件名蓝色部分无关,property="*"估计也差不多
谁告诉我这是什么规矩
jsp中引用的属性和bean(class)中的属性是两个概念
如果你认真看完我上面贴的代码
应该能够有所理解
jsp中set(get) property="XXX"指定的值,事实上对应于bean中相应的方法名
作者:
kingofworl 时间: 2005-1-14 09:34
原帖由loranrowe于2005-01-14, 9:16:44发表
jsp中引用的属性和bean(class)中的属性是两个概念
如果你认真看完我上面贴的代码
应该能够有所理解
jsp中set(get) property="XXX"指定的值,事实上对应于bean中相应的方法名
我当然看了,书上写的也一样,几个人经验 也应该是这个理论,不过怎么试都不行,是不是其它方面的问题,我试的时候好像每次都重起tomcat还有其他要注意的吗
作者:
Maxwell 时间: 2005-1-14 10:03
你是怎么交换的?这样?
<jsp:setProperty name="txlInfo" property="UserNamea" param="name"/>
<jsp:setProperty name="txlInfo" property="Passworda" param="name"/>
<jsp:setProperty name="txlInfo" property="Agea" param="name"/>
public String userName;
public String password;
public int age;
public void setUserNamea(String name)
{
this.password=name;
}
public void setPassworda(String password)
{
this.userName=password;
}
public void setAgea(int age1)
{
this.age=age1;
}
如果这样则说明property="XXXX"是声明了一个属性XXXX,当然一般需要一个get和一个set共同声明一个属性,这个属性的值实际保存在什么变量里是无所谓的,比如Passworda属性值在username变量中,是否冲突是否歧义等需要由程序员来保证。
我现在不明白的是属性怎么跟表单连接起来的,
Bean的属性名和表单请求的属性名是不同的
但是loranrowe没有给出表单,不知是否是笔误?是属性名跟变量名不同?是否是属性名要跟表单中的名字一致?
作者:
loranrowe 时间: 2005-1-14 10:03
原帖由kingofworl于2005-01-14, 9:34:18发表
我当然看了,书上写的也一样,几个人经验 也应该是这个理论,不过怎么试都不行,是不是其它方面的问题,我试的时候好像每次都重起tomcat还有其他要注意的吗
不需要重启tomcat
你的试验结果支持了你得出的结论啊,有啥好糊涂的?
setXXXX只是个方法名
具体里面是什么代码都可以...
也就是说setXXXX不一定会改变bean中XXXX属性的值(如果有同名的)
你可以用来输出"hello world!"
也可以用来在数据库中建1条记录
java允许你做什么,你就可以做什么
程序流程决定做什么,与名字无关
作者:
Maxwell 时间: 2005-1-14 10:10
呵呵,明白了,jsp其实跟bcb的处理方式是一样的。
作者:
loranrowe 时间: 2005-1-14 10:12
原帖由Maxwell于2005-01-14, 10:03:12发表
我现在不明白的是属性怎么跟表单连接起来的,
但是loranrowe没有给出表单,不知是否是笔误?是属性名跟变量名不同?是否是属性名要跟表单中的名字一致?
jsp的实现分3个部分
html、jsp和bean(可选)
html在提交请求的时候,jsp通过<jsp:get(set)Property>句中的param项与html的相应域建立联系,property项建立与bean的联系,这两项都可选
get的时候可以不需要接收域,直接生成html的一部分了
jsp语句是嵌在html里面的,类比宏替换
作者:
Maxwell 时间: 2005-1-14 10:16
总算明白这个复杂关系了,jsp做大型网站还可以,做个小网站还不够麻烦的
作者:
kingofworl 时间: 2005-1-14 10:17
我现在不明白的是属性怎么跟表单连接起来的,
是由<jsp:useBean id=xxx>这个决定的,当html把用户填入的值submit到jsp时,jsp中<jsp:useBean id=xxx class=aaa>有这个动作,所以能自动调用(自醒机制)aaa中的方法,具体通过什么就是一直在讨论的
作者:
Maxwell 时间: 2005-1-14 10:23
<input type=text name=a>
<jsp:useBean id = "txlInfo" scope = "page" class = "GuestBean" />
<jsp:setProperty name="txlInfo" property="b" param="a"/>
public class GuestBean{
private String c;
public void setB(String str){
this.c=str;
}
我认为是这样,表单里的名字要跟param一样,property的名字要跟方法对应,就是同样颜色的要对应,至于变量名就随便起了,比如叫c。
调用是否是通过检查param是否有同名的然后调用同名的param对应的方法。如果这样是不是就可以同一个域一次引起多个方法执行?
<jsp:setProperty name="txlInfo" property="b" param="a"/>
<jsp:setProperty name="txlInfo" property="d" param="a"/>
这样setB和setD都会执行。
作者:
kingofworl 时间: 2005-1-14 10:29
原帖由Maxwell于2005-01-14, 10:23:16发表
<input type=text name=a>
<jsp:setProperty name="txlInfo" property="b" param="a"/>
public void setB(String str){
this.c=str;
}
我认为是这样,表单里的名字要跟param一样,property的名字要跟方法对应,就是同样颜色的要对应,至于变量名就随便起了,比如叫c。
public String userName;
public String password;
public int age;
public void setUserNamea(String name)
{
this.password=name;
蓝色部分我昨天初步试也认为是这样,刚才看错了,maxwell兄的经验果然丰富
作者:
loranrowe 时间: 2005-1-14 10:31
原帖由Maxwell于2005-01-14, 10:23:16发表
<input type=text name=a>
<jsp:useBean id = "txlInfo" scope = "page" class = "GuestBean" />
<jsp:setProperty name="txlInfo" property="b" param="a"/>
public class GuestBean{
private String c;
public void setB(String str){
this.c=str;
}
我认为是这样,表单里的名字要跟param一样,property的名字要跟方法对应,就是同样颜色的要对应,至于变量名就随便起了,比如叫c。
嗯嗯,基本上,简单来讲,就是这样了
另外说一句,OO语言,很多思想、处理方式都是类似的
一通百通
不过都要先打好结构化语言的基础,才好理解
作者:
Maxwell 时间: 2005-1-14 10:39
从下面的文字看如果你只改了方法名是不行的,是不是在没有找到对应的方法时会自动生成一个默认的方法,这个方法也刚好完成任务?
以下是四种jsp:setProperty的可用的属性:
属性 用法
name
这是一个必选属性。它指出哪一个bean的属性将被设置。jsp:usebean必须出现在jsp:setProperty之前。
property
这是一个必选属性。表明您将设置哪一个属性。然而,有一个特殊的情况:如果以"*"为值意味着,所有的名称与bean的属性匹配的request参数都将被传递到相应的属性设置方法。
value
这是一个可选属性。它指定被设置的属性的值。字符串的值通过相应的对象或包的标准的valueOf方法将自动的转换为numbers,boolean,Boolean,byte,Byte,char,和Character。例如,boolean或Boolean属性的值“true”将通过Boolean.valueOf方法转化,而,一个int或Integer属性的值“42”将通过Integer.valueOf转化。您不能同时使用value和param属性,但,两个都不用是允许的。
param
这是一个可选属性。它指明了bean的属性应该继承的request的参数。如果当前的request没有这样的一个参数,就什麽也不做:系统并不将null传给设置属性的方法。因此,您可以使用bean的缺省值。例如下面的这段程序执行“将numberOfItems属性设置为任意numItems request参数的值,如果有这样的一个request参数,否则什么也不做。”
<jsp:setProperty name="orderBean"
property="numberOfItems"
param="numItems" />
如果您将value和param同时缺省,这和您将param的名称设为bean的属性名相同一样。您可以通过将name的值设置为”*”和省略value和param来自动的使用与bean的属性相应的request的属性。在这种情况下,服务器将反复的查找可用的属性和request参数来匹配具有相同名字的。
作者:
kingofworl 时间: 2005-1-14 10:40
我有试验了一下,事实正如maxwell兄所举例子,实际上大家早就这么说了,都怪我之前没理解,至此终于明白了
作者:
青蓝 时间: 2005-2-1 23:52
又了解了一点知识~`高兴~~~~````
欢迎光临 轩辕春秋文化论坛 (http://xycq.org.cn/forum/) |
Powered by Discuz! 5.0.0 |