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