Struts中,怎么在JSP里输出一个在其他包里写的验证码图片?

作者&投稿:养宽 (若有异议请与网页底部的电邮联系)
jsp生成的验证码图片怎么显示不出来,总是一个X框的东西,哪位高手指教下!~

可以在X的位置,右键属性,看看对应的url是否正确,这样,你首先可以直接访问url,然后,如果正常显示,再放到img标签里,就ok了,还问题,可以提出来,我帮你解决

1.在servlet或者action中获取存放在session里的图片验证码.
2.获得用户输入的验证码,然后跟从session里获得的验证码做比较,如果验证码和输入的不一致,则可以存放在一个变量里(前提是你用的是struts2框架,在最上面声明一个属性,类型是私有的,然后加set、get方法,然后把错误信息放在这个属性中),
如果是你是servlet中做判断的话,你可以把错误信息存放在request或者session中,存放在request的话,只能用转发,如果用重定向的话,在页面中取不出来数据.
3.在页面中取:
可以用request取
4.如果你是想在同一个页面中做判断的话.那也一样.只是在页面中加个脚本,然后其他步骤都差不多,从session中取出来和输入的验证码做判断,然后中间加上js脚本。

在注册页面上我们通常需要要做一个图片验证码来防止恶意注册。

实现如下:

开发环境:struts2+tomcat

1.HTML页面:
--------------------------------------------------------------------
你需要有一个验证码图片和一个输入框
验证码图片:

<img src="validateCode.action" alt="验证码"
name="vcodeImg" id="vcodeImg" align="absmiddle"
style="cursor: pointer;" title="看不清楚?换一张"
onclick="src='validateCode.action?s='+Math.random()"
onerror="this.onerror=null;this.src='validateCode.action?
s='+Math.random();" />

图片的src是一个链接:validateCode.action 对应struts.xml中的action
onclick事件是当图片上的验证码看不清楚时可以点击更改验证码;方法将更改img 的src的内容,s='+Math.random() 用来生
成随机字符串,浏览器将识别为一个新的链接地址。
onerror的功能与onclick的功能差不多。

输入框:
<input id="validateCode" name="validateCode"
type="text" maxlength="35" size="35"/>

2.struts.xml文件中的配置
-------------------------------------------------------------------
生成的验证码图片以及字符串的内容都可以在struts.xml中配置

<?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="strutsqs" extends="struts-default">

<action name="validateCode"
class="action.accounts.ValidateImageAction">
<param name="width">150</param>
<param name="height">35</param>
<param name="length">8</param>
<param name="randomString">
$0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</
param>
<result name="success" type="stream">
<param name="inputName">inputStream</param>
<param name="contentType">image/jpeg</param>
</result>
</action>

</package>

</struts>

3. action --> ValidateImageAction.java
------------------------------------------------------------------------
我修改了get方法,这样做是为了防止struts.xml中如果没有配置,相当于默认值。

package action.accounts;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;

import com.opensymphony.xwork2.ActionContext;
import function.RandomImage;

/**
* <pre>
* 产生图片验证码
* </pre>
* Login Page
* @author Michael Zheng 2008-11-18
*/
public class ValidateImageAction {

private InputStream inputStream;

private String randomString; //图片上的字符串
private int length; //图片上字符的个数
private int width; //图片的宽度
private int height; //图片的高度

public String getRandomString() {
if(randomString == null){
randomString =
"$0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
}
return randomString;
}

public void setRandomString(String randomString) {
this.randomString = randomString;
}

public int getLength() {
if(length == 0){
length = 6;
}
return length;
}

public void setLength(int length) {
this.length = length;
}

public int getWidth() {
if(width == 0){
width = 80;
}
return width;
}

public void setWidth(int width) {
this.width = width;
}

public int getHeight() {
if(height == 0){
height = 35;
}
return height;
}

public void setHeight(int height) {
this.height = height;
}

public InputStream getInputStream() {
return inputStream;
}

public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}

public String execute(){

RandomImage validateImage = new RandomImage(getRandomString(),
getLength(), getWidth(), getHeight());

ByteArrayOutputStream bos =new ByteArrayOutputStream();

try {

ImageOutputStream ios = ImageIO.createImageOutputStream(bos);
ImageIO.write(validateImage.getValidateImage(), "JPEG", ios);

inputStream = new ByteArrayInputStream(bos.toByteArray());

bos.close();

} catch (IOException e) {

e.printStackTrace();
}

Map session = ActionContext.getContext().getSession(); //获得
session

session.put("validateString", validateImage.getValidateString
().toLowerCase());
//将验证码转小写放入session

return "success";
}

}

4. function.RandomImage生成图片工厂类
------------------------------------------------------------------
package function;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;

public class RandomImage {

private String validateString; //生成的验证字符串
private BufferedImage validateImage; //生成的验证图片

private String randomString; //图片上的字符串
private int length; //图片上字符的个数
private int width; //图片的宽度
private int height; //图片的高度

public RandomImage(String randomString, int length, int width, int
height){
this.randomString = randomString;
this.length = length;
this.width = width;
this.height = height;

}

//获取生成的验证字符串
public String getValidateString() {
if(validateString==null){
getValidateImage();
}
return validateString;
}

//获取生成的验证图片
public BufferedImage getValidateImage(){

BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);// 在内存中创建图象

Graphics2D raphics = (Graphics2D) image.getGraphics();// 获取图形上下


raphics.setColor(Color.WHITE);// 设定为白色背景色

raphics.fillRect(0, 0, width, height);

raphics.setFont(new Font("Times New Roman",Font.ITALIC,28));//设
定字体 style:HANGING_BASELINE

raphics.setColor(getRandColor(160,200));//给定范围获得随机颜色

Random random = new Random(); //生成随机类

//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
for (int i=0;i<255;i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
//int xl = random.nextInt(12);
//int yl = random.nextInt(12);
raphics.drawLine(x,y,x,y);
}

// 取随机产生的认证码(length位数字)
String rand = "";
StringBuffer vString = new StringBuffer();
for (int i=0;i<length;i++){

rand=String.valueOf(randomString.charAt(random.nextInt
(randomString.length())));
vString.append(rand);

raphics.setColor(Color.BLACK);//设置为黑色字体
//raphics.rotate(0.01,20,20);
raphics.drawString(rand, 15*i+10, 25);

}

validateString = vString.toString(); // 将认证码存入 validateString

raphics.dispose(); //图象生效

return image;
}

private Color getRandColor(int fc,int bc){ //给定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}

}

注:以上类及包名如有不对请自行修改,其核心代码都已在上面,细节部分可自行加上。
没有写更多细节的注释,太烦了,如果你看不懂,那就应该再好好去看看Core Java了。


梅毒,治疗过程中,抗体阳性,TRUST(1:8)
1、梅毒治疗完以后三个月复查一次就可以了,治疗完马上进行化验没有什么意义。2、滴度比初次化验高了一个最大的可能是由于实验室操作误差引起的,不需要担心。3、总的来说,目前正常生活就可以了,三个月以后复查结果出来了再进行判断。4、最后祝早日恢复健康!!

Trust Union信用联盟链在现实生活中究竟如何落地应用呢?
Trust Union在DAPP端建立了适应于多样化的用户金融关系应用场景服务,包括个人信用借贷、个人抵押借贷、个人资产与债务管理、债权资产流动、个人信用管理等场景。比如,在信用联盟链的平台上,熟人之间的借贷将变得简单安全,双方信用及借贷行为上链后将公布在每一个节点上,一旦一方有违约记录,就会在个人信用...

防火墙配置中,为什么要配置trust口和untrust口?
当从trust口到untrust口有主动访问时,防火墙会保存这个连接信息,回应数据从untrust口到trust方向,防火墙会放行,但是不会允许untrust口到trust口的主动访问。(有点象你在家能访问互联网的网站,当在互联网不能访问你的电脑一样。)如何设置windows防火墙:1、打开“控制面板”,Win7中在“开始”中点击“...

Belive in yourself中in可以去掉吗?Trust me和Trust in me哪个对_百度...
I believe in him.(=I trust him )我相信他是一个可以信得过的人。(即:我信任他) 在英美人的谈话中,经常可以听到这么一句口头禅——Believe me:这是一个用以表示希望对方相信自己谈话的口头语,它相当于I bet或 Take my word for it。例: Believe me,you will get well very soon...

生命中不会再信任别人.英语怎么写
I will not trust anyone in my whole life.

信托与私募中的英文简称怎么解释,比如TOT,FOT,VC,PE等等,希望全面一些...
TOT(TRUST OF TRUST)信托中的信托,就是发行一个信托产品,募集的资金投资别的信托产品。\\nFOT(FUND OF TRUST)信托中的基金,就是成立一个基金,募集的资金投资固定收益类的信托产品。FOT和TOT最大的区别,是一个是基金(FOT),一个是信托(TOT),相同点都是投资固定收益类的信托产品。FOT的收益...

我希望某个时候能见到他们用英语怎么写?
英:I hope to see them sometime.中:我希望某个时候能见到他们。重点词汇 希望 hope ; wish ; expect ;luck ; prospect ; trust ; would ; will not ; will ; like 时候 time ; season ; weather ; hour ; when ; date 见到 see ; meet ; perceive ...

digicert 怎么删掉这个证书
SSL证书删除方法:一、Apple上删除SSL证书Apple上删除SSL证书时,需要具有管理员访问权限才能访问信任存储区。1、选择Finder后,单击Go并选择Utilities(或者按Shift + Command + U)2、双击KeyChain Access,选择System Roots。找到要删除的根证书,然后双击它。3、在弹出的窗口中,在“Trust”下,选择“...

strust2中配置了自定义的拦截器后,出现一下错误
interceptor少写了一行,不管你自己写了多少个拦截器,首先必须应用他默认的拦截器。default

如何在matlab中将Trust-region-reflective算法换为 interior-point算法...
你这不是明显不对吗。[x,fval]=fmincon(fun,x0,[],[],Aeq,beq,VLB,VUB,@mycon,options)没有成功调用f函数,而是调用了fun,fun函数可能是是保存在你当前路径的一个函数,所以怎么改变u都是没用的 改为 f=@0.0292*x(1)^2+0.1708*x(2)^2+0.0578*x(3)^2+0.0748*x(1)*x(2)+...

祥云县19583014115: struts1里怎么把值传到jsp里面? -
刘娟联邦: 第一种方式:通过request、session、application作用域传递参数值 如果想让这个值只在Action类与页面之间有效,那么可以使用request.setAttribute(key,value);比如:String name=“tom”;想把name的值传递到jsp页面,request.setAttribute...

祥云县19583014115: struts1.x中如何从数据库中取出数据并显示到JSP上 -
刘娟联邦: 用struts1的时候,在action里得到了上一层返回的结果,然后放到request或者session或者application中,在jsp页面通过EL表达式读出来

祥云县19583014115: 用Struts1标签或Struts2标签在jsp中循环显示一个对象list(ArraList<String>) -
刘娟联邦: Struts1中可以用logic:iterate循环输出list:示例:<logic:iterate id="item" name="pageList"><tr class="list"><td align="center"><bean:write name="item" property="empId" /> </td><td align="center"> <bean:write name="item" ...

祥云县19583014115: Struts1.2怎么在一个JSP循环输出 -
刘娟联邦: 可以不用Struts的标签 可以用 jstl的标签 或者用for循环

祥云县19583014115: 如何在jsp页面中使用struts2标签 -
刘娟联邦: 当然是先导入s标签库.百度“jsp导入Struts标签库”即可

祥云县19583014115: struts2中怎么把action中的值传递到jsp页面 -
刘娟联邦: 方法如下:1.用request.setAttribute()方法,不过只适用于请求转发,不可用于重定向2.用session.setAttribute()方法3.用struts2标签,在Java类中定义这个值对象,然后赋值,并且给出setter和getter方法,在jsp页面中,使用 来获取

祥云县19583014115: 一个用户修改自己信息的jsp页面,用struts2怎么输出用户原有的信息,求高手指教.不甚感激. -
刘娟联邦: 现根据id查询 load出你user的对象,然后用struts2的标签比如:用户名字显示在jsp上,就行了.属性多几个就写几个.

祥云县19583014115: 各位大侠有谁知道如何让我的struts标签在这个JS中可以使用 -
刘娟联邦: 如果有学javaEE,请去重温servlet、jsp的基础知识.弄清楚基本概念,面对这样的问题…… 1. struts标签写在jsp里,jsp是服务器端代码,jsp既是servlet,编译之后为class字节码 2. javascript为浏览端解释执行代码在客户端,写在jsp里的...

祥云县19583014115: 在struts2中怎么将一个Arraylist中的所有数据值显示到jsp页面上 -
刘娟联邦: 用jsp的forecho标签,或者是循环遍历,用response.getWriter.print()输出内容到jsp页面即可.

祥云县19583014115: struts标签在jsp中使用 -
刘娟联邦: 一般你写uri=“这里用 Alt+/ ”,就会出提示,如果提示里面有struts-tags ,那么证明的struts配置是正确的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网