在Action中用了get/set,但是没有放入值栈中去,放到session中也没反应

问题描述

CodeAction.javapackageAction;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.image.BufferedImage;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.imageio.stream.ImageOutputStream;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;publicclassCodeActionextendsActionSupport{/***http://465886163.iteye.com/blog/1189394*/privatestaticfinallongserialVersionUID=1L;privateStringcode1;privateByteArrayInputStreaminputStream;publicvoidsetInputStream(ByteArrayInputStreaminputStream){this.inputStream=inputStream;}publicByteArrayInputStreamgetInputStream(){returninputStream;}publicStringgetCode1(){returncode1;}publicvoidsetCode1(Stringcode1){this.code1=code1;}publicStringexecute()throwsException{//在内存中创建图象intwidth=85,height=20;BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//获取图形上下文Graphicsg=image.getGraphics();//生成随机类Randomrandom=newRandom();//设定背景色g.setColor(getRandColor(200,250));g.fillRect(0,0,width,height);//设定字体g.setFont(newFont("TimesNewRoman",Font.PLAIN,18));//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到g.setColor(getRandColor(160,200));for(inti=0;i<155;i++){intx=random.nextInt(width);inty=random.nextInt(height);intxl=random.nextInt(12);intyl=random.nextInt(12);g.drawLine(x,y,x+xl,y+yl);}//取随机产生的认证码(6位数字)StringsRand="";for(inti=0;i<6;i++){Stringrand=String.valueOf(random.nextInt(10));sRand+=rand;//将认证码显示到图象中g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成g.drawString(rand,13*i+6,16);}code1=sRand;System.out.println(code1);//将认证码存入SESSIONActionContext.getContext().getApplication().put("rand",sRand);//图象生效g.dispose();ByteArrayOutputStreamoutput=newByteArrayOutputStream();ImageOutputStreamimageOut=ImageIO.createImageOutputStream(output);ImageIO.write(image,"JPEG",imageOut);imageOut.close();ByteArrayInputStreaminput=newByteArrayInputStream(output.toByteArray());this.setInputStream(input);returnSUCCESS;}/**给定范围获得随机颜色*/privateColorgetRandColor(intfc,intbc){Randomrandom=newRandom();if(fc>255)fc=255;if(bc>255)bc=255;intr=fc+random.nextInt(bc-fc);intg=fc+random.nextInt(bc-fc);intb=fc+random.nextInt(bc-fc);returnnewColor(r,g,b);}}jsp页面<body><s:textfieldname="code"label="请输入验证码:"></s:textfield><s:propertyvalue="#application.rand"/><imgsrc="rand.action"onclick="changeValidateCode(this)"/><s:debug></s:debug></body>配置文件<actionname="rand"class="Action.CodeAction"><resulttype="stream"><paramname="contentType">image/jpeg</param><paramname="inputName">inputStream</param></result></action>

解决方案

解决方案二:
没有试过这种做法,不过直接访问servlet获取验证码的例子:http://blog.csdn.net/w4bobo/article/details/8259560
解决方案三:
你现在是把生成的验证码字符串赋值给了code1,你再jsp页面上直接调用就可以了<s:propertyvalue="code1"/>这样就可以获得你的验证码字符串了
解决方案四:
楼主这个代码是有放入值栈的,楼主你多刷新几次这个jsp就会看到你<s:propertyvalue="#application.rand"/>每次显示的验证码都是上一次的验证码。这个是因为楼主的jsp页面的顺序而导致的<s:propertyvalue="#application.rand"/><imgsrc="rand.action"onclick="changeValidateCode(this)"/><s:debug></s:debug>你是先显示application.rand后请求rand.action所以你第一次打开这个jsp页面的时候你先取这个application.rand还没请求当然就没有赋值到值栈。你刷新一下就会发现显示的是你上一次的rand
解决方案五:
我把jsp代码改成下面的就能拿到值,但是还是上一次的验证啊,想问一下,怎么才能拿到当前的结果呢<imgsrc="rand.action"onclick="changeValidateCode(this)"/><s:propertyvalue="#application.rand"/>
解决方案六:
2楼的亲故,code1他没有进入值栈
解决方案七:
那你debug进你的Action类看下看页面一加载的时候进你的验证码那个CodeAction了吗。然后你看在你的CodeAction返回(return)以前那个code1的值是多少。action中的参数市放在ValueStack中的,只要你在Action中有get方法那么在页面上就是可以获取的。希望能够帮到你

时间: 2024-09-23 17:28:47

在Action中用了get/set,但是没有放入值栈中去,放到session中也没反应的相关文章

ajax请求action后,数据存放在session中,jsp页面通过el获取数据,可是第一次登录总

问题描述 ssh项目中,我需要登陆某个页面(如a.jsp),通过onload来触发js函数(函数是ajax请求)请求到相应的action,处理完成后将数据存放到session对象里面,然后在a.jsp中用el表达式获取想要的数据,这是我的设计思路.可是问题来了,不知道为什么在打开浏览器第一次登录a页面时,a页面不会显示想要的数据,刷新后就有数据了,之后也正常.这是为什么了???我该如何解决这个问题了?或有什么好的办法可以实现登陆一个页面,页面上数据是从服务器端获取的,的方法吗? 解决方案 解决方

java-struts2拦截器怎么获取action值栈里属性的值

问题描述 struts2拦截器怎么获取action值栈里属性的值 利用反射可以说渠道private的属性 但是field.get获取到的值都是null 怎么才能获取到值 解决方案 使用ognl表达式就可以了. 解决方案二: 直接在网页上面添加struts标签.用OGNL表达式.直接获取.

eclipse rcp-eclipse RCP开发中如何在Activator中获取plugin.xml中配置的action

问题描述 eclipse RCP开发中如何在Activator中获取plugin.xml中配置的action action是在extensions里重写eclipse提供的标准扩展点:org.eclipse.ui.actionSets.想在Activator中获取此action对象并调用setEnable()方法,达到控制按钮的可用和禁用状态.望各位大神帮忙! 解决方案 目前我也不会,但是需要积分

ASP中关于action=""的表单传递的值request()延迟一次.

问题描述 ASP中关于action=""的表单传递的值request()延迟一次.

Extjs如何获取后台方法返回的值然后前台接收值再把此值放入action url里进行load加载

问题描述 Extjs如何获取后台方法返回的值然后前台接收值再把此值放入action url里进行load加载 前台://把上传的 文件发送到相应Action function upload(){ var tml = document.getElementById(""fileId""); if(tml.value == ''){ Ext.MessageBox.alert('提示''请选择需要上传文件'); return; } Ext.Ajax.request({ u

求解在SSH中,打开页面时引用action,并读取在调用action后session中数据

问题描述 求解在SSH中,打开页面时引用action,并读取在调用action后session中数据 解决方案 解决方案二:Mapmap=(Map)ActionContext.getContext().get(ActionContext.SESSION);Objectobj=map.get("sessionKey");解决方案三:引用楼主a76607401的回复: 求解在SSH中,打开页面时引用action,并读取在调用action后session中数据 我就是想知道咋个在页面中引用s

发送-C#中用Sendkeys向浏览器中的文本框中录入数据

问题描述 C#中用Sendkeys向浏览器中的文本框中录入数据 C#中用Sendkeys向浏览器中的文本框中录入数据,用发送tab切换输入框,为什么切换的时候不能一个一个切换?有的时候会跳过不定几个文本框 发送信息如下 Clipboard.SetText(languagecode); SendKeys.SendWait(""(^v)""); 发送tab如下 SendKeys.SendWait(""{TAB}""); 浏览器中意

一个页面可以得到两个不同action中的不同session.setAttribute(里面的值)吗

问题描述 如题一个页面可以得到两个不同action中的不同session.setAttribute(里面的值)吗现在的那个页面只可以得到其中一个action中的session,另一个却得不到是不是strut-xml里面要配点啥啊? 问题补充:xiaofancn 写道 解决方案 要想获取Session的值,给Session赋值的方法先执行.,能否贴出你的代码解决方案二:你的页面是怎么跳转的?解决方案三:<s:iterator value="#session.msg"> <

我用 ajax提交到后台action并在action中给session重新赋值,后返回页面success,session中的值不改变,为什么?

问题描述 我用ajax提交到后台action并在action中给session重新赋值,后返回页面success,session中的值不改变,为什么? 解决方案 解决方案二:画面刷新看看.解决方案三:引用1楼rui888的回复: 画面刷新看看. 不行的.刷新是不行的.解决方案四:给点代码吧,光说我们怎么看懂,你把session重新赋值?你把数据重新赋值并放到session作用域还不错,是不是这意思?解决方案五:ajax不是无刷新向后台获取数据吗,你不操作你获取的数据你重新赋值session有什么