当前位置:编程学习 > JAVA >>

【发神经】问个变态问题,看谁知道

在struts2的action里写两个方法

setName(int name){
    //执行方法
}
setName(String name){
    //执行方法
}
然后通过文本框给这个action赋值,会出现什么情况?

不测试的话谁知道怎么回事? --------------------编程问答-------------------- 貌似是你传数值和字符串都行吧 --------------------编程问答-------------------- 进这个方法,正常的input标签传递的都是字符串。
setName(String name){
  //执行方法
}
--------------------编程问答--------------------
 应该是这个吧!
setName(String name){
  //执行方法
}
--------------------编程问答--------------------
引用 2 楼 lwb314 的回复:
进这个方法,正常的input标签传递的都是字符串。
setName(String name){
  //执行方法
}

+1 --------------------编程问答-------------------- 如果你输入的是可以转换为整型数据的格式的内容
那就是setName(int)这个方法

其他的使用setName(String)方法 --------------------编程问答-------------------- 这是乱猜的啊~~~ --------------------编程问答-------------------- 那我要是就传一个整形数呢?
嘿嘿 --------------------编程问答--------------------
引用 7 楼 smoke_1988 的回复:
那我要是就传一个整形数呢?
嘿嘿


--------------------编程问答-------------------- 通过文本框给action赋值,拿到的都是个字符串,要么是字符字符串,要么是数据字符串等等,最后调用的方式都是setName(String name) --------------------编程问答--------------------
引用 2 楼 lwb314 的回复:
进这个方法,正常的input标签传递的都是字符串。
setName(String name){
  //执行方法
}

+1 --------------------编程问答--------------------
引用 2 楼 lwb314 的回复:
进这个方法,正常的input标签传递的都是字符串。
setName(String name){
  //执行方法
}


毫无疑问 是这个 --------------------编程问答-------------------- 这个页面上的东西都是字符串,程序当然优先执行那个
setName(String name){
 //执行方法
}
--------------------编程问答-------------------- 只会用第一个方法.因为输入的数据都是字符串的吧.即使是数字也是以字符串的类型来接收的. --------------------编程问答--------------------
引用 10 楼 ucjatteyma 的回复:
引用 2 楼 lwb314 的回复:

进这个方法,正常的input标签传递的都是字符串。
setName(String name){
//执行方法
}

+1

+1 --------------------编程问答-------------------- 因为是文本框,所以接受的都是字符串,进这个
setName(String name){
  //执行方法
} --------------------编程问答-------------------- --------------------编程问答-------------------- 应该是string吧!!我看struts2都处理成string!! --------------------编程问答-------------------- 哪个方法在前面用哪个(表骂我,我是来打酱油的) --------------------编程问答--------------------
引用 14 楼 yuehang50 的回复:
引用 10 楼 ucjatteyma 的回复:
引用 2 楼 lwb314 的回复:

进这个方法,正常的input标签传递的都是字符串。
setName(String name){
//执行方法
}

+1

+1
+1 --------------------编程问答--------------------
引用 7 楼 smoke_1988 的回复:
那我要是就传一个整形数呢?
嘿嘿


传入整形也是当字符串处理。。 --------------------编程问答--------------------
引用 3 楼 jiangkunccc 的回复:
 应该是这个吧!
setName(String name){
  //执行方法
}

+1 --------------------编程问答-------------------- 以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……
--------------------编程问答-------------------- 以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了…… --------------------编程问答--------------------
引用 23 楼 dragonsky_w 的回复:
以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……


说的有道理,应该是这样的。顺便去测试一下! --------------------编程问答-------------------- 我记得是  会自动匹配 --------------------编程问答-------------------- 我也觉得是两个不同的方法,换种方式当成方法的重载。属性是哪个应该就调用哪个对于的setter方法。 --------------------编程问答-------------------- 做程序真没劲 研究这些别人不在乎的东西  --------------------编程问答--------------------
引用 22 楼 dragonsky_w 的回复:
以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……
正解! --------------------编程问答--------------------
引用 28 楼 fhqcelv 的回复:
引用 22 楼 dragonsky_w 的回复:

以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……
正解!


JavaBean中的属性不是根据成员变量名的,而是根据getter和setter。甚至属性可以没有对应的成员变量。你混淆了属性与成员变量。例如:
private int name;
private String name2;
public int setName(int name) {
    this.name = name;
}
public String setName(String name) {
    name2 = name;
}

如果 setName(String name)在setName(int name)之前定义,则页面input中提交过来的值一定是调用setName(String name)。
如果setName(String name)在setName(int name)之后定义,则页面input中提交过来的值如果是可以转换成数值的字符串,则调用的是setName(int name);如果提交过来的值不能转换成数值,则出错。


--------------------编程问答-------------------- 试试不就知道了啊? 打个日志。。。 --------------------编程问答-------------------- 要看定义的属性吧?(好吧,我只是刚学的  不怎么懂  想找人教教我....) --------------------编程问答-------------------- 结贴吧 --------------------编程问答-------------------- 日志输出,一清二白。 --------------------编程问答--------------------
引用 7 楼 smoke_1988 的回复:
那我要是就传一个整形数呢?
嘿嘿

action中还是得到的还是这个整形数的字符类型化的数啊! --------------------编程问答-------------------- 。。。。。。怎么可能同时出现Int name和 String name 么~  常识问题  --------------------编程问答--------------------
引用 4 楼 okey_easy 的回复:
引用 2 楼 lwb314 的回复:

进这个方法,正常的input标签传递的都是字符串。
setName(String name){
//执行方法
}

+1

+1 --------------------编程问答-------------------- 无论什么参数 都会执行
setName(int name){
   //执行方法
} 不知道为什么 --------------------编程问答-------------------- 确实蛮蛋疼,都疼的凉了! --------------------编程问答-------------------- 定义 方法  不一定要定义属性。。  这概念不一样的。 --------------------编程问答-------------------- 有没有谁试过了?求正确结果 --------------------编程问答--------------------
引用 22 楼 dragonsky_w 的回复:
以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……


这个与成员变量真没关系,你都知道成员变量是用private定义,那成员变量的类型也就只能对象内部才知道,不是吗。
页面表单数据传到后台后,JavaBean是通过public void setName(xxx name)来为成员变量赋值的。
至于楼主说的这种情况,以前还真没注意过。
不过,如果我是Struts2或WebWork的架构师,那么我肯定会像5楼兄弟说的那样架构。

引用 5 楼 yanmushi 的回复:
如果你输入的是可以转换为整型数据的格式的内容
那就是setName(int)这个方法

其他的使用setName(String)方法


事实,只有测试过才知道了。 --------------------编程问答--------------------

测试结果:


public void setCode(Integer code) {
System.out.println("Integer "+code);
}
public void setCode(String code) {
System.out.println("String "+code);
}
//如果输入数字,则打印:Integer 数字;如果输入字母,则不打印,然后报错进入inputPage。



public void setCode(String code) {
System.out.println("String "+code);
}
public void setCode(Integer code) {
System.out.println("Integer "+code);
}
//无论输入数字或字母,都打印:String 输入内容


所以以后别小看街边打酱油的人,说不定他就是程序高手。

引用 18 楼 tanshi 的回复:
哪个方法在前面用哪个(表骂我,我是来打酱油的)
--------------------编程问答-------------------- --------------------编程问答-------------------- 我讨厌SSH,从来不用这三个狗玩意儿。 --------------------编程问答-------------------- 文本框传的默认是字符串,应该是这个吧setName(String name){
  //执行方法
}
仅供参考,没有经过测试哈 --------------------编程问答-------------------- 文本框传的默认是字符串,应该是这个吧setName(String name){
  //执行方法
}
仅供参考,没有经过测试哈 --------------------编程问答-------------------- 呵呵  我没注意到这个,还是学到好多东西 --------------------编程问答--------------------
引用 29 楼 superpeter 的回复:
引用 28 楼 fhqcelv 的回复:

引用 22 楼 dragonsky_w 的回复:

以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……
正解!


JavaBean中的属性不是根据成员变量名……

是这样的!
另外,传入整数值它也会转化为数字型字符的。如123会转化为“123”这样子 --------------------编程问答--------------------
如果传入整形  执行 setName(int name)
如果传入字符形  执行 setName(String name)

这是面向对象的多态的问题.是必须的。。不会是哪个在前执行哪个。。不管什么语言。
(只要是符合面向对象的。。)大部分正常情况下都会是这样。。
不懂得就别瞎说。容易误人子弟。。。。。

--------------------编程问答--------------------
引用 35 楼 hht125133528 的回复:
。。。。。。怎么可能同时出现Int name和 String name 么~  常识问题

怎么不可能?汗,方法重载? --------------------编程问答-------------------- 上面那个测试个鬼啊!!!经测试和大家想的一样,struts2都是封装成String,跟方法前后没有任何关系。 --------------------编程问答-------------------- 被标题吸引进来的,有些东西没必要讨论,自己捉摸一下,控制台打印一下就知道了!! --------------------编程问答-------------------- HTML通过HTTP传到服务器段,都会被解析成String的,LZ图森破了 --------------------编程问答-------------------- 呃.就是个重载有问题吗?
检查一下传进去的到底是int还是string --------------------编程问答-------------------- --------------------编程问答-------------------- 呵呵,我说个别的思路吧
struts2 里,请求参数是通过Parameters Interceptor绑定到action的属性的,而Parameters Interceptor是通过ognl来导航的
所以首先看看Parameters Interceptor的文档
再看看ognl里函数调用的文档
应该就可以得到答案,楼主你可以试试 --------------------编程问答--------------------
引用 27 楼 qq307023807 的回复:
做程序真没劲 研究这些别人不在乎的东西

并且还津津乐道 --------------------编程问答--------------------
引用 41 楼 dryzeng 的回复:
引用 22 楼 dragonsky_w 的回复:

以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……


这个与成员变量真没关系,你都知道成员变量是用private定义,那成员变量的类型也就只能对象内部才……

那你申明变量是int 还是String 呢 --------------------编程问答-------------------- 够神经够变态,有兴趣去读struts的源码啊,源码都是人写的,在这儿胡乱猜测是没用的。 --------------------编程问答-------------------- 都没遇到这种问题?
都没测试过? --------------------编程问答-------------------- bt --------------------编程问答-------------------- 这个问题所以被提出应该是楼主对getter/setter概念认识不足。
Struts2里用XWork的ParamsInterceptor处理变量赋值的问题,而ParamsInterceptor调用OGNL的setValue函数。
setValue函数首先找Java bean的setter函数,没有的话尝试直接给属性赋值。
那么问题就归结为:setName(int name) 与setName(String name) 究竟哪个是setter? 如果你的private name定义为int那就是前者,String那就是后者,如果你没有private name那就哪个都不被执行。
并不是说有名字叫setXXX函数就必须被调用。

这点上面也有人提出来的,就不多说。

唯一大家忽略掉的就是在Struts2框架的例外。就是Alias Interceptor机制。
http://struts.apache.org/2.0.14/docs/alias-interceptor.html

如果我定义
<action name="someAction" class="com.examples.SomeAction">
    <param name="aliases">#{ 'name' : 'name1' }</param>

    <interceptor-ref name="alias"/>
    <interceptor-ref name="basicStack"/>
    <result name="success">good_result.ftl</result>
</action>

那么调用setName1也是有可能的。(前提setName1是对private name1的setter)。
这个Alias Interceptor是优先于ParamsInterceptor的。
在多个画面调用共通的Action时是非常有用的,因为变量名字可能会有不同。 --------------------编程问答-------------------- 说的有道理
引用 42 楼 dryzeng 的回复:
测试结果:

Java code

    public void setCode(Integer code) {
        System.out.println("Integer "+code);
    }
    public void setCode(String code) {
        System.out.println("String "+code);
    }……
--------------------编程问答-------------------- 关键词,反射
--------------------编程问答--------------------
引用 23 楼 dragonsky_w 的回复:
以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……

不会的  如果代码是
private String aa;
public setName(String name){
    aa = name;
}
这样也是可行的。 --------------------编程问答--------------------
引用 42 楼 dryzeng 的回复:
测试结果:

Java code

    public void setCode(Integer code) {
        System.out.println("Integer "+code);
    }
    public void setCode(String code) {
        System.out.println("String "+code);
    }……




哈哈  搞笑     厉害!!!! --------------------编程问答-------------------- 看传进去的是什么参数,传进去的是String类型的,就执行setCode(String code),穿进去的是int型的就执行setCode(Integer code) --------------------编程问答-------------------- 真是没劲,看着标题...蛋疼
讨论这些问题?真是无聊。 --------------------编程问答-------------------- 进这个方法,正常的input标签传递的都是字符串。
setName(String name){
//执行方法
} --------------------编程问答-------------------- 我也觉得是看action里的定义,定义int.就引用set(int)否则下一个 --------------------编程问答-------------------- 写这种代码,被骂死的! --------------------编程问答--------------------
引用 10 楼 ucjatteyma 的回复:
引用 2 楼 lwb314 的回复:

进这个方法,正常的input标签传递的都是字符串。
setName(String name){
//执行方法
}

+1

+1 --------------------编程问答--------------------
引用 27 楼 qq307023807 的回复:
做程序真没劲 研究这些别人不在乎的东西


不在乎你跟什么贴,找喷吗? --------------------编程问答-------------------- 这个属于重载,看你传什么参数了。 --------------------编程问答--------------------
引用 58 楼 mocaoshang 的回复:
引用 41 楼 dryzeng 的回复:

引用 22 楼 dragonsky_w 的回复:

以上的都错了,这个没有先后的,那要看你定义的属性是private int name;还是 private String name; 这两个属性是不能同时存在的,所以你定义的是那个就调用相应的set方法……这样的话就没有先后之分了……


这个与成员变量真没关系,你都知道成员变量是用pri……

那你申明变量是int 还是String 呢


都说了跟成员变量没关系啦,所以这里不需要声明变量。只要你页面form里有name为"code"的input,Servlet就会找到相应的public xxx setCode方法去执行。

也就是根本不用声明变量。 --------------------编程问答-------------------- 楼上的说话要有根据,我看过Xword和OGNL代码,这说的情况不存在。 --------------------编程问答-------------------- 应该出现找不到方法 --------------------编程问答-------------------- 好久都没有用过struts了,忘得都差不多了,先说一下自己的看法。你在使用set方法时,肯定是要声明那个name吧,而且应该是在一个类里面声明,那么怎么会出现public String name;  public int name;  这两个不可能同时出现吧。所以说你只能写一个。所以说,这种代码从一开始就是错的,好像是这样,说的不对的话还望指正 --------------------编程问答-------------------- 我觉得讨论这个问题很无聊,谁会去写那样的代码,那不是找抽嘛 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 无聊的人还挺多...

看下日志就行了; --------------------编程问答-------------------- 如果不是弱类型语言的话,文本框中的值皆为String类型。所以要调用的是setName(String name)方法。 --------------------编程问答-------------------- 首先问的问题有点让人捉摸不透,给action赋值? 还是给action里的某个属性赋值呢?
看题意应该是给某个属性赋值,那么这个属性的类型是什么呢?
java是强类型的而不像javascript松散类型耦合
那么在调用setName(type value)之前,势必value的类型需要确定,否则编译都通不过不是吗?

private String name = null;

public void setName(String name) {
  this.name = name;
}

public void setName(Integer value){
  this.name = String.valueOf(value);
}

虽然我的这种编码方式在checkstyle方式下会产生警告,愿能回答你的这个问题

--------------------编程问答--------------------
引用 84 楼 zjkida 的回复:
首先问的问题有点让人捉摸不透,给action赋值? 还是给action里的某个属性赋值呢?
看题意应该是给某个属性赋值,那么这个属性的类型是什么呢?
java是强类型的而不像javascript松散类型耦合
那么在调用setName(type value)之前,势必value的类型需要确定,否则编译都通不过不是吗?

private String name = null;

publ……

也许就是在bean中就把多余的操作给做了,如转型等!!! --------------------编程问答-------------------- 这要看你的字段是什么类型了 然后struts就会调用哪种类型的方法  如果你要转换的话就建立一个转换器呗   --------------------编程问答-------------------- 题是否有问题,可以同时定义两个

private String name;
private int name;

吗? --------------------编程问答--------------------
引用 2 楼 lwb314 的回复:
进这个方法,正常的input标签传递的都是字符串。
setName(String name){
  //执行方法
}
 +1 --------------------编程问答-------------------- 同意看日志,
但是日志怎么看? --------------------编程问答-------------------- Struts2 反射用户action的setter方法,然后得到第一个匹配的配置。
怎么执行要看你顺序
如果int在前就进int
如果String在前就进String
--------------------编程问答-------------------- string参数的那个方法,因为你输入的字符,都会被解析成字符传输哈 --------------------编程问答-------------------- 我把问题再重复一遍,有人的回答实在是不过大脑

我有一个html表单,提交<input name="key" />
action中只有两个set方法和一个execute方法
setKey(double key){}和
setKey(Long key){}
没有私有字段,不存在变量冲突的问题,我只问这两个方法哪个执行?为什么 --------------------编程问答-------------------- 整形也是当字符串处理。。

我觉得是调用
setName(String name){
//执行方法
}
--------------------编程问答-------------------- 表单提交数据都是字符串类型,其他的可以类型转换
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,