代数和为负整数

echoxue 2011-09-30 02:55:04
一个简单的struts例子,如下URL:
http://www.bianceng.cn/Programming/Java/201107/27511.htm

我的困惑是:这个
<s:property value="sum" />

sum在action类中没有定义此属性,页面怎么会取得到呢?

-------------------------------------------------------------------------------------------------------------
这两个jsp页面的实现代码基本一样,只使用了一个<s:property>标签来显示Action类中的sum属性值。<s:property>标签是从request对象中获得了一个对象中得到的sum属性,如我们可以使用如下的代码来代替<s:property value=”sum”/>:
-------------------------------------------------------------------------------------------------------------

请帮忙解惑?

谢谢!
...全文
224 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
1llusion 2014-04-07
  • 打赏
  • 举报
回复
sunnydalis 2014-03-10
  • 打赏
  • 举报
回复
楼上是对的 。。。
echoxue 2011-10-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bohe_198878 的回复:]
因为你有getSum()这个方法,其实struts2的标签<s:property value="XXX"/>就是调用getXXX方法来实现的,我也是偶然看到这个帖子的,但我不保证对的,具体怎么样最好去看struts2<s:property value=""/>标签的源码
[/Quote]

我找到答案了,我看了李刚老师的书(struct2权威指南2-p93页):
action类中可以不包含属性,因为系统是通过对应的getter和setter方法来处理请求参数的,而不是通过属性名处理请求参数的。

即此sum类中有否sum属性没有关系。重要的是有一个getsum()的方法。就是这个道理。




echoxue 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 a_b_a_b_a_b_a_b 的回复:]
15楼的说法是正确的,是因为你的action类中有getNum()方法,
[/Quote]

我不理解的是getSum()就为何能对应sum啊?
echoxue 2011-09-30
  • 打赏
  • 举报
回复
具体就是Action把所有的属性封装到了ValueStack 对象,但是为什么sum我们没有定义在action类中,确有这个属性呢?我也不知道了,不知道后面有人能回答否????
a_b_a_b_a_b_a_b 2011-09-30
  • 打赏
  • 举报
回复
15楼的说法是正确的,是因为你的action类中有getNum()方法,
echoxue 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bohe_198878 的回复:]
因为你有getSum()这个方法,其实struts2的标签<s:property value="XXX"/>就是调用getXXX方法来实现的,我也是偶然看到这个帖子的,但我不保证对的,具体怎么样最好去看struts2<s:property value=""/>标签的源码
[/Quote]

应该不是你说的getxxx得到的,仔细研究了一下:

public String execute() throws Exception {

if (getSum() >= 0) // 如果代码数和是非负整数,跳到positive.jsp页面
{
request = ServletActionContext.getRequest();
com.opensymphony.xwork2.util.OgnlValueStack ovs =
(com.opensymphony.xwork2.util.OgnlValueStack)request.getAttribute("struts.valueStack");
double dblSum= Double.parseDouble(ovs.findString("sum"));

response = ServletActionContext.getResponse();

return "positive";
} else // 如果代码数和是负整数,跳到negative.jsp页面
{
return "negative";
}
}

发现是可以找到这个sum的字符串。但是我也不知道是什么原理了


一个高人的解释,参考(http://terryjs.iteye.com/blog/767699)
ValueStack 对象,该对象封装了 Action 全部的输出信息。该对象是 Struts 2 使用的一个 ValueStack对象,可以通过 OGNL 表达式非常方便的访问该对象封装的信息。

ValueStack 有点类似于 Map 结构,但它比 Map 结构更加强大(因为它可以根据表达式来查询值)。Action 所以的属性都被封装到了 ValueStack 对象中,Action 中的属性名可以理解为 ValueStack 中 value 的名字

bohe_198878 2011-09-30
  • 打赏
  • 举报
回复
因为你有getSum()这个方法,其实struts2的标签<s:property value="XXX"/>就是调用getXXX方法来实现的,我也是偶然看到这个帖子的,但我不保证对的,具体怎么样最好去看struts2<s:property value=""/>标签的源码
echoxue 2011-09-30
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" namespace="/mystruts"
extends="struts-default">
<action name="sum" class="action.FirstAction">
<result name="positive">/positive.jsp</result>
<result name="negative">/negative.jsp</result>
</action>
</package>
</struts>
本文来自编程入门网:http://www.bianceng.cn/Programming/Java/201107/27511_3.htm
echoxue 2011-09-30
  • 打赏
  • 举报
回复
2.positive.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>显示代数和</title>
</head>
<body>
代数和为非负整数<h1><s:property value="sum" /></h1>
</body>
</html>
本文来自编程入门网:http://www.bianceng.cn/Programming/Java/201107/27511_4.htm
echoxue 2011-09-30
  • 打赏
  • 举报
回复

package action;
import com.opensymphony.xwork2.ActionSupport;
public class FirstAction extends ActionSupport
{
private int operand1;
private int operand2;
public String execute() throws Exception
{
if (getSum() >= 0) // 如果代码数和是非负整数,跳到positive.jsp页面
{
return "positive";
}
else // 如果代码数和是负整数,跳到negative.jsp页面
{
return "negative";
}
}
public int getOperand1()
{
return operand1;
}
public void setOperand1(int operand1)
{
System.out.println(operand1);
this.operand1 = operand1;
}
public int getOperand2()
{
return operand2;
}
public void setOperand2(int operand2)
{
System.out.println(operand2);
this.operand2 = operand2;
}
public int getSum()
{
return operand1 + operand2; // 计算两个整数的代码数和
}
}
本文来自编程入门网:http://www.bianceng.cn/Programming/Java/201107/27511_2.htm


sum.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>输入操作数</title>
</head>
<body>
求代数和
<br/>
<s:form action="mystruts/sum.action" >
<s:textfield name="operand1" label=" 操作数1"/>
<s:textfield name="operand2" label=" 操作数2" />
<s:submit value="代数和" />
</s:form>
</body>
</html>
本文来自编程入门网:http://www.bianceng.cn/Programming/Java/201107/27511_4.htm
bohe_198878 2011-09-30
  • 打赏
  • 举报
回复
你把你的Action类和jsp代码全贴上来好么 不然真看不懂
echoxue 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 java_devil 的回复:]
你这里的sum不是属性。。。只是你在action中取的一个参数的别名而已
[/Quote]
代码全部在URL中,能否指出是哪个参数的别名?
echoxue 2011-09-30
  • 打赏
  • 举报
回复
上面是全部的代码啊,从哪里可以看出定义过??

[Quote=引用 6 楼 java_devil 的回复:]
你这里的sum不是属性。。。只是你在action中取的一个参数的别名而已
[/Quote]
echoxue 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jianglang_a 的回复:]
sum可以是你当action继程的父类属性,也可能是某对象的属性
[/Quote]

但是我extends ActionSupport,我没有看到在哪里有这个sum属性啊。请其他人再解答一下
bohe_198878 2011-09-30
  • 打赏
  • 举报
回复
肯定定义过的 不是在action中就是在jsp中 不然怎么可能凭空出现这么个单词
绝世酱油瓶 2011-09-30
  • 打赏
  • 举报
回复
你这里的sum不是属性。。。只是你在action中取的一个参数的别名而已
echoxue 2011-09-30
  • 打赏
  • 举报
回复
看到上面的源代码了吗?根本没有定义此属性啊,


[Quote=引用楼主 echoxue 的回复:]
一个简单的struts例子,如下URL:
http://www.bianceng.cn/Programming/Java/201107/27511.htm

我的困惑是:这个
<s:property value="sum" />

sum在action类中没有定义此属性,页面怎么会取得到呢?

--------------------------------------------……
[/Quote]
亲努力啊 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jianglang_a 的回复:]
sum可以是你当action继程的父类属性,也可能是某对象的属性
[/Quote]
亲努力啊 2011-09-30
  • 打赏
  • 举报
回复
sum可以是你当action继程的父类属性,也可能是某对象的属性
加载更多回复(2)

81,122

社区成员

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

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