同样的代码,在main下能运行,在struts2的action中不能正常运行

louisgarcia 2011-09-17 06:55:20
我有个java类,在main下能正常运行

package com.haozhong.recharge.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.haozhong.recharge.bean.recharge.LianLianInterface;

/**
*
*/
public class Lianlian {
private MyHttp http = new MyHttp();
public String getCheckCode(String path){
//始初化验证码变量
String code = null;

for(int i = 0; i < 10; i++)
{
//图片的网址
String imgUrl = "http://www.lianlian.com/servlet/CheckCodeServlet";
//图片的本地路径
String imgSaveUrl = path+"/temp.jpg";
http.saveImg(imgUrl, imgSaveUrl);
code = unCode(imgSaveUrl);
if(code != null && code.equals("null") && code.length() == 4)
{
break;
}
try {
Thread.sleep(1000);

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
System.out.println("得到破解的验证码为="+code);
return code ;
}
public String login(String path ,LianLianInterface lianLianInterface) throws InterruptedException{
try {
String url = "http://www.lianlian.com/login";
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("userName",lianLianInterface.getLoginName()));
nvps.add(new BasicNameValuePair("checkCode", getCheckCode(path)));
nvps.add(new BasicNameValuePair("password", lianLianInterface.getPassword()));
String outdata = http.post(url, nvps);
if ( outdata.indexOf("短信验证码必须是") >= 0)
{
System.out.println("检测到返回的html代码中含有<短信码>字样,登陆成功");

}
else
{
System.out.println("检测到返回的html代码中没有含有<短信码>字样,登陆失败," +
"下面是返回的html代码,请查看失败原因");
System.out.println("返回的网址html字符="+outdata);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null ;

}
public String getCookie(String path,LianLianInterface lianLianInterface ){
try {
String outdata = login(path,lianLianInterface);
Pattern p = Pattern.compile("http(.)+?LLISP_ZJ/ISPSimulateLogin.do\\?params=(.)+?\"");
String url = "" ;
Matcher m = p.matcher(outdata);
if(m.find())
{
url = m.group();
url = url.substring(0, url.length()-1);
}

System.out.println("正则后的URL="+url);
http.get(url);
String cookies = http.getCookie( "llagtzj.lianlian.com.cn");
System.out.println("***************************");
System.out.println(cookies);

return cookies ;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null ;
}
public static void main(String[] args) throws Exception {
LianLianInterface lianLianInterface = new LianLianInterface();
lianLianInterface.setLoginName("15988641192");
lianLianInterface.setPassword("100860");
//ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext*.xml");
String path = "c:";
new Lianlian().getCookie(path,lianLianInterface);
}

/**
* 根据传入的图片本地路径破解验证码
* @param imgSaveUrl
* @return
*/
public String unCode(String imgSaveUrl)
{
String code = "";
try {
code = OCRUtil.recognizeValidation(imgSaveUrl);
//doSoming
//请完善破解验证码的代码
} catch (Exception e) {
// TODO: handle exception
}
return code;
}

public MyHttp getHttp() {
return http;
}

public void setHttp(MyHttp http) {
this.http = http;
}

}

这个带main方法的类已经确定能够正常运行
在struts2的action中

public String saveCookies() throws InterruptedException{
String path = "c:";
LianLianInterface lianLianInterface = new LianLianInterface();
lianLianInterface = lianLianInterfaceService.findByStatus();

String cookie = new Lianlian().getCookie(path,lianLianInterface);
lianLianInterface.setJsessionid(cookie.split("=")[1]);
rechargeService.updateLianLianInterface(lianLianInterface);
request.setAttribute("cookie", cookie);
return "saveCookies" ;

}

...全文
526 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkl888 2012-02-03
  • 打赏
  • 举报
回复
我也有同样问题。 怎么解决? 已经把jai_codec.jar, jai_core 和 jai_imageio-1.1 都放进project了,也放了进folder里。 还是不能。 囧
kkl888 2012-02-03
  • 打赏
  • 举报
回复
我也有同样问题。 怎么解决? 已经把jai_codec.jar, jai_core 和 jai_imageio-1.1 都放进project了,也放了进folder里。 还是不能。 囧
BigBird2012 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 magong 的回复:]
将imageio相关的jar包加到Tomcat Server的lib目录中(而不是放到WEB-INF/lib中)试试看。
参见
http://stackoverflow.com/questions/4828757/cannot-run-or-jai-imageio-or-imageio-getimagereadersbyformatname-cannot-get-objec
[/Quote]
我是这样的解决的
BigBird2012 2011-09-29
  • 打赏
  • 举报
回复
我今天也遇到你这个问题了,请问你解决了吗?困住我几个小时了
senlinzhiwang 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wokeke 的回复:]
关注,帮顶!
[/Quote]
+1
wokeke 2011-09-23
  • 打赏
  • 举报
回复
关注,帮顶!
magong 2011-09-23
  • 打赏
  • 举报
回复
三次回复,看来今天不是我一个人遇到CSDN的Bug了。

通常机器上还会有JRE的。
不行的话,设置好JAVA_HOME环境变量到你的JDK,从命令行启动tomcat试试看。
louisgarcia 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 magong 的回复:]
楼主用应用程序方式跑OK的是吧,
配置Tomcat让其使用你用来跑应用程序的那个JRE/JDK就行了。
[/Quote]
你好,我按照你的做法做了,还是不行
我电脑上只有一个JDK,myeclipse配置的就是这个JDK
louisgarcia 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 magong 的回复:]
楼主用应用程序方式跑OK的是吧,
配置Tomcat让其使用你用来跑应用程序的那个JRE/JDK就行了。
[/Quote]
你好,我按照你的做法做了,还是不行
我电脑上只有一个JDK,myeclipse配置的就是这个JDK
louisgarcia 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 magong 的回复:]
楼主用应用程序方式跑OK的是吧,
配置Tomcat让其使用你用来跑应用程序的那个JRE/JDK就行了。
[/Quote]
你好,我的电脑上只有一个JRE,myeclipse确实是这个JRE,真的很郁闷
magong 2011-09-18
  • 打赏
  • 举报
回复
刚重演了一下,发现只要确保Tomcat所使用的JRE/JDK中安装了jai-imageio,就没问题。
magong 2011-09-18
  • 打赏
  • 举报
回复
楼主用应用程序方式跑OK的是吧,
配置Tomcat让其使用你用来跑应用程序的那个JRE/JDK就行了。
louisgarcia 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 magong 的回复:]
刚重演了一下,发现只要确保Tomcat所使用的JRE/JDK中安装了jai-imageio,就没问题。
[/Quote]
您好,我把jai_imageio-1.1-alpha.jar这个包在tomcat/lib,和jdk1.6.0_18\jre\lib\ext下都放了一份,还是老样子,报同样的错
licip 2011-09-17
  • 打赏
  • 举报
回复
4,5楼说的有可能,你可以都试一试。
magong 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 louisgarcia 的回复:]

你好,我按照你说的做了,还是不行
[/Quote]
不行?还找不到jar包?那就只有试试看主动注册了,如下:

IIORegistry registry = IIORegistry.getDefaultInstance();
registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriterSpi());
registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.tiff.TIFFImageReaderSpi());
louisgarcia 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 magong 的回复:]
将imageio相关的jar包加到Tomcat Server的lib目录中(而不是放到WEB-INF/lib中)试试看。
参见
http://stackoverflow.com/questions/4828757/cannot-run-or-jai-imageio-or-imageio-getimagereadersbyformatname-cannot-get-objec
[/Quote]
你好,我按照你说的做了,还是不行
magong 2011-09-17
  • 打赏
  • 举报
回复
将imageio相关的jar包加到Tomcat Server的lib目录中(而不是放到WEB-INF/lib中)试试看。
参见
http://stackoverflow.com/questions/4828757/cannot-run-or-jai-imageio-or-imageio-getimagereadersbyformatname-cannot-get-objec
softroad 2011-09-17
  • 打赏
  • 举报
回复
没取到文件吧,打印下imageFile文件路径看看。
louisgarcia 2011-09-17
  • 打赏
  • 举报
回复
抛出异常的关键代码:
OCRUtil 这个类的

Iterator<ImageWriter> writers = ImageIO
.getImageWritersByFormatName("tiff");
ImageWriter writer = writers.next();

这两行代码,分别在main()方法和struts2的action两种情况下单步跟踪,发现在main()方法下,writers的next()是有值的,但是struts2的action情况下writers的next()是null,因此会抛出NoSuchElementException

想请教一下各位,这是什么情况 ????
紧急
louisgarcia 2011-09-17
  • 打赏
  • 举报
回复
抛出异常的类:

package com.haozhong.recharge.util;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
public class OCRUtil {
private static final Log logger = LogFactory.getLog(OCRUtil.class);
private static final String LANG_OPTION = "-l";
private static final String EOL = File.separator;
private static final String IMAGE_FORMAT = "jpg";

// public static String recognizeValidation(InputStream in) throws Exception {
public static String recognizeValidation(String imgUrl) throws Exception {
//File tmpFile = File.createTempFile("img", "." + IMAGE_FORMAT);
//File tmpFile = new File("c:/temp."+IMAGE_FORMAT);
// OutputStream out = new FileOutputStream(tmpFile);
File tmpFile = new File(imgUrl);
//IOUtils.copy(in, out);
// IOUtils.closeQuietly(out);
return format(recognizeText(tmpFile, IMAGE_FORMAT));
}

private static String format(String str) {
if (StringUtils.isBlank(str)) {
return null;
}
StringBuffer sb = new StringBuffer(str.length());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (Character.isDigit(c) || Character.isLetter(c)) {
sb.append(c);
}
}
return sb.toString();
}

public static String recognizeText(File imageFile, String imageFormat)
throws Exception {
File tempImage = createImage(imageFile, imageFormat);

File outputFile = new File(imageFile.getParentFile(), "output");
StringBuffer strB = new StringBuffer();

List<String> cmd = new ArrayList<String>();
cmd.add("D:/Program Files/Tesseract-OCR/tesseract.exe");
cmd.add("");
cmd.add(outputFile.getName());
cmd.add(LANG_OPTION);
cmd.add("eng");

ProcessBuilder pb = new ProcessBuilder();
pb.directory(imageFile.getParentFile());

cmd.set(1, tempImage.getName());
pb.command(cmd);
pb.redirectErrorStream(true);
Process process = pb.start();

int w = process.waitFor();

// delete temp working files
tempImage.delete();

if (w == 0) {
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(outputFile.getAbsolutePath() + ".txt"),
"UTF-8"));

String str;

while ((str = in.readLine()) != null) {
strB.append(str).append(EOL);
}
in.close();
} else {
String msg;
switch (w) {
case 1:
msg = "Errors accessing files. There may be spaces in your image's filename.";
break;
case 29:
msg = "Cannot recognize the image or its selected region.";
break;
case 31:
msg = "Unsupported image format.";
break;
default:
msg = "Errors occurred.";
}
tempImage.delete();
throw new RuntimeException(msg);
}

new File(outputFile.getAbsolutePath() + ".txt").delete();
// logger.info("图像识别结果:" + strB);
return strB.toString();
}

public static File createImage(File imageFile, String imageFormat) {
File tempFile = null;
try {
Iterator<ImageReader> readers = ImageIO
.getImageReadersByFormatName(imageFormat);
ImageReader reader = readers.next();

ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
reader.setInput(iis);
// Read the stream metadata
IIOMetadata streamMetadata = reader.getStreamMetadata();

// Set up the writeParam
TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(
Locale.US);
tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);

// Get tif writer and set output to file
Iterator<ImageWriter> writers = ImageIO
.getImageWritersByFormatName("tiff");
ImageWriter writer = writers.next();

BufferedImage bi = reader.read(0);
// bi = new ImageFilter(bi).changeGrey();
IIOImage image = new IIOImage(bi, null, reader.getImageMetadata(0));
tempFile = tempImageFile(imageFile);
ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);
writer.setOutput(ios);
writer.write(streamMetadata, image, tiffWriteParam);
ios.close();

writer.dispose();
reader.dispose();
} catch (Exception exc) {
exc.printStackTrace();
logger.error("异常:", exc);
}
return tempFile;
}

private static File tempImageFile(File imageFile) {
String path = imageFile.getPath();
StringBuffer strB = new StringBuffer(path);
strB.insert(path.lastIndexOf('.'), 0);
return new File(strB.toString().replaceFirst("(?<=\\.)(\\w+)$", "tif"));
}
}

加载更多回复(1)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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