native2ascii
在WINDOWS平台下编写的资源文件,以GB2312方式编码,在编译时需要转码,以确保在各个平台上的正确性
编码:
native2ascii -encoding utf8 temp.properties ApplicationResources_zh_CN.properties
反编码:
native2ascii -reverse
Java取内存信息
Runtime.getRuntime().maxMemory(); // 虚拟机可以控制的最大内存数量
Runtime.getRuntime().totalMemory(); // 虚拟机当前已经使用的内存数量
JVM设置内存参数
-Xms<size> set initial Java heap size 设置JVM初始化堆内存大小
-Xmx<size> set maximum Java heap size 设置JVM最大的堆内存大小
-Xss<size> set java thread stack size 设置JVM栈内存大小
Tomcat的java调试
Java的调试功能是JVM自带的,
新建debug.bat文件, 写入以下内容, 运行该文件启动Tomcat即可与Eclipse远程调试
set JPDA_ADDRESS=8888
set JPDA_TRANSPORT=dt_socket
set JAVA_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n %JAVA_OPTS%
startup
Jsp下载选项
// attachment:作为附件下载 | inline:在线打开
response.setHeader("Content-Disposition", "attachment; filename=/"" + fileName + "/";");
// 一定要保证没有做过关于禁止浏览器缓存的操作
// response.setHeader("Pragma", "No-cache");
// response.setHeader("Cache-Control", "No-cache");
// response.setDateHeader("Expires", 0);
Java反射判断方法有没有返回值
method.getReturnType() == void.class // 没有返回值
Java命名规范
PASCAL命名法, 用于类名, 每个单词的首字母大写, 例如ProductType
CAMEL命名法, 也叫驼峰命名法, 用于变量,方法名, 首个单词的首字母小写, 其余单词的首字母大写, 例如productType
Java类修饰符(官方顺序)
public
protected
private
abstract
static
final
transient
volatile
synchronized
native
strictfp
interface
Java绘图
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setColor(Color.black);
graphics.drawLine(x1, y1, x2, y2);
graphics.fillRect(x, y, width, height);
graphics.drawString(string, x, y);
// 设置字体
Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(foneFileName)); // ttf字体文件名
font = font.deriveFont(Font.PLAIN, 20);
graphics.setFont(font);
graphics.drawString(string, x, y);
graphics.dispose(); // 完成
ImageIO.write(image, "jpeg", new File(fileName));
Java图片缩放
public static void scaledImage1(String src, String dest, int width, int height)
throws Exception {
BufferedImage srcImage = ImageIO.read(new File(src));
BufferedImage destImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
destImage.getGraphics().drawImage(srcImage, 0, 0, width, height, null);
ImageIO.write(destImage, "jpeg", new File(dest));
}
public static void scaledImage2(String src, String dest, int width, int height)
throws Exception {
BufferedImage srcImage = ImageIO.read(new File(src));
double ratioX = new Integer(width).doubleValue() / srcImage.getWidth();
double ratioY = new Integer(height).doubleValue() / srcImage.getHeight();
AffineTransformOp op =
new AffineTransformOp(AffineTransform.getScaleInstance(ratioX, ratioY), null);
BufferedImage destImage = op.filter(srcImage, null);
ImageIO.write(destImage, "jpeg", new File(dest));
}
Dom操作
创建dom节点:
// <users><user id="10001">Alex</user></users>
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document dom = domBuilder.newDocument();
Element usersNode = dom.createElement("users"); // <users></users>
dom.appendChild(usersNode);
Element userNode = dom.createElement("user"); // <user></user>
userNode.setAttribute("id", "10001"); // <user id="10001"></user>
userNode.appendChild(dom.createTextNode("Alex")); // <user id="10001">Alex</user>
usersNode.appendChild(userNode);
将dom对象保存到文件:
// 创建文件
String xmlFileFullPath = "d:/data/user.xml"; // 应确保存在该物理路径, 物理文件可不存在
File xmlFile = new File(xmlFileFullPath);
FileOutputStream fileStream = new FileOutputStream(xmlFile);
// 创建转换器
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty("encoding", "UTF-8");
// 创建转换源
DOMSource source = new DOMSource(dom.getDocumentElement());
// 创建转换目标
StreamResult result = new StreamResult(fileStream);
// 转换
transformer.transform(source, result);
遍历dom节点:
Collection userCollection = new Collection();
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 解析XML文件
Document dom = domBuilder.parse(xmlFileFullPath);
if (dom != null && dom.hasChildNodes()) {
Node usersNode = beansConfigDom.getFirstChild(); // <users>节点
if (usersNode != null && usersNode.hasChildNodes()) {
// 遍历dom节点
Node userNode = usersNode.getFirstChild(); // <user>节点
while (userNode != null) {
if ("user".equals(userNode.getNodeName())) {
UserBean userBean = new UserBean();
if (userNode.hasChildNodes()) { // <user>节点的文本
Node textNode = node.getFirstChild();
userBean.setUserName(textNode == null ? null : textNode.getNodeValue());
}
if (userNode.hasAttributes()) { // <user>节点的id属性
Node attribute = node.getAttributes().getNamedItem("id");
userBean.setUserId(attribute == null ? null : attribute.getNodeValue());
}
userCollection.add(userBean);
}
userNode = userNode.getNextSibling(); // 下一个<user>节点
}
}
}
获取工程绝对路径
假定StrutsDemo工程下有demo.Test类
1.Test.class.getResource("")
得到的是当前类Test.class文件的URI目录。不包括自己!
如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/demo/
2.Test.class.getResource("/")
得到的是当前的classpath的绝对URI路径。
如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/
3.Test.class.getClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径。
如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/
4.Thread.currentThread().getContextClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径。
如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/
5.ClassLoader.getSystemResource("")
得到的也是当前ClassPath的绝对URI路径。
如: file:/d:/tomcat/webapps/StrutsDemo/WEB-INF/classes/
Web工程通过ServletContext.getRealPath("/")获取工程绝对路径
public class MyListener implements ServletContextListener {
private ServletContext context = null;
public void contextInitialized(ServletContextEvent event)...{
this.context = event.getServletContext();
System.out.println(this.context.getRealPath("/"));
}
public void contextDestroyed(ServletContextEvent event){
this.context = null;
}
}
Java字符编码
String str ="汉";
// 取得GB2312编码的字节
byte[] bytesGB2312 = str.getBytes("GB2312");
// 取得平台缺省编码的字节(solaris为ISO8859_1,windows为GB2312)
byte[] bytesDefault = str.getBytes();
// 用指定的编码将字节转换成字符串
String newStrGB = new String(bytesGB2312, "GB2312");
// 用平台缺省的编码将字节转换成字符串(solaris为ISO8859_1,windows为GB2312)
String newStrDefault = new String(bytesDefault);
// 用指定的编码从字节流里面读取字符
InputStream in = xxx;
InputStreamReader reader = InputStreamReader(in, "GB2312");
char aChar = reader.read();
在Tomcat中,由Request.getParameter()获取的参数,编码方式都是ISO8859_1
在Servlet规范中,可以通过request.setCharacterEncoding("GB2312");来改变获取参数的编码方式
JSP页面中charset的作用:
1. JSP文件的编码方式: 在生成JAVA类时,源JSP文件中汉字的编码
2. JSP输出流的编码方式: 在执行JSP时,往response流里面写入数据的编码方式
在往response流里面写数据前可以调用response.setContentType()来改变写入数据的编码方式
Tomcat配置虚拟目录映射
(Tomcat50/conf/server.xml)
<Context path="/control" docBase="F:/control/web" debug="0" privileged="true" reloadable="true" />
Java文件操作
try {
streamIn = file.getInputStream();
streamOut = new FileOutputStream(dir + "/" + fileName);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = streamIn.read(buffer,0,8192))!=-1) {
streamOut.write(buffer, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
streamIn.close();
streamOut.close();
} catch (IOException e) {
e.printStackTrace();
}
file.destroy();
}
拆分字符串
1. StringTokenizer对于连续的分隔符如||会识别为一个分隔符
String src = "50001|stephen||1980-12-27";
StringTokenizer tokenizer = new StringTokenizer(src, "|");
while(tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
2. split的参数是正则表达式
String src = "50001|stephen||1980-12-27";
String[] array = src.split("\\|");
for(int i=0; i < array.length; i++) {
System.out.println(array[i]);
}
Request对象的主要方法
setAttribute(String name, Object obj): 设置名字为name的request的参数值
removeAttribute(String name): 删除请求中的一个属性
getAttribute(String name): 返回由name指定的属性值
getAttributeNames(): 返回request对象所有属性的名字集合,结果是一个枚举的实例
getCookies(): 返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding(): 返回请求中的字符编码方式
getContentLength(): 返回请求的Body的长度
getHeader(String name): 获得HTTP协议定义的文件头信息
getHeaders(String name): 返回指定名字的request Header的所有值,结果是一个枚举的实例
getHeaderNames(): 返回所以request Header的名字,结果是一个枚举的实例
getInputStream(): 返回请求的输入流,用于获得请求中的数据
getMethod(): 获得客户端向服务器端传送数据的方法
getParameter(String name): 获得客户端传送给服务器端的有name指定的参数值
getParameterNames(): 获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParameterValues(String name): 获得有name指定的参数的所有值
getProtocol(): 获取客户端向服务器端传送数据所依据的协议名称
getQueryString(): 获得查询字符串(只能获取到通过GET方法请求的参数), 如: type=1&operate=0
getRequestURL(): 获取绝对请求地址, 如: http://127.0.0.1/user/test.jsp
getRequestURI(): 获取相对请求地址, 如: /user/test.jsp
getLocalAddr(): 获取服务端的IP地址
getLocalName():
getRemoteAddr(): 获取客户端的IP地址
getRemoteHost(): 获取客户端的名字
getSession([Boolean create]): 返回和请求相关Session
getServerName(): 获取服务器的名字
getServerPort(): 获取服务器的端口号
getServletPath(): 获取客户端所请求的脚本文件的路径
获取客户端IP
/*
* 获取用户IP: request.getRemoteAddr(), 这种方法在大部分情况下都是有效的。
* 但是在用户使用了Apache,Squid等反向代理软件的情况下,
* 用户访问某页面, 其实并不是用户浏览器真正访问到了服务器上的页面文件,
* 而是先由代理服务器去访问页面文件, 再将访问到的结果返回给用户的浏览器,
* 因此getRemoteAddr()获取到的实际上是代理服务器的IP, 并不是用户真实IP。
* 但是在转发请求的HTTP头信息中, 增加了类似于x-forwarded-for的信息,
* 用以跟踪原来的客户端IP地址
*/
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
JSP文件头编码
<%@ page contentType="text/html; charset=UTF-8" %>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
随机数
new java.util.Random().nextInt()使用当前时间即System.currentTimeMillis()作为发生器的种子
new java.util.Random(long seed).nextInt()使用指定的seed作为发生器的种子
取得x到y之间的随机数
如果得到的是int或long型的随机数,则使用公式 random % x + y 取得
如果得到的是0到1的double型随机数,则使用公式 random * (x - y + 1) + x 取得
正则表达式向左预查
Pattern splitor = Pattern.compile("(?<!\\\\)\\|"); // 左边不为\的|
String src = "13900000000|zhaohuihua|abc\\|123";
String[] ary = splitor.split(src);
System.out.println(splitor.pattern());
for(int i = 0; i < ary.length; i++) {
System.out.println(ary[i]);
}
输出:
(?<!\\)\|
13900000000
zhaohuihua
abc\|123