欢迎来到Heck's Blog,专业承接拿站、企业建站、仿站、网上商城架构、门户网站搭建、空间域名注册、软件定制等项目。关注网络安全,因为专注,所以专业,懂得放弃,才能收获。有事请发邮件至i@heckjj.com,请记住本站网址:http://www.heckjj.com,多谢。
5月28
在开发中如果我们遇到这种需要验证的接口应该怎么调用呢?
这里给出一个Basic Authentication 接口调用的工具示例:
package com.heckjj.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.commons.codec.binary.Base64;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
public class GetAPIResultUtil {
/**
*
*
* @param url
* @param param
* @return
*/
public static String getAPIResult(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
URLConnection conn = realUrl.openConnection();
//conn.setConnectTimeout(5000);
String plainCredentials = "heck:12345";
String base64Credentials = new String(Base64.encodeBase64(plainCredentials.getBytes()));
conn.setRequestProperty("Authorization", "Basic " + base64Credentials);
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("Content-type", "application/json");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setDoOutput(true);
conn.setDoInput(true);
out = new PrintWriter(conn.getOutputStream());
out.print(param);
out.flush();
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
至此对基本认证(Basic Authentication)的完整过程就基本实现了,希望对大家有所帮助!
这里给出一个Basic Authentication 接口调用的工具示例:
package com.heckjj.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.commons.codec.binary.Base64;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
public class GetAPIResultUtil {
/**
*
*
* @param url
* @param param
* @return
*/
public static String getAPIResult(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
URLConnection conn = realUrl.openConnection();
//conn.setConnectTimeout(5000);
String plainCredentials = "heck:12345";
String base64Credentials = new String(Base64.encodeBase64(plainCredentials.getBytes()));
conn.setRequestProperty("Authorization", "Basic " + base64Credentials);
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("Content-type", "application/json");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setDoOutput(true);
conn.setDoInput(true);
out = new PrintWriter(conn.getOutputStream());
out.print(param);
out.flush();
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
至此对基本认证(Basic Authentication)的完整过程就基本实现了,希望对大家有所帮助!
3月30
最近又用到XML,发现也有必要聊聊XML的几种方式。
1、如果只是简单生成或者解析,自己写一个帮助类就行,下面这个是我前段时间用递归写的,优势方便可以扩展
import java.util.ArrayList;
import java.util.List;
/**
*
*
*
* TODO manage node and value.and format the node to xml file
*
*/
public class XMLSimpleNode implements SimpleNode {
private String nodeName;
private String value;
List<SimpleNode> childs;
private String header;
public XMLSimpleNode(String nodeName) {
this.nodeName = nodeName;
childs = new ArrayList<SimpleNode>(2);
}
public String getNodeName() {
return nodeName;
}
1、如果只是简单生成或者解析,自己写一个帮助类就行,下面这个是我前段时间用递归写的,优势方便可以扩展
import java.util.ArrayList;
import java.util.List;
/**
*
*
*
* TODO manage node and value.and format the node to xml file
*
*/
public class XMLSimpleNode implements SimpleNode {
private String nodeName;
private String value;
List<SimpleNode> childs;
private String header;
public XMLSimpleNode(String nodeName) {
this.nodeName = nodeName;
childs = new ArrayList<SimpleNode>(2);
}
public String getNodeName() {
return nodeName;
}
5月22
主要是以HTTP多线程、断点续传方式下载文件,经常出现下载下来的文件大小和服务端一致,但是却无法正常打开的现象,折腾了很久,分享下我的实现方式,直接看代码吧,废话一点不多说。
思路和功能介绍:
1、将下载文件的处理放在自定义的线程类中,每下载一个文件就新启动一个下载线程。
2、在下载线程中完成对服务端的链接和身份认证,成功后开始下载文件。
3、新建n个子线程,根据下载文件的大小和线程数量得到每个子线程要下载的大小。
4、分别启动子线程,进行分段下载。
5、分段下载完成,合并临时文件。
6、合并文件完成,删除临时文件。
思路和功能介绍:
1、将下载文件的处理放在自定义的线程类中,每下载一个文件就新启动一个下载线程。
2、在下载线程中完成对服务端的链接和身份认证,成功后开始下载文件。
3、新建n个子线程,根据下载文件的大小和线程数量得到每个子线程要下载的大小。
4、分别启动子线程,进行分段下载。
5、分段下载完成,合并临时文件。
6、合并文件完成,删除临时文件。
1月3
我记得曾经有个大牛说,做J2EE开发,性能的瓶颈在于数据库,而很少在于代码。我总结了如下,不知道是否完全正确,仅根据个人经验。
1,硬件设施应该在第一位。好的硬件可以解决好多软件问题,如果有足够的money,首要考虑硬件。
2,数据库的设计也是非常重要的。有的公司一味的强调要用arraylist不要用vector,而它们带来的性能影响于差的数据库设计带来的影响,机会可以忽略不计了。
3,EJB的设计。当然是说用EJB的情况了,如果不用EJB,那就省事多了。呵呵。EJB的性能在于实体BEAN的使用。还有ROMT接口和LOCAL接口
我个人对性能优化非常感兴趣,一个网站的性能优化包括很多方面,从软件到硬件,从数据库到web application服务器,从架构到具体的实现细节等等。
java的性能优化网站集中在架构、语言等各个方面讨论如何进行性能优化,并集中对J2EE、ejb的设计提出了很多意见,我自己的编程工作中大量采用了采用了这些tip。
http://www.javaperformancetuning.com/index.shtml
1,硬件设施应该在第一位。好的硬件可以解决好多软件问题,如果有足够的money,首要考虑硬件。
2,数据库的设计也是非常重要的。有的公司一味的强调要用arraylist不要用vector,而它们带来的性能影响于差的数据库设计带来的影响,机会可以忽略不计了。
3,EJB的设计。当然是说用EJB的情况了,如果不用EJB,那就省事多了。呵呵。EJB的性能在于实体BEAN的使用。还有ROMT接口和LOCAL接口
我个人对性能优化非常感兴趣,一个网站的性能优化包括很多方面,从软件到硬件,从数据库到web application服务器,从架构到具体的实现细节等等。
java的性能优化网站集中在架构、语言等各个方面讨论如何进行性能优化,并集中对J2EE、ejb的设计提出了很多意见,我自己的编程工作中大量采用了采用了这些tip。
http://www.javaperformancetuning.com/index.shtml
12月30
不管是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题。尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312。
一、关键技术点:
1、当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。
2、String的getBytes方法用于按指定编码获取字符串的字节数组,参数指定了解码格式,如果没有指定解码格式,则按系统默认编码格式。
3、String的“String(bytes[] bs, String charset)”构造方法用于把字节数组按指定的格式组合成一个字符串对象
一、关键技术点:
1、当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。
2、String的getBytes方法用于按指定编码获取字符串的字节数组,参数指定了解码格式,如果没有指定解码格式,则按系统默认编码格式。
3、String的“String(bytes[] bs, String charset)”构造方法用于把字节数组按指定的格式组合成一个字符串对象
10月25
其实这是一个web搜索的基本程序,从命令行输入搜索条件,起始的URL、处理url的最大数、要搜索的字符串,它就会逐个对Internet上的URL进行实时搜索,查找并输出匹配搜索条件的页面。 这个程序的原型来自《java编程艺术》,为了更好的分析,Heck去掉了其中的GUI部分,并稍作修改以适用jdk1.5。以这个程序为基础,可以写出在互联网上搜索诸如图像、邮件、网页下载之类的“爬虫”。
先请看程序运行的过程:
D:\java>javac SearchCrawler.java
D:\java>java SearchCrawler http://127.0.0.1:8080/webhome/index.jsp 20 java
Start searching...
result:
searchString=java
http://127.0.0.1:8080/webhome/index.jsp
http://127.0.0.1:8080/webhome/reply.jsp
http://127.0.0.1:8080/webhome/learn.jsp
http://127.0.0.1:8080/webhome/download.jsp
http://127.0.0.1:8080/webhome/article.jsp
http://127.0.0.1:8080/webhome/HeckGUIOverview.htm
http://127.0.0.1:8080/webhome/myexample/Proxooldoc/index.html
http://127.0.0.1:8080/webhome/view.jsp?id=301
http://127.0.0.1:8080/webhome/view.jsp?id=297
http://127.0.0.1:8080/webhome/view.jsp?id=291
http://127.0.0.1:8080/webhome/view.jsp?id=286
http://127.0.0.1:8080/webhome/view.jsp?id=285
http://127.0.0.1:8080/webhome/view.jsp?id=284
http://127.0.0.1:8080/webhome/view.jsp?id=276
http://127.0.0.1:8080/webhome/view.jsp?id=272
先请看程序运行的过程:
D:\java>javac SearchCrawler.java
D:\java>java SearchCrawler http://127.0.0.1:8080/webhome/index.jsp 20 java
Start searching...
result:
searchString=java
http://127.0.0.1:8080/webhome/index.jsp
http://127.0.0.1:8080/webhome/reply.jsp
http://127.0.0.1:8080/webhome/learn.jsp
http://127.0.0.1:8080/webhome/download.jsp
http://127.0.0.1:8080/webhome/article.jsp
http://127.0.0.1:8080/webhome/HeckGUIOverview.htm
http://127.0.0.1:8080/webhome/myexample/Proxooldoc/index.html
http://127.0.0.1:8080/webhome/view.jsp?id=301
http://127.0.0.1:8080/webhome/view.jsp?id=297
http://127.0.0.1:8080/webhome/view.jsp?id=291
http://127.0.0.1:8080/webhome/view.jsp?id=286
http://127.0.0.1:8080/webhome/view.jsp?id=285
http://127.0.0.1:8080/webhome/view.jsp?id=284
http://127.0.0.1:8080/webhome/view.jsp?id=276
http://127.0.0.1:8080/webhome/view.jsp?id=272
10月24
在java或者jsp中实现下载文件代码如下:
<%@ page language="java" pageEncoding="gb2312"
import="tk.Heck.until.*" import="java.sql.*"
contentType="text/html;charset=GB2312"%>
<%@ page
import="tk.Heck .services.*,java.io.*, java.util.*, java.text.*"%>
<jsp:directive.page import="java.util.Date" />
<%
//String path = request.getContextPath();
//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String zygx_id=request.getParameter("zygxid");
String zygxurl=request.getParameter("zygxurl");
String zygxYwjm=request.getParameter("zygxywjm");
zygxurl = zygxurl.substring(zygxurl.lastIndexOf("/"),zygxurl.length());//截取url中文件名
Str str=new Str();
int zygxid=str.parseInt(zygx_id);
%>
<%@ page language="java" pageEncoding="gb2312"
import="tk.Heck.until.*" import="java.sql.*"
contentType="text/html;charset=GB2312"%>
<%@ page
import="tk.Heck .services.*,java.io.*, java.util.*, java.text.*"%>
<jsp:directive.page import="java.util.Date" />
<%
//String path = request.getContextPath();
//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String zygx_id=request.getParameter("zygxid");
String zygxurl=request.getParameter("zygxurl");
String zygxYwjm=request.getParameter("zygxywjm");
zygxurl = zygxurl.substring(zygxurl.lastIndexOf("/"),zygxurl.length());//截取url中文件名
Str str=new Str();
int zygxid=str.parseInt(zygx_id);
%>
10月23
1、从jdk1.5以后就开始出现注解了,主要有@override @depredate @supressWarning
2、怎么样生成一个注解呢?
注解个普通的接口一样,多的就是仅仅是多添加了一个@,类似
public @interface Test{
public void value() default "this is frist annation";
}
注意:注解里面可以由方法组成也可以有枚举组成等!
3、注解可以声明在类上面,也可以声明在方法上面,当然也可以声明在属性上面,可以通过@targer来表示
@targer(ElementType.Construct)//在构造器上面进行声明
ElementType.Field //在属性上面进行声明
ElementType.Method//在方法上面进行声明
ElementType.Type //在类上面进行声明
2、怎么样生成一个注解呢?
注解个普通的接口一样,多的就是仅仅是多添加了一个@,类似
public @interface Test{
public void value() default "this is frist annation";
}
注意:注解里面可以由方法组成也可以有枚举组成等!
3、注解可以声明在类上面,也可以声明在方法上面,当然也可以声明在属性上面,可以通过@targer来表示
@targer(ElementType.Construct)//在构造器上面进行声明
ElementType.Field //在属性上面进行声明
ElementType.Method//在方法上面进行声明
ElementType.Type //在类上面进行声明
10月23
最近这几天在写一个视频管理系统,遇到一个很大的问题就是如果把不同格式转换为flv格式,经过网上的一番搜索,自己在总结,整理,整理,终于整出来了!
实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能!
格式转换主要原理就是先用java调用ffmpeg的exe文件!
但是有些格式是ffmpeg不能处理的比如rmvb,这样的可以先调用mencoder先把格式转换为avi再进行转换为flv。
主要写了3个类:分别为Conver.java ConverBegin.java ConverVideo.java。
下面提供有ffmpeg的exe文件的下载址。
实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能!
格式转换主要原理就是先用java调用ffmpeg的exe文件!
但是有些格式是ffmpeg不能处理的比如rmvb,这样的可以先调用mencoder先把格式转换为avi再进行转换为flv。
主要写了3个类:分别为Conver.java ConverBegin.java ConverVideo.java。
下面提供有ffmpeg的exe文件的下载址。
10月15
反射:
Class c = Class.forName ("java.lang.Integer");
这条语句得到一个 Integer类的类对象。还有另一种方法,如下面的语句:
Class c = Integer.class;
或者
Class c = Integer.TYPE;
它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。
第二步是调用诸如 getDeclaredMethods 的方法,以取得该类中定义的所有方法的列表。
一旦取得这个信息,就可以进行第三步了。
第三步是使用 reflection API 来操作这些信息,如下面这段代码:
Class c = Class.forName ("java.lang.Integer");
这条语句得到一个 Integer类的类对象。还有另一种方法,如下面的语句:
Class c = Integer.class;
或者
Class c = Integer.TYPE;
它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。
第二步是调用诸如 getDeclaredMethods 的方法,以取得该类中定义的所有方法的列表。
一旦取得这个信息,就可以进行第三步了。
第三步是使用 reflection API 来操作这些信息,如下面这段代码:






