非struts高手不能解决:在action类中如何获取jsp里的一个标签对象
有那为struts高手知道,在action类中如何获取jsp里的一个标签对象,比如一个image标签.我要实现的功能是这样的
在jsp页面里有form标签,form中有image 标签 :<html:image property="image1" src="abc.gif"/>,submit标签.当提交了表单后.页面有返回到本页面.希望在返回后
image 标签的 src 属性能被重新设定为 123.gif.我的想法是在action里获得image标签对象,然后利用image标签对象.setSrc("123.gif") 来设定,然后返回.这种想法可以吗?能获得image标签对象吗?怎样获得image标签对象?或者有没有别的方法.请各位指点迷津.多谢了
问题点数:80、回复次数:33Top
1 楼northwolf_sky(似水微蓝)回复于 2006-03-01 14:30:49 得分 0
知道者.给点代码啊.Thank you very muchTop
2 楼interpb(曾曾胡,深怕情多累美人!)回复于 2006-03-01 14:35:58 得分 0
我想没有必要这么复杂吧
提交表单后,回到原来的页面
你可以,自己写一段逻辑判断是不是提交后
然后显示不同图片Top
3 楼zhakeer(扎科尔)回复于 2006-03-01 14:39:07 得分 0
action和jsp之间没有直接的联系,取不到jsp内的对象,只能通过session、request等内建变量传递数据,你可以在action内使用request.setAttribute()设值,然后在jsp页面中取出来Top
4 楼northwolf_sky(似水微蓝)回复于 2006-03-01 15:03:41 得分 0
回复interpb(曾曾胡) :我的问题的关键在于我必须用到标签自身的setXXX()方法来重新设定原来的某一标签的属性.
Top
5 楼sheep219(sheep219)回复于 2006-03-01 15:08:17 得分 0
传个数据过去,回来判断,再改一下图像。不要想太多啊。:)Top
6 楼sheep219(sheep219)回复于 2006-03-01 15:09:02 得分 0
不要用标签就可以了。不是说struts一定要用标签的。Top
7 楼interpb(曾曾胡,深怕情多累美人!)回复于 2006-03-01 15:10:56 得分 0
那你就把这个数据传过来
然后set不久可以了吗Top
8 楼northwolf_sky(似水微蓝)回复于 2006-03-01 15:12:10 得分 0
回复zhakeer(扎科尔):
在action内使用request.setAttribute()设值,然后在jsp页面中取出来做得到.我的问题是在jsp页面上 必须用tag.setXXX(param)设定,关键在于在jsp 在样取得一个tag实例然后set
Top
9 楼northwolf_sky(似水微蓝)回复于 2006-03-01 15:14:05 得分 0
怎么set,标签对象是有set方法的.但在set以前怎样写?
Top
10 楼northwolf_sky(似水微蓝)回复于 2006-03-01 15:16:05 得分 0
我的问题是,必须用标签而且在提交以后用标签的setXXX来修改标签的属性值.Top
11 楼jimmybinbin()回复于 2006-03-01 15:20:52 得分 0
给你个参考:
<logic:iterate name="log" id="log" type="com.*.FormBean">
<%String logC = log.getLogC();%>
</logic>
注:我封装在这个循环里的对象就是那个FORMBEAN!Top
12 楼jfy3d(剑事 http://www.migti.com)回复于 2006-03-01 15:23:17 得分 0
反过来想啊 jsp从action取图片路径Top
13 楼northwolf_sky(似水微蓝)回复于 2006-03-01 15:26:13 得分 0
<%String logC = log.getLogC();%> 是什么意思?
Top
14 楼jimmybinbin()回复于 2006-03-01 15:30:20 得分 0
<%String logC = log.getLogC();%> 是什么意思?
就是FORMBEAN里面定义的方法啊,SET 和GET方法啊Top
15 楼northwolf_sky(似水微蓝)回复于 2006-03-01 15:39:24 得分 0
你没明白我的意思.我的意思是在当页面提交了以后设定某一标签的某种属性值.比如image标签的src .而且必须用到 image对象的setSrc(param);现在的问题是怎样对原来的标签进行这种操作,要怎样才能获得当前image标签的实例呢Top
16 楼zhakeer(扎科尔)回复于 2006-03-01 15:59:39 得分 0
最简单的写法:
action:
request.setAttribute("aaa","aaa.gif");
jsp:
<html:image property="..." src="<%=request.getAttribute("aaa")%>"/>
需要什么判断可以再往上加,不想用<%...%>的话,可以用el表达式Top
17 楼northwolf_sky(似水微蓝)回复于 2006-03-01 16:07:53 得分 0
回复:zhakeer(扎科尔)
最简单的写法:
action:
request.setAttribute("aaa","aaa.gif");
jsp:
<html:image property="..." src="<%=request.getAttribute("aaa")%>"/>
需要什么判断可以再往上加,不想用<%...%>的话,可以用el表达式
==========================
我这里不能这样做啊,老兄
Top
18 楼zhmain(小胖)回复于 2006-03-01 16:20:59 得分 0
在action中
request.setAttribute("flag","x.gif");
jsp中
<logic:present name="flag" scope="request">
<logic:equal name="flag" value="x.gif" scope="request">
set
</logic:equal>
</logic:present>Top
19 楼zhakeer(扎科尔)回复于 2006-03-01 16:23:34 得分 0
为什么Top
20 楼northwolf_sky(似水微蓝)回复于 2006-03-01 16:43:02 得分 0
我们在做一个标签库的测试.这个标签库是我们继承nested的,个别方法我们复写了.例如 image标签我可以给大家代码
/**
* プロジェクト名 :DENSO
* 内部設計担当者 :胡正元
* 作成日 :2006/1/06
*
* バージョン 更新日 開発担当者(承認者) 更新内容
* 01.00.00 2006/1/09 田志軍 新規作成
*
* (c) Copyright XXXXXXXX, Ltd. XXXX. All rights reserved.
*/
package com.globaldenso.applibase.a000a01000c.taglib;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.taglib.html.Constants;
import org.apache.struts.taglib.nested.NestedPropertySupport;
import org.apache.struts.taglib.nested.html.NestedImageTag;
import org.apache.struts.util.ResponseUtils;
import com.globaldenso.applibase.a000a01000c.action.A000C01000BaseValidatorForm;
import com.globaldenso.applibase.a000a01000c.misc.A000C01000StringUtil;
/**
* イメージ表示タグクラス<br>
* StrutsからNestedImageTagクラスを継承する<br>
*
* ImageTagは以下の機能を有する.<br>
* (1)属性を追加<br>
* (2)サニタイジングを行う<br>
* サニタイジングの対象とする文字は,「<」「>」「&」「"」「'」とする<br>
* @author 田志軍
* @version 01.00.00
*/
public class A000C01000ImageTag extends NestedImageTag
implements NestedPropertySupport {
/**
* 終了タグを作成する<br>
* タグの生成時に指定されたフィールドに属性を追加する親クラスのgetElementCloseを呼び出す<br>
*
* @param なし
* @return 組み合わせったStrings
* @throws なし
*/
protected String getElementClose() {
/* 終わる標識を保存するStringBufferを声明する */
StringBuffer sb = new StringBuffer();
/* 動的追加の組み合わせったStringを声明する */
String attribute = null;
// ************************************************** //
// 1. コンテキストからリクエストを取得する
//<INPUT>Context
// ************************************************** //
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
// ************************************************** //
// 2. リクエストからFormを取得する
//<INPUT>HttpServletRequest
// ************************************************** //
A000C01000BaseValidatorForm form = (A000C01000BaseValidatorForm) request.getAttribute(Constants.BEAN_KEY);
// ************************************************** //
// 3. Formから追加の対象を取得する
// ************************************************** //
HashMap mapAttribute = form.getAttribute();
// ************************************************** //
// 4. 追加の対象を遍歴して,一つ循環中に,親クラスのgetPropertyを呼ぶ出して
// 取得したnameがキーとして,
// propertyキーとしてとvalueを持つHashMapを取得して,
// html言語(property="value")の形式にして,StringBufferに追加する
// ************************************************** //
if (mapAttribute != null) {
/* propertyとnameを持つHashMapを取得する */
HashMap mapProperty = (HashMap) mapAttribute.get(getProperty());
/* Stringを組み合わせる */
attribute = A000C01000StringUtil.getTagPropertyString(mapProperty);
/* StringBufferに以上組み合わせったStringを追加する */
sb.append(attribute);
}
// ************************************************** //
// 5. 親クラスでのgetElementCloseを呼び出し,戻されたStringをStringBufferに追加する
// ************************************************** //
sb.append(super.getElementClose());
// ************************************************** //
// 6. 組み合わせたStringBufferからStringを取得し,戻る
// ************************************************** //
return sb.toString();
}
/**
* Altをセット <br>
* サニタイジングを行いて,altをセットする
*
* @param String alt
* @return void
* なし
* @throws なし
*/
public void setAlt(String alt) {
// ************************************************** //
// 1. RequestUtilsのフィルタを使って,altをフィルタして,
// パラメータとして親クラスでのsetAltを呼び出す
// ************************************************** //
super.setAlt(ResponseUtils.filter(alt));
}
/**
* Srcをセット <br>
* サニタイジングを行いて,srcをセットする
*
* @param String src
* @return void
* なし
* @throws なし
*/
public void setSrc(String src) {
// ************************************************** //
// 1. RequestUtilsのフィルタを使って,srcをフィルタして,
// パラメータとして親クラスでのsetSrcを呼び出す
// ************************************************** //
super.setSrc(ResponseUtils.filter(src));
}
}
Top
21 楼northwolf_sky(似水微蓝)回复于 2006-03-01 16:46:53 得分 0
上面Method setSrc() 对父类进行了复写.我现在要测试方法setSrc(),我们的测试是一个web应用来测,将来直接看页面解析后的html souceTop
22 楼zhakeer(扎科尔)回复于 2006-03-01 17:04:55 得分 0
上面Method setSrc() 对父类进行了复写.我现在要测试方法setSrc(),我们的测试是一个web应用来测,将来直接看页面解析后的html souce
-----------------------------------------------
不明白这和你的要求有什么关系,如果仅仅是测试Method setSrc(),直接在jsp内用标签就可以了,不需要在action里直接调用啊Top
23 楼northwolf_sky(似水微蓝)回复于 2006-03-01 17:14:01 得分 0
测试流程是这样一来的.页面第一次打开显示image 图片,提交后此image标签显示另一个图片,要通过setSrc() 指定图片名Top
24 楼northwolf_sky(似水微蓝)回复于 2006-03-01 17:16:08 得分 0
现在的问题是怎样在使用setSrc,这一代码该怎样写.怎样来控制页面上image标签Top
25 楼northwolf_sky(似水微蓝)回复于 2006-03-01 17:19:06 得分 0
setSrc(),只是测试的一个case而已Top
26 楼zhakeer(扎科尔)回复于 2006-03-01 17:19:26 得分 0
标签<html:image property="image1" src="abc.gif"/>中的src属性会自动调用Method setSrc(),你用eclipse、intellij这些编辑器的debug工具调试一下就知道了
Top
27 楼northwolf_sky(似水微蓝)回复于 2006-03-01 17:26:26 得分 0
我当然知道,也可以正常显示.现在是setSrc 方法复写了要测,用web应用该怎么测Top
28 楼northwolf_sky(似水微蓝)回复于 2006-03-01 17:27:21 得分 0
zhakeer(扎科尔) ,谢了Top
29 楼northwolf_sky(似水微蓝)回复于 2006-03-01 18:53:39 得分 0
绝望了
Top
30 楼doway(john)回复于 2006-03-01 19:28:33 得分 0
楼主不明白基本的工作原理啊。
Web 容器是一种框架结构,框架的一个基本原理被称为反向控制,也叫好莱坞原则——你不要给我打电话,我会打给你。以代码来说,就是你不要调用我,我会调用你的。
应用服务器是整个 J2EE 框架的主人,应用服务器接到请求,开始调用相应的代码,所有的 Servlet 和 JSP 都是被它调用的。在 Struts 中,真正的 Servlet 只有一个,就是写在 web.xml 中的那个,通常称之为元控制器。元控制器又是 Struts 这个框架的主人,我们写的 Action 是由它调用的。
元控制器的主流程中,如果我们采用正常的流程时,主流程首先会将请求交给 Action 处理,这时候,JSP 中的标签尚未构建呢,又怎么可能访问它们呢?
或者楼主会问,为什么尚未构建?JSP 将会被编译为一个 Servlet,JSP 页面中的大部分代码,都处于该 Servlet 的 doGet/doPost 方法中,标签实际上是一些类,我猜想这些类将在该方法中被实例化,这是最自然不过的方式。如果是这样,那么楼主就是想在主流程的前边调用的一个方法中,试图访问该流程后边将要调用的一个方法中的局部变量。那是不可能的,不是吗?
即使标签不是局部变量,而是 JSP 编译后的 Servlet 的实例成员,楼主要想访问它们,也必须首先获得对那个编译出来的 Servlet 的实例的引用。有可能吗?至少我是从未听说过的。
最后,怪异的需求往往都是由于忽视基本工作原理导致的。
:)
Top
31 楼northwolf_sky(似水微蓝)回复于 2006-03-02 11:25:08 得分 0
不是不可以,本人已经实现了.如下
<%
if(session.getValue("SubmitAready") == null) {
%>
<denso:ImageTag property="image1" src="/DensoTagSampleApp/images/jituan.gif" />
<%
} else {
String strSrc = new String("/DensoTagSampleApp/images/DZ1.JPG");
com.globaldenso.applibase.a000a01000c.taglib.A000C01000ImageTag imageTag = (com.globaldenso.applibase.a000a01000c.taglib.A000C01000ImageTag) _jspx_tagPool_denso_ImageTag_src_property_nobody.get(com.globaldenso.applibase.a000a01000c.taglib.A000C01000ImageTag.class);
imageTag.setPageContext(pageContext);
imageTag.setParent((javax.servlet.jsp.tagext.Tag) _jspx_th_wacs$1html_form_0);
imageTag.setProperty("image1");
imageTag.setSrc(strSrc);
int jspx_eval_denso_ImageTag_1 = imageTag.doStartTag();
if (imageTag.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
return;
_jspx_tagPool_denso_ImageTag_src_property_nobody.reuse(imageTag);
}
%>Top
32 楼doway(john)回复于 2006-03-02 13:24:45 得分 0
GX 一个先。
但是这代码太难看了,不只是样子难看。:)
Top
33 楼lifecat0626(大笨笨猫)回复于 2006-03-02 14:12:45 得分 0
返回的时候进行刷新,就会恢复到初始状态的Top




