项目中常用到的第三发方ar包参考

目录结构

       1:guavajar(基于java1.6的类库集合的扩展项目)

        2:pdfbox-app.jar和itext.jar(PDF处理)

        3:Java读写CSV之SuperCSV

4:Batik (使用svg格式图片来实现各种功能)     ---内容太多未包含
5:JFreeChart和jcommon使用
6:bcmail-jdk14.jar和bcprov-jdk14.jar
7:commons-net(FTP操作)
8:jline-2.11.jar(java输入自动补全)
9:selenium 2.0(用于支持自动化测试)
10:WebDriver (比selenium 2.0 更先进的自动化测试)



Guava学习笔记:Google Guava 类库简介
  Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁,让你工作更加轻松愉悦。下面我们就开启优雅Java编程学习之旅!
  项目相关信息:
  官方首页:http://code.google.com/p/guava-libraries
  官方下载:http://code.google.com/p/guava-libraries/downloads/list
  官方文档:http://docs.guava-libraries.googlecode.com/git/javadoc
                    http://www.ostools.net/apidocs/apidoc?api=guava
  源码包的简单说明: 
  com.google.common.annotations:普通注解类型。 
  com.google.common.base:基本工具类库和接口。 
  com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。 
  com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。 
  com.google.common.eventbus:发布订阅风格的事件总线。 
  com.google.common.hash: 哈希工具包。 
  com.google.common.io:I/O工具包。 
  com.google.common.math:原始算术类型和超大数的运算工具包。 
  com.google.common.net:网络工具包。 
  com.google.common.primitives:八种原始类型和无符号类型的静态工具包。 
  com.google.common.reflect:反射工具包。 
  com.google.common.util.concurrent:多线程工具包。
  类库使用手册:
  一.  基本工具类:让使用Java语言更令人愉悦。
  1. 使用和避免 null:null 有语言歧义, 会产生令人费解的错误, 反正他总是让人不爽。很多 Guava 的工具类在遇到 null 时会直接拒绝或出错,而不是默默地接受他们。
  2. 前提条件:更容易的对你的方法进行前提条件的测试。
  3. 常见的对象方法: 简化了Object常用方法的实现, 如 hashCode() 和 toString()。
  4. 排序: Guava 强大的 "fluent Comparator"比较器, 提供多关键字排序。
  5. Throwable类: 简化了异常检查和错误传播。
  二.  集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知的部分。
  1. Immutable collections(不变的集合): 防御性编程, 不可修改的集合,并且提高了效率。
  2. New collection types(新集合类型):JDK collections 没有的一些集合类型,主要有:multisets,multimaps,tables, bidirectional maps等等
  3. Powerful collection utilities(强大的集合工具类): java.util.Collections 中未包含的常用操作工具类
  4. Extension utilities(扩展工具类): 给 Collection 对象添加一个装饰器? 实现迭代器? 我们可以更容易使用这些方法。
  三.  缓存: 本地缓存,可以很方便的操作缓存对象,并且支持各种缓存失效行为模式。
  四.  Functional idioms(函数式): 简洁, Guava实现了Java的函数式编程,可以显著简化代码。
  五. Concurrency(并发):强大,简单的抽象,让我们更容易实现简单正确的并发性代码。
  1. ListenableFuture(可监听的Future): Futures,用于异步完成的回调。
  2. Service: 控制事件的启动和关闭,为你管理复杂的状态逻辑。
  六. Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining, padding 等操作。
  七. Primitives: 扩展 JDK 中未提供的对原生类型(如int、char等)的操作, 包括某些类型的无符号的变量。
  八. Ranges: Guava 一个强大的 API,提供 Comparable 类型的范围处理, 包括连续和离散的情况。
  九. I/O: 简化 I/O 操作, 特别是对 I/O 流和文件的操作, for Java 5 and 6.


  十. Hashing: 提供比 Object.hashCode() 更复杂的 hash 方法, 提供 Bloom filters.


  十一. EventBus: 基于发布-订阅模式的组件通信,但是不需要明确地注册在委托对象中。


  十二. Math: 优化的 math 工具类,经过完整测试。


  十三. Reflection: Guava 的 Java 反射机制工具类。


Apache PDFbox快速开发指南   操作pdf文件
作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs
一、介绍
Apache PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容。Apache PDFBox还包含了数个命令行工具。
Apache PDFbox于前不久发布了最新的1.8.2版。
二、特征
Apache PDFBox主要有以下特征:
1)文本提取:从PDF文档中提取文本。
2)合并&分割:可以把多个PDF文档合并成单个,也可以把单个PDF分拆成多个PDF文档。
3)表单填充:可以从PDF表单中提取数据,或者是填充PDF表单。
4)PDF/A验证:验证PDF文档是否满足PDF/A ISO标准。
5)PDF打印:把PDF文档输出到打印机——利用了Java的打印API。
6)PDF转换:可以把PDF文档转换成映像文件。
7)PDF创建:可以从头创建新的PDF文档。
8)集成Lucene搜索引擎:Lucene搜索引擎与PDF索引相集成。
三、开发实战
Apache PDFbox既然是PDF工具库,那么最重要的例子就是用它创建一个PDF文档。下面我们开始这一历程。
1. 创建Java项目
在Eclipse下创建一个Java项目,项目名为PDFboxDemo。
2. 下载PDFbox包
地址:
1)pdfbox-1.8.2.jar
地址:http://archive.apache.org/dist/pdfbox/1.8.2/pdfbox-1.8.2.jar
说明:满足一般的PDF操作需求。
2)pdfbox-app-1.8.2.jar
http://archive.apache.org/dist/pdfbox/1.8.2/pdfbox-app-1.8.2.jar
说明:PDFbox的多个命令行的工具包。
3)fontbox-1.8.2.jar
地址:http://archive.apache.org/dist/pdfbox/1.8.2/fontbox-1.8.2.jar
说明:PDF使用的字库包
因此,本例使用1、3项即可。

3. 创建类文件
先创建chszs.pdf源码包,在此包内创建类文件CreatePDF.java。
[java] view plain copy print?
package chszs.pdf;  
 
//import java.io.File;  
import java.io.IOException;  
 
import org.apache.pdfbox.exceptions.COSVisitorException;  
import org.apache.pdfbox.pdmodel.PDDocument;  
import org.apache.pdfbox.pdmodel.PDPage;  
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;  
import org.apache.pdfbox.pdmodel.font.PDFont;  
//import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;  
import org.apache.pdfbox.pdmodel.font.PDType1Font;  
 
public class CreatePDF {  
   public static void main(String[] args) throws IOException{  
       PDDocument document = new PDDocument();  
       PDPage page = new PDPage();  
       document.addPage(page);  
         
//      PDFont font = PDTrueTypeFont.loadTTF(document, new File("SIMSUN.TTC"));  
       PDFont font = PDType1Font.HELVETICA_BOLD;  
         
       PDPageContentStream contentStream = new PDPageContentStream(document, page);  
       contentStream.beginText();  
       contentStream.setFont(font, 14);  
       contentStream.moveTextPositionByAmount(100, 700);  
       contentStream.drawString("Hello World");  
//      contentStream.drawString("中文");  
       contentStream.endText();  
         
       contentStream.close();  
         
       try {  
           document.save("E:/test.pdf");  
       } catch (COSVisitorException e) {  
           e.printStackTrace();  
       }  
       document.close();  
   }  
}  

执行程序,在磁盘E盘产生test.pdf文件。

总结说明:至Apache PDFbox 1.8.2版,仍然不支持中文PDF的创建,比iText的功能要弱很多。



Java读写CSV之SuperCSV
博客分类: 
Java
javacsvSuperCSV 
Super CSV是一个速度奇快、免费跨平台的 CSV 格式数据的读写库,可以方便的处理对象、Map、列表的读写操作,以及自动化的类型转换和数据检查功能。 

http://supercsv.sourceforge.net/ 

版本:SuperCSV-1.52.jar 

1、读CSV(CsvBeanReader/CsvListReader/CsvMapReader) 
Java代码  
InputStreamReader freader = new InputStreamReader(new FileInputStream(  
       new File("csv/test1.csv")), "GB2312");  
 
ICsvBeanReader reader = new CsvBeanReader(freader,  
       CsvPreference.EXCEL_PREFERENCE);  
 
//获取头部信息  
String[] headers = reader.getCSVHeader(true);  
 
//获取数据部分  
UserBean bean = null;  
while ((bean = reader.read(UserBean.class, headers, UserBean.readProcessors)) != null) {  
   System.out.print(bean.getName() + "\t");  
   System.out.print(bean.getAge() + "\t");  
   System.out.print(bean.getBirthday() + "\t");  
   System.out.println(bean.getAddress());  
}  


2、写CSV(CsvBeanWriter/CsvListWriter/CsvMapWriter) 
Java代码  
OutputStreamWriter fwriter = new OutputStreamWriter(  
       new FileOutputStream(new File("csv/test2.csv")), "GB2312");  
 
SimpleDateFormat format = new SimpleDateFormat("yyyy/M/d");  
 
ICsvBeanWriter writer = new CsvBeanWriter(fwriter,  
       CsvPreference.EXCEL_PREFERENCE);  
 
//做3条数据  
UserBean bean1 = new UserBean();  
bean1.setName("赵,四");       //特殊字符:逗号  
bean1.setAge(26);  
bean1.setBirthday(format.parse("1984/10/30"));  
bean1.setAddress("辽宁");  
 
UserBean bean2 = new UserBean();  
bean2.setName("刘\n能");      //特殊字符:换行  
bean2.setAge(24);  
bean2.setBirthday(format.parse("1986/5/13"));  
bean2.setAddress("吉林");  
 
UserBean bean3 = new UserBean();  
bean3.setName("谢\"广坤"); //特殊字符:双引号  
bean3.setAge(22);  
bean3.setBirthday(format.parse("1988/10/8"));  
bean3.setAddress("黑龙江");  
 
//输出头部  
String headers[] = { "name", "age", "birthday", "address" };          
writer.writeHeader(headers);  
 
//按顺序输出数据  
writer.write(bean1, headers, UserBean.writeProcessors);  
writer.write(bean2, headers, UserBean.writeProcessors);  
writer.write(bean3, headers, UserBean.writeProcessors);  
 
writer.close();  


3、自定义CellProcessor 
Java代码  
InputStreamReader freader = new InputStreamReader(new FileInputStream(  
       new File("csv/test5.csv")), "GB2312");  
 
ICsvBeanReader reader = new CsvBeanReader(freader,  
       CsvPreference.EXCEL_PREFERENCE);  
 
//获取头部信息  
String[] headers = reader.getCSVHeader(true);  
 
CellProcessor[] readProcessors = new CellProcessor[] {  
       new StrMinMax(2, 10),  
       new ParseInt(),  
       new ParseDate("yyyy/M/d"),  
       new CellProcessorAdaptor() {  
           @Override  
           public Object execute(final Object value, final CSVContext context) {  
               String v = (String) value;  
               if (v.length() > 5) {  
                   v = v.substring(0,5) + "......";  
               }  
               return next.execute(v, context);  
           }  
       }};  
 
//获取数据部分  
UserBean bean = null;  
while ((bean = reader.read(UserBean.class, headers, readProcessors)) != null) {  
   System.out.print(bean.getName() + "\t");  
   System.out.print(bean.getAge() + "\t");  
   System.out.print(bean.getBirthday() + "\t");  
   System.out.println(bean.getAddress());  
}  
System.out.println();  
 
reader.close();  


前提:导入需要的2个jar文件,jcommon-版本号.jar,jfreechart-版本号.jar。可以去官网下载:http://sourceforge.net/projects/jfreechart/files/
注意:下载的Jfreechart版本不要太高,新版本对中文的显示会出问题,我自己后来下的是1.0.10的版本。
 
实例一:比较简单的application版本的饼图
 

package com.test.jfreechart;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

public class JFreeChartTest
{
public static void main(String[] args)
{
DefaultPieDataset dpd=new DefaultPieDataset(); //建立一个默认的饼图
dpd.setValue("管理人员", 25);  //输入数据
dpd.setValue("市场人员", 25);
dpd.setValue("开发人员", 45);
dpd.setValue("其他人员", 10);

JFreeChart chart=ChartFactory.createPieChart("某公司人员组织数据图",dpd,true,true,false); 
//可以查具体的API文档,第一个参数是标题,第二个参数是一个数据集,第三个参数表示是否显示Legend,第四个参数表示是否显示提示,第五个参数表示图中是否存在URL

ChartFrame chartFrame=new ChartFrame("某公司人员组织数据图",chart); 
//chart要放在Java容器组件中,ChartFrame继承自java的Jframe类。该第一个参数的数据是放在窗口左上角的,不是正中间的标题。
chartFrame.pack(); //以合适的大小展现图形
chartFrame.setVisible(true);//图形是否可见

}
}


注:一个图表由以下3个部分组成:


实例二:一个结构更加明晰的application版本的柱状图,将逻辑分装到各个函数中去。
 

package com.test.jfreechart;

import java.awt.Font;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;

public class JFreeChartTest2 extends ApplicationFrame
{
public JFreeChartTest2(String title)
{
super(title);
this.setContentPane(createPanel()); //构造函数中自动创建Java的panel面板
}

public static CategoryDataset createDataset() //创建柱状图数据集
{
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.setValue(10,"a","管理人员");
dataset.setValue(20,"b","市场人员");
dataset.setValue(40,"c","开发人员");
dataset.setValue(15,"d","其他人员");
return dataset;
}

public static JFreeChart createChart(CategoryDataset dataset) //用数据集创建一个图表
{
JFreeChart chart=ChartFactory.createBarChart("hi", "人员分布", 
"人员数量", dataset, PlotOrientation.VERTICAL, true, true, false); //创建一个JFreeChart
chart.setTitle(new TextTitle("某公司组织结构图",new Font("宋体",Font.BOLD+Font.ITALIC,20)));//可以重新设置标题,替换“hi”标题
CategoryPlot plot=(CategoryPlot)chart.getPlot();//获得图标中间部分,即plot
CategoryAxis categoryAxis=plot.getDomainAxis();//获得横坐标
categoryAxis.setLabelFont(new Font("微软雅黑",Font.BOLD,12));//设置横坐标字体
return chart;
}

public static JPanel createPanel()
{
JFreeChart chart =createChart(createDataset());
return new ChartPanel(chart); //将chart对象放入Panel面板中去,ChartPanel类已继承Jpanel
}

public static void main(String[] args)
{
JFreeChartTest2 chart=new JFreeChartTest2("某公司组织结构图");
chart.pack();//以合适的大小显示
chart.setVisible(true);

}
}

运行结果如下:


实例三:将chart图表转换成JPEG格式的图片的application

package com.test.jfreechart;

import java.awt.Font;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;

public class JFreeChartTest3
{
public static void main(String[] args) throws Exception
{
JFreeChart chart=ChartFactory.createPieChart("某公司人员组织数据图",getDataset(),true,true,false);
chart.setTitle(new TextTitle("某公司组织结构图",new Font("宋体",Font.BOLD+Font.ITALIC,20)));

LegendTitle legend=chart.getLegend(0);//设置Legend
legend.setItemFont(new Font("宋体",Font.BOLD,14));
PiePlot plot=(PiePlot) chart.getPlot();//设置Plot
plot.setLabelFont(new Font("隶书",Font.BOLD,16));

OutputStream os = new FileOutputStream("company.jpeg");//图片是文件格式的,故要用到FileOutputStream用来输出。
ChartUtilities.writeChartAsJPEG(os, chart, 1000, 800);
//使用一个面向application的工具类,将chart转换成JPEG格式的图片。第3个参数是宽度,第4个参数是高度。

os.close();//关闭输出流
}

private static DefaultPieDataset getDataset()
{
DefaultPieDataset dpd=new DefaultPieDataset(); //建立一个默认的饼图
dpd.setValue("管理人员", 25);  //输入数据
dpd.setValue("市场人员", 25);
dpd.setValue("开发人员", 45);
dpd.setValue("其他人员", 10);
return dpd;
}
}

 
运行结果如下,在该项目的根目录下生成了JPEG格式的图片,注意不是在webroot目录下。

 
实例四:将类似实例三生成的图片嵌入到JSP页面中去。
1.web.xml中加入以下配置信息.
 


DisplayChart

org.jfree.chart.servlet.DisplayChart  




DisplayChart
/DisplayChart


 
2.jfreeChart.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>

<%@ page import="org.jfree.data.general.DefaultPieDataset,org.jfree.chart.ChartFactory
,org.jfree.chart.JFreeChart,org.jfree.chart.servlet.*" %>





Insert title here



<%

DefaultPieDataset dpd = new DefaultPieDataset();

dpd.setValue("管理人员", 25);
dpd.setValue("市场人员", 25);
dpd.setValue("开发人员", 45);
dpd.setValue("其他人员", 10);

JFreeChart chart = ChartFactory.createPieChart("某公司组织结构图",dpd, true, false, false);

String fileName = ServletUtilities.saveChartAsPNG(chart,800,600,session); 
//ServletUtilities是面向web开发的工具类,返回一个字符串文件名,文件名自动生成,生成好的图片会自动放在服务器(tomcat)的临时文件下(temp)

String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;
//根据文件名去临时目录下寻找该图片,这里的/DisplayChart路径要与配置文件里用户自定义的一致

%>







 
显示结果为:


实例五:模拟对运动项目投票然后查看投票JFreeChart图表
原理:服务器不重启时,session结果依然保存模拟投票功能,使用struts2-jfreechart-plugin-版本号.jar插件将图表对象在action中自动渲染。
注意:不要忘记添加struts2-jfreechart-plugin-版本号.jar到工程中。
1.Action类:

package com.test.action;

import java.awt.Font;
import java.util.List;
import java.util.Map;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ViewResultAction extends ActionSupport
{
private JFreeChart chart;//这里变量名必须是chart,不能是其他变量名

private List interest; //struts会自动类型转换,将页面传递过来的值存到List中去

public JFreeChart getChart()//getChart()方法是必须的,setChart()可以不写.
{                            //在action中的chart属性的get方法中,创建chart对象,然后进行设置plot主体和颜色;以及legend颜色和字体

chart = ChartFactory.createBarChart("兴趣统计结果", "项目", "结果", this
.getDataset(), PlotOrientation.VERTICAL, false, false, false);

chart.setTitle(new TextTitle("兴趣统计结果",new Font("黑体",Font.BOLD,22)));

CategoryPlot plot = (CategoryPlot)chart.getPlot();

CategoryAxis categoryAxis = plot.getDomainAxis();

categoryAxis.setLabelFont(new Font("宋体",Font.BOLD,22));

categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);//设置角度

NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();

numberAxis.setLabelFont(new Font("宋体",Font.BOLD,22));

return chart;
}

public List getInterest()
{
return interest;
}

public void setInterest(List interest)
{
this.interest = interest;
}

@Override
public String execute() throws Exception
{
return SUCCESS;
}

@SuppressWarnings("unchecked")
private void increaseResult(List list)//真正在开发中是不会写在action里的,应该写在model中
{                                             //模拟一个临时数据库

ActionContext context = ActionContext.getContext();//struts与servlet的耦合方式一

Map map = context.getApplication();

for (String str : list)
{
if (null == map.get(str))//表示用户第一次投票
{
map.put(str, 1);
}
else
{
map.put(str, (Integer) map.get(str) + 1);
}
}
}

@SuppressWarnings("unchecked")
private CategoryDataset getDataset() //得到数据集。
{
DefaultCategoryDataset dataset = new DefaultCategoryDataset();

this.increaseResult(this.getInterest());

ActionContext context = ActionContext.getContext();

Map map = context.getApplication();

dataset.setValue((Integer) map.get("football"), "", "足球");//更新成最新值
dataset.setValue((Integer) map.get("basketball"), "", "篮球");
dataset.setValue((Integer) map.get("volleyball"), "", "排球");
dataset.setValue((Integer) map.get("badminton"), "", "羽毛球");

return dataset;
}

}

2.Jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>







请选择喜欢的运动项目















 
3.struts.xml的配置

注意:这里的包要继承2个。网上常用的方法是将struts2-jfreechart-plugin-版本号.jar插件解压,然后修改struts-plugin-xml中package,让它继承于struts-default包然后重新打包,再配置action中的package包,使其extends= jfreechart-default,感觉这种做法比较麻烦。还是直接继承2个包比较方便。


600
800


这里标签中不需要再加入JSP页面用来跳转,会直接跳转到由chart所指定的ChartResult类来处理。

附struts-plugin-xml文件内容:

 
 
 
   
    150 
    200 
  
 
 

 

 


6:bcmail-jdk14.jar和bcprov-jdk14.jar
几个月前使用bouncycastle作为provider学习信息安全实践技术,在原理(加密,证书等)讲解完后,老师开始讲解原理的使用,首先碰到的就是smime。学习信息封装标准(pkcs7)的时候,要用到bouncycastle的bcmail包提供的类做开发,所以去bc网站下载了bcmail的包,里面包括提供cms、smime等一些操作api,可是在我做一个小的程序测试api的时候,就会不停地出现这个问题:
 
Exception in thread "main" Java.lang.NoSuchFieldError: id_TA_ECDSA_SHA_384
       at org.bouncycastle.cms.CMSSignedHelper.(Unknown Source)
       at org.bouncycastle.cms.CMSSignedDataGenerator$SignerInf.toSignerInfo(Unknown Source)
       at org.bouncycastle.cms.CMSSignedDataGenerator.generate(Unknown Source)
       at org.bouncycastle.cms.CMSSignedDataGenerator.generate(Unknown Source)
       at org.bouncycastle.cms.CMSSignedDataGenerator.generate(Unknown Source)
       at org.bouncycastle.cms.CMSSignedDataGenerator.generate(Unknown Source)
       at org.bouncycastle.cms.CMSSignedDataGenerator.generate(Unknown Source)
 
 
google了半天也没有解决。后来突然发现,我下载的bcmail的版本是“bcmail-jdk16-143.jar”,可是我的bcprovider确是“bcprov-jdk16-141.jar”,是不是版本兼容出现了问题呢,我马上去下载了和bcmail开发号码相同的provider“bcprov-jdk16-143.jar”,结果问题就解决了。
ps:看产生的例外,我明明使用的是sha1,可是非要报没有椭圆曲线(ECDSA),不知道在搞什么。。。感慨版本的兼容性事多么的重要!
附带:信息被签名之后,是这么封装的:

pkcs标准:http://en.wikipedia.org/wiki/PKCS


7:commons-net(FTP操作)
分类:
网络编程(1) 
FTP上传下载的例子:
[java] view plain copy
import java.io.File;     
import java.io.FileOutputStream;     
import java.io.IOException;     
import java.io.InputStream;     
import java.io.OutputStream;     
   
import org.apache.commons.net.ftp.FTPClient;     
import org.apache.commons.net.ftp.FTPFile;     
import org.apache.commons.net.ftp.FTPReply;     
   
public class TestUploadDownload {     
   
   /**   
   * Description: 向FTP服务器上传文件   
   * @param url FTP服务器hostname   
   * @param port FTP服务器端口   
   * @param username FTP登录账号   
   * @param password FTP登录密码   
   * @param path FTP服务器保存目录   
   * @param filename 上传到FTP服务器上的文件名   
   * @param input    输入流   
   * @return 成功返回true,否则返回false   
   */    
   public boolean uploadFile(String url, int port, String username,     
           String password, String path, String filename, InputStream input) {     
       // 初始表示上传失败     
       boolean success = false;     
       // 创建FTPClient对象     
       FTPClient ftp = new FTPClient();     
       try {     
           int reply;     
           // 连接FTP服务器     
           // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器     
           ftp.connect(url, port);     
           // 登录ftp     
           ftp.login(username, password);     
           // 看返回的值是不是230,如果是,表示登陆成功     
           reply = ftp.getReplyCode();     
           // 以2开头的返回值就会为真     
           if (!FTPReply.isPositiveCompletion(reply)) {     
               ftp.disconnect();     
               return success;     
           }     
           // 转到指定上传目录     
           ftp.changeWorkingDirectory(path);     
           // 将上传文件存储到指定目录     
           ftp.storeFile(filename, input);     
           // 关闭输入流     
           input.close();     
           // 退出ftp     
           ftp.logout();     
           // 表示上传成功     
           success = true;     
       } catch (IOException e) {     
           e.printStackTrace();     
       } finally {     
           if (ftp.isConnected()) {     
               try {     
                   ftp.disconnect();     
               } catch (IOException ioe) {     
               }     
           }     
       }     
       return success;     
   }     
        
    /**   
   * Description: 从FTP服务器下载文件   
   * @param url FTP服务器hostname   
   * @param port   FTP服务器端口   
   * @param username FTP登录账号   
   * @param password   FTP登录密码   
   * @param remotePath   FTP服务器上的相对路径   
   * @param fileName 要下载的文件名   
   * @param localPath 下载后保存到本地的路径   
   * @return   
   */    
   public boolean downFile(String url, int port, String username,     
           String password, String remotePath, String fileName,     
           String localPath) {     
       // 初始表示下载失败     
       boolean success = false;     
       // 创建FTPClient对象     
       FTPClient ftp = new FTPClient();     
       try {     
           int reply;     
           // 连接FTP服务器     
           // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器     
           ftp.connect(url, port);     
           // 登录ftp     
           ftp.login(username, password);     
           reply = ftp.getReplyCode();     
           if (!FTPReply.isPositiveCompletion(reply)) {     
               ftp.disconnect();     
               return success;     
           } // 转到指定下载目录     
           ftp.changeWorkingDirectory(remotePath);     
           // 列出该目录下所有文件     
           FTPFile[] fs = ftp.listFiles();     
           // 遍历所有文件,找到指定的文件     
           for (FTPFile ff : fs) {     
               if (ff.getName().equals(fileName)) {     
                   // 根据绝对路径初始化文件     
                   File localFile = new File(localPath + "/" + ff.getName());     
                   // 输出流     
                   OutputStream is = new FileOutputStream(localFile);     
                   // 下载文件     
                   ftp.retrieveFile(ff.getName(), is);     
                   is.close();     
               }     
           }     
           // 退出ftp     
           ftp.logout();     
           // 下载成功     
           success = true;     
       } catch (IOException e) {     
           e.printStackTrace();     
       } finally {     
           if (ftp.isConnected()) {     
               try {     
                   ftp.disconnect();     
               } catch (IOException ioe) {     
               }     
           }     
       }     
       return success;     
   }     
        
   /**   
    * @param args   
    */    
   public static void main(String[] args) {     
       // TODO Auto-generated method stub     
   
   }     
   
}    

模拟telnet登录的例子:
[java] view plain copy
import java.io.InputStream;     
import java.io.PrintStream;     
   
import org.apache.commons.net.telnet.EchoOptionHandler;     
import org.apache.commons.net.telnet.SuppressGAOptionHandler;     
import org.apache.commons.net.telnet.TelnetClient;     
import org.apache.commons.net.telnet.TerminalTypeOptionHandler;     
   
/**   
* 使用apache的commons-net包模拟telnet登录   
*/    
public class TestTelnet {     
   
   private TelnetClient telnet = null;     
   private InputStream in;     
   private PrintStream out;     
   private char prompt = '#';  //linux提示符     
        
   /**   
   * 登录linux   
   * @param server   
   * @param user   
   * @param password   
   */    
   public TestTelnet(String server, String user, String password) {     
       try {     
           // Connect to the specified server     
           telnet = new TelnetClient();     
           TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler(     
                   "VT100", false, false, true, false);     
           EchoOptionHandler echoopt = new EchoOptionHandler(true, false,     
                   true, false);     
           SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true,     
                   true, true, true);     
   
           telnet.addOptionHandler(ttopt);     
           telnet.addOptionHandler(echoopt);     
           telnet.addOptionHandler(gaopt);     
   
           telnet.connect(server, 23);     
   
           // Get input and output stream references     
           in = telnet.getInputStream();     
   
           out = new PrintStream(telnet.getOutputStream());     
   
           // Log the user on     
           readUntil("login: ");     
           write(user);     
   
           readUntil("Password: ");     
           write(password);     
   
           // Advance to a prompt     
           readUntil("$" + " ");     
   
           // readUntil("$" + "su = root");     
           // write("su - root");     
   
       } catch (Exception e) {     
           e.printStackTrace();     
       }     
   }     
   
   /**   
    * 改变当前登录用户   
    * @param user 用户名   
    * @param password 密码   
    * @param serTile linux用户提示符   
    * @return   
    */    
   public String suUser(String user, String password, String userTitle) {     
       // System.out.println("改变当前用户:");     
       write("su - " + user);     
       // System.out.println("准备读取返回的流,看是不是可以继续录入密码了:");     
       readUntil("密码:");// 有可能不是中文,先用telnet命令测试下     
       // System.out.println("返回信息提示可以录入密码,才开始录密码:");     
       write(password);     
       return readUntil(userTitle + " ");     
   }     
   
   /**   
    * 读取流信息   
    * @param pattern 流读取时的结束字符   
    * @return   
    */    
   public String readUntil(String pattern) {     
       try {     
           char lastChar = pattern.charAt(pattern.length() - 1);     
           // System.out.println("当前流的字符集:"+new     
           // InputStreamReader(in).getEncoding());     
           StringBuffer sb = new StringBuffer();     
           byte[] buff = new byte[1024];     
           int ret_read = 0;     
           String str = "";     
           do {     
               ret_read = in.read(buff);     
               if (ret_read > 0) {     
                   // 把读取流的字符转码,可以在linux机子上用echo $LANG查看系统是什么编码     
                   String v = new String(buff, 0, ret_read, "UTF-8");     
                   str = str + v;     
                   // System.out.println("debug:"+str+"========"+pattern);     
                   if (str.endsWith(pattern)) {     
                       // System.out.println("退出:"+str+"========"+pattern);     
                       break;     
                   }     
               }     
   
           } while (ret_read >= 0);     
           return str;     
       } catch (Exception e) {     
           e.printStackTrace();     
       }     
       return null;     
   }     
   
   /**   
    * 向流中发送信息   
    * @param value   
    */    
   public void write(String value) {     
       try {     
           out.println(value);     
           out.flush();     
           System.out.println("录入命令:" + value);     
       } catch (Exception e) {     
           e.printStackTrace();     
       }     
   }     
   
   /**   
    * 运行命令,默认linux提示符是'$'   
    * @param command 命令   
    * @return   
    */    
   public String sendCommand(String command) {     
       try {     
           prompt = '$';     
           write(command);     
           return readUntil(prompt + " ");     
       } catch (Exception e) {     
           e.printStackTrace();     
       }     
       return null;     
   }     
   
   /**   
    * 运行命令,默认linux提示符是'$'   
    * @param command 命令   
    * @param userTitle linux提示符   
    * @return   
    */    
   public String sendCommand(String command, char userTitle) {     
       try {     
           prompt = userTitle;     
           write(command);     
           return readUntil(prompt + " ");     
       } catch (Exception e) {     
           e.printStackTrace();     
       }     
       return null;     
   }     
   
   /**   
    * 释放连接   
    */    
   public void disconnect() {     
       try {     
           telnet.disconnect();     
       } catch (Exception e) {     
           e.printStackTrace();     
       }     
   }     
        
   /**   
    * @param args   
    */    
   public static void main(String[] args) {     
       try {     
           TestTelnet telnet = new TestTelnet("192.168.0.1", "zhsoft", "rootroot");     
           // 使用--color=no屏蔽ls命令的颜色,要不会有乱码     
           String reStr = telnet.sendCommand("ls --color=no");     
           System.out.println(reStr.replaceFirst("ls --color=no", ""));     
           telnet.suUser("root", "rootroot", "#");     
           String reStr2 = telnet.sendCommand("ls --color=no", '#');     
           System.out.println(reStr2.replaceFirst("ls --color=no", ""));     
           telnet.disconnect();     
       } catch (Exception e) {     
           e.printStackTrace();     
       }     
   }     
   
}    


Jline实现java输入自动补全
大岩不灿 发表于 2015年2月7日 浏览 5,096 次
java的控制台输入是很局限的,我们仅仅可得到它的输入,对于输入的过程是很难操控的,所以当我们想写一个人性化的输入体验的时候,是比较难实现的。还好java中有种jni的技术,它允许Java代码和其他语言写的代码进行交互。
Jline就是一个使用了C/C++实现的java类库,它可以让你更方便的处理控制台输入。
引入Jline,使用下面的maven配置
1
2

jlinejline2.9
我们平常处理输入一般是这样的:


BufferedReader br
= new BufferedReader(new InputStreamReader(System.in));String line = null;do{
line = br.readLine();
if(line != null)
{
//todo
}}while(line!=null && !line.equals("exist"))
在使用了Jline之后,一样的书写形式:


ConsoleReader reader = new ConsoleReader();String line = null;do{
line = reader.readLine("input>");
if(line != null)
{
//TODO
}}while(line!=null && !line.equals("exist"))
你便拥有了一个比较友好的输入体验了。它可以实现光标的移动,通过上下方向键切换历史命令等操作。
如果你希望有更强大的自动补全功能。你可以给ConsoleReader 设一个jline.console.completer.Completer接口实现类
1
2
public interface Completer
int complete(String buffer, int cursor, List candidates);}
其中buffer是当前用户输入的内容,cursor表示光标的位置,candidates表示你想补全的候选项。返回值很重要,表示你要再哪个位置补全你的内容
假设用户的输入是ls my xxxxxx
目前用户的光标在my后面,你想帮用户补全为myfoler或者myfile。你要这么写:


public class MyCompleter implements Completer{
@Override
public int complete(String buffer, int cursor, List candidates)
{
if(buffer.length() > 0 && cursor >0)
{
String substring = buffer.substring(0,cursor);
if(substring.endsWith("my"))
{
candidates.add("myfolder");
candidates.add("myfile");
return cursor-2;
}
 
}
return cursor;
}}
然后指定给comsoleReader对象即可:
1
2
MyCompleter myCompleter = new MyCompleter();
reader.addCompleter(myCompleter);
如果你的candidates有多个候选项,它会帮你列举出来,如果只有一个,它会帮你自动补全,当你的候选项都是xxx开头的,它会帮你补全一部分。
反正功能和vi,eclipse等ide里的自动补全功能一样强大。
Jline还有好多功能,例如获取历史,快捷键,移动光标,清屏等功能,它很强大,你只要知道有这么个东西,再去看看代码,看看它的成员方法,什么都是可以解决的,这里就不再赘述了。
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址


selenium 2.0环境搭建(基于maven)
2012-02-04 13:11 by 虫师, 27342 阅读, 5 评论, 收藏, 编辑
 
之前我就讲过一种方试来搭建selenium rc 的环境搭建,那个文章是基于selenium RC 1.0的的方式,目前官网已经不提供1.0的下载了,我所提供的下载链接是CSDN上的。
其实,如果大家熟悉maven的话,selenium RC将变成易常简单,当然,我的操作还是基于java语言阵营的。
前提:你要有maven环境。关于maven环境的搭建,请参考本博客的关于maven的文章。左侧导航栏有maven环境搭建的相关文章。
 
第一步:
Cmd打开命令提示符号,创建一个maven项目,命令如下:
mvn archetype:generate -DgroupId=MySel20Proj -DartifactId=MySel20Proj  -Dversion=1.0
 
打开创建的项目,找到项目目录下面的pom.xml文件,打开,在...之前加上如下内容:
 

org.seleniumhq.selenium
selenium-java
2.16.1

 
我们将junit的版本改为4.2 。修改之后完整的pom.xml代码如下:
 

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0

MySel20Proj
MySel20Proj
1.0
jar

MySel20Proj
http://maven.apache.org


UTF-8




junit
junit
4.2
test



org.seleniumhq.selenium
selenium-java
2.16.1




 
Ok.!现在在命令提示符号下切换到项目目录下:
 
D:java\MySel20Proj> mvn eclipse:clean 
 
D:java\MySel20Proj> mvn eclipse:eclipse    执行这个需要下载相应的包,时间会久一些。
 
现在把我们构建好的项目导入eclipse中,如果有问题请参考我的maven文章。
 
http://www.cnblogs.com/fnng/archive/2011/12/02/2272610.html
 
我们依然用之前的代码进行测试,(这段代码还是基于selenium 1.0的selenium RC)
 

import com.thoughtworks.selenium.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.regex.Pattern;

public class test extends SeleneseTestCase {
@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*iexplore",
"http://www.baidu.com/");
selenium.start();
}

@Test
public void testTest() throws Exception {
selenium.open("/");
selenium.type("id=kw", "aaaa");
selenium.click("id=su"); 
}

@After
public void tearDown() throws Exception {
selenium.stop();
}
}    

 
当然,你可以用可用selenium IDE录制脚本,将脚本导出成java所类型的语言进行测试,方式参考:
http://www.cnblogs.com/fnng/archive/2011/10/19/2217506.html  
--上面的代码与方式,已经不是推荐使用的方式了。因为selenium 2.0来了,selenium RC的舞台该退场了。
 
 
详解maven方式添加插件
 
为了得到一个不同的selenium Maven工件的概述,请看下图,它显示selenium Maven工件以及最重要的类以及这些类接口之间的依赖关系:
 

如果你想使用不同的WebDriver来运行代码,如:FirefoxDriver 你不必依靠selenium Java 构建(其中有很多的传递依赖),你只需要需要在pom.xml文件中添加相应的插件就可以了。
 

org.seleniumhq.selenium
selenium-firefox-driver
2.18.0
 
然后,在cmd(命令提示符)下,将项目重新构建一下就行了(再次执行mvn eclipse:eclipse 命令)。Maven自动下载我们所需要的FirefoxDriver 相关jar包。
 
 
如果您正在使用DefaultSelenium(或RemoteWebDriver的 实现),你仍然需要启动Selenium Server。最好的办法是下载selenium Server standalone.jar ,只是用它。此外,您还可以嵌入到自己的项目Selenium Server,下面的依赖关系,如果你添加到你的pom.xml:

org.seleniumhq.selenium
selenium-server
2.18.0

注意:这个selenium Server 产品依赖于servlet-API-2.5 产品。如果你的项目运行在一个web应用程序容器的依赖,你应该排除。
 
 
第三方的浏览器不被支持,请用seleniumhq 开发的插件;

com.opera
operadriver
0.10

 
以上参考内容:
 
http://seleniumhq.org/docs/03_webdriver.html
http://seleniumhq.org/download/maven.html

 
什么是Selenium 2.0 ?
 
从较高的层次看,Selenium由三种工具组成。第一个工具Selenium IDE,是Firefox的扩展插件,支持用户录制和回访测试。录制/回访模式?存在局限性,对许多用户来说并不适合,因此第二个工具——Selenium WebDriver提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。最后一个工具——Selenium Grid帮助工程师使用Selenium API控制分布在一系列机器上的浏览器实例,支持并发运行更多测试。在项目内部,它们分别被称为“IDE”、“WebDriver”和“Grid”。 
 
而现在我们大家能看到的:selenium2.0 = selenium1.0+ webdriver 
 
 
什么是WebDriver?
 
WebDriver是一个自动化测试Web应用程序的工具,尤其以验证它们是否如预期运作。它旨在提供一个友好的API,它很容易探讨和理解,更容易比的Selenium-RC(1.0)API,这将有助于使你的测试更容易阅读和维护使用。它不依赖任何特定的测试框架,因此它可以用来在一个单元测试,或从一个普通的旧的“main”的方法同样。


WebDirver
什么是WebDriver?
 
WebDriver是一个自动化测试Web应用程序的工具,尤其以验证它们是否如预期运作。它旨在提供一个友好的API,它很容易探讨和理解,更容易比的Selenium-RC(1.0)API,这将有助于使你的测试更容易阅读和维护使用。它不依赖任何特定的测试框架,因此它可以用来在一个单元测试,或从一个普通的旧的“main”的方法同样。
 
关于什么是WebDirver,上一节做了简单的描述,环境也在上一章中搭建完成。
下面我们拷贝了官网提供的一个实例。让其在我们的eclipse中运行。
Selenium WebDirver 代码如下:
 

package MySel20Proj;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Selenium2Example  {
public static void main(String[] args) {
// 用Firefox driver创建一个新的的实例
//注意:其他的代码依赖于界面
//不执行

System.setProperty ( "webdriver.firefox.bin" , "E:/Program Files/Mozilla Firefox/firefox.exe" );
WebDriver driver = new FirefoxDriver();// 这里我们可以使用firefox来运行测试用例
//WebDriver driver = new ChromeDriver(); //这是chrome浏览器的驱动
//WebDriver driver = new InternetExplorerDriver(); //这是IE浏览器的驱动
// WebDriver driver = new HtmlUnitDriver(); //这是一个无界面测试模式,不用打开浏览器,通过后台输入来判断测试用例是否通过

// 现在用这个来访问谷歌
driver.get("http://www.google.com");
// 也可以用下面的方式访问谷歌
// driver.navigate().to("http://www.google.com");

// 找到文本输入元件的名字
WebElement element = driver.findElement(By.name("q"));

// 在搜索框内输入“cheese!”
element.sendKeys("Cheese!");

// 现在递交表格. WebDriver会发现我们的形式元素
element.submit();

// 后台打印输出,检查网页的标题
System.out.println("Page title is: " + driver.getTitle());

// 谷歌的搜索是渲染过的动态JavaScript. 等待页面加载,暂停10秒
(new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("cheese!");
}
});

// Should see: "cheese! - Google Search"
System.out.println("Page title is: " + driver.getTitle());

//关闭浏览器
driver.quit();
}
}

 
运行时报出了错误;
 
Exception in thread "main" org.openqa.selenium.WebDriverException: Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: XP
 
Build info: version: '2.16.1', revision: '15405', time: '2012-01-05 12:30:12'
 
 
 
我们只要在WebDriver driver = new FirefoxDriver(); 前面指定我们浏览器的具体信息即可:
 
System.setProperty ( "webdriver.firefox.bin" , "E:/Program Files/Mozilla Firefox/firefox.exe" );
 
WebDriver driver = new FirefoxDriver();
 
WebDirver 的实现:
 
 
驱动名称
对操作系统的支持
调用的接口
FireFox Driver
ALL
org.openqa.selenium.firefox.FirefoxDriver 
Chrome Driver
ALL
org.openqa.selenium.chrome.ChromeDriver 
InternetExplorer Driver
Windows
org.openqa.selenium.ie.InternetExplorerDriver 
HtmlUnit Driver
ALL
org.openqa.selenium.htmlunit.HtmlUnitDriver 
 
 
什么情况下选用WebDirver ?
 
 
 
(1)Selenium-1.0不支持的浏览器功能。 
(2)multiple frames, multiple browser windows, popups, and alerts. 
(3)页面导航。 
(4)下拉。 
(5)基于AJAX的UI元素。 
 
 
同样,我们的selenium IDE也支持WebDriver类型脚本的导出。
 
将我们录制好的脚本 导出为junit(WebDriver) 类型
 

 
下面代码是我录制的一个google搜索“selenium”关键安的操作:
 

package com.test.hzh;

import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class Test1 {
private WebDriver driver;
private String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
System.setProperty ( "webdriver.firefox.bin" , "E:/Program Files/Mozilla Firefox/firefox.exe" ); 
driver = new FirefoxDriver();
baseUrl = "http://www.google.com.hk/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

@Test
public void test() throws Exception {
driver.get(baseUrl + "/");
driver.findElement(By.id("lst-ib")).clear();
driver.findElement(By.id("lst-ib")).sendKeys("selenium");
driver.findElement(By.name("btnK")).click();
}

@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}

private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
}


你可能感兴趣的:(Java基础,java)