Board logo

标题: 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



QUOTE:
原帖由kingofworl于2005-01-13, 10:25:54发表
<jsp:setProperty name="txlInfo" property="*"/>
...   

如果以"*"为值意味着,所有的名称与bean的属性匹配的request参数都将被传递到相应的属性设置方法。
前面已经设置了request参数的名称为"name"

QUOTE:
<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



QUOTE:
原帖由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



QUOTE:
原帖由kingofworl于2005-01-13, 11:25:31发表

QUOTE:
原帖由Maxwell于2005-01-13, 11:17:21发表
不懂jsp,不过看起来有点像属性的样子,不知道是否setXXXX自动为XXXX属性的写函数,如果是的话,name=name就应该调用name的写函数了,或者另有其他方法把一个函数跟一个属性关联起来。

看了楼上的好像我猜对了  

不是把,我怎么理解的是 之所以正确传递,是因为
public void setName(String name){
    this.name=name;
  }
里面的this.name,而不是setName
,就是说是红色的决定,而不是蓝色的决定

java里面
类(class)的属性(property)有两个默认的存取方法:get和set
在对对象的属性值进行存取的时候,sun推荐大家都用这两个方法而不是直接修改
其实Maxwell和kingofworl说的都没错
jsp和bean只负责到setName被调用
setName里面写的到底是什么还是由程序员决定的
作者: 金圭子    时间: 2005-1-13 11:35



QUOTE:
原帖由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



QUOTE:
原帖由kingofworl于2005-01-13, 11:25:31发表

QUOTE:
原帖由Maxwell于2005-01-13, 11:17:21发表
不懂jsp,不过看起来有点像属性的样子,不知道是否setXXXX自动为XXXX属性的写函数,如果是的话,name=name就应该调用name的写函数了,或者另有其他方法把一个函数跟一个属性关联起来。

看了楼上的好像我猜对了  

不是把,我怎么理解的是 之所以正确传递,是因为
public void setName(String name){
    this.name=name;
  }
里面的this.name,而不是setName
,就是说是红色的决定,而不是蓝色的决定

你说的没错啊,不就是我前面说的,你把setName改成setSex,不影响内部内容啊。

关键是Maxwell说的和你这个完全没关系啊…………
作者: 金圭子    时间: 2005-1-13 11:37



QUOTE:
原帖由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



QUOTE:
原帖由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



QUOTE:
原帖由金圭子于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



QUOTE:
原帖由Maxwell于2005-01-13, 13:45:28发表

QUOTE:
原帖由金圭子于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



QUOTE:
原帖由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



QUOTE:
原帖由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



QUOTE:
原帖由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变量中,是否冲突是否歧义等需要由程序员来保证。

我现在不明白的是属性怎么跟表单连接起来的,

QUOTE:
Bean的属性名和表单请求的属性名是不同的

但是loranrowe没有给出表单,不知是否是笔误?是属性名跟变量名不同?是否是属性名要跟表单中的名字一致?
作者: loranrowe    时间: 2005-1-14 10:03



QUOTE:
原帖由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



QUOTE:
原帖由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



QUOTE:
原帖由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



QUOTE:
原帖由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