
2009年12月3日
關于HTTP請求超時字段定義
一、ConnectionRequestTimeout 超時
HttpClient 使用連接池來管理連接,這個時間是從連接池獲取連接的超時時間,可以聯想從數據庫連接池獲取數據庫連接。
二、ConnectTimeout 超時
建立連接超時,客戶端和服務器間建立連接進行的三次握手完成的時間
三、SocketTimeout 超時
數據傳輸過程中數據包之間間隔的最大時間,Http響應報文可能有多個小報文組成,
如果傳輸報文的間隔時間超過設置這個時間,會報 java.net.SocketTimeoutException: Read timed out 異常的
posted @
2018-04-20 14:36 ForMeBlog 閱讀(362) |
評論 (0) |
編輯 收藏
提示:編寫Eclipse常用快捷鍵寫成文檔,主要是為了自己熟悉一下這些快捷鍵,方便以后查找和編程中使用!
一、編輯類快捷鍵
1、Ctrl + 1 快速修復,可以解決很多問題,例如import類、try catch包圍等。
2、Ctrl + Shift + F 格式化當前代碼。
3、Ctrl + Shift + M 添加類的import引入。
4、Ctrl + Shift + M 組織類的import引入,既有Ctrl + Shift + M 的作用,又可以幫你去除沒有用的引入。
5、Ctrl + Y 重做與Ctrl + Z 相反的作用。
6、Alt + / 內容輔助
7、Ctrl + D 刪除當前行或者選中的多行
8、Alt + Down 當前行和下面一行交換位置
9、Alt + Up 當前行和上面一行交換位置
10、Shift + Enter 在當前行的下一行插入空行
11、Ctrl + / 注釋當前行,再次按則取消注釋
二、選擇快捷鍵
1、Alt + Shift + Up 選擇封裝元素
2、Alt + Shift + Left 選擇上一個元素
3、Alt + Shift + Right選擇下一個元素
4、Shift + Left 從光標處開始往左選擇字符串
5、Shift + Right 從光標處開始往右選擇字符串
6、Ctrl + Shift + Left 選中光標左邊的單詞
7、Ctrl + Shift + Right 選中光標右邊的單詞
三、移動快捷鍵
1、Ctrl + Left 光標移到左邊單詞的開頭,
2、Ctrl + Right 光標移到右邊單詞的末尾。
四、搜索快捷鍵
1、Ctrl + K 參照選中的文字快速定位到下一個,如果沒有選中文字則搜索上一次使用搜索的文字。
2、Ctrl + Shift + K 參照選中的文字快速定位到上一個。
3、Ctrl + J 正向增量查找,按下這個快捷鍵后,你所輸入的每個字母編輯器都提供快速匹配到某個單詞,如果沒有在狀態欄中顯示沒有找到,退出這個模式按ESC鍵。
4、Ctrl + Shift + J 反向增量查找
5、Ctrl + Shift + U 列出所有包含字符串的行
6、Ctrl + G 工作區中的聲明
7、Ctrl + Shift + G 工作區中的引用
五、導航快捷鍵
1、Ctrl + Shift + T 搜索類
2、Ctrl + Shift + R 搜索工程中的文件
3、Ctrl + E 快速顯示當前編輯區的下拉列表
4、F4 打開類型層次結構
5、F3 跳轉到聲明處
6、Alt + Left 前一個編輯頁面
7、Alt + Right 下一個編輯頁面
8、Ctrl + PageUp/PageDown在編輯器中,切換已經打開的文件
六、調試快捷鍵
1、F5 單步跳入
2、F6 單步跳過
3、F7 單步還回
4、F8 繼續
5、Ctrl + Shift + D 顯示變量的值
6、Ctrl + shift + B 在當前行設置或者去掉斷點
7、Ctrl + R 運行至行,比較好用可以省好多的斷點
七、重構快捷鍵
1、Alt + Shift + R 重命名類名、方法名、屬性(變量)名。
2、Alt + Shift + M 把一段函數內的代碼抽取成方法,這是重構里面最常用的方法之一,特別是對于一大坨代碼很有用。
3、Alt + Shift + C 修改函數結構,比較實用有N個函數調用了這個方法修改一次就行了。
4、Alt + Shift + L 抽取本地變量,可以直接把一些魔法數字和字符串抽取成一個變量,尤其是多出調用的時候。
5、Alt + Shift + F 把Class中的局部變量變為全局變量
6、Alt + Shift + I 合并變量,將創建簡化
7、Alt + Shift + Z 撤銷重構
八、其他快捷鍵
1、Alt + Enter 顯示當前選擇資源的屬性,在windows下查看文件的屬性就是這個快捷鍵,通常可以用來查看文件在windows中的實際路徑。
2、Ctrl + Up文本編輯器向上滾行
3、Ctrl + Down 文本編輯器向下滾行
4、Ctrl + M 最大化當前的Edit或者View,再按則縮小
5、Ctrl + O 快速顯示Outline
6、Ctrl + T 快速顯示當前類的繼承結構,選中接口方法按下這快捷可以跳轉到實現類,在項目DAO中經常用。
7、Ctrl + W 關閉當前Editer
8、Ctrl + L 文本編輯器轉至行
9、F2 顯示工具提示描述,選擇類或者變量按下該鍵會有提示出來
posted @
2015-11-20 16:36 ForMeBlog 閱讀(450) |
評論 (0) |
編輯 收藏
今天遇到調用encodeURL調用二次的疑問,雖然之前知道要調用二次,但是具體不是太清楚里面具體的運行過程,這是轉載的這個寫的比較詳細,把整個運行過程詳細解讀了一下,非常不錯所以轉載過了供其他人分享。
.encodeURL函數主要是來對URI來做轉碼,它默認是采用的UTF-8的編碼.
. UTF-8編碼的格式:一個漢字來三個字節構成,每一個字節會轉換成16進制的編碼,同時添加上%號.
假設頁面端輸入的中文是一個“中”,按照下面步驟進行解碼
1.第一次encodeURI,按照utf-8方式獲取字節數組變成[-28,-72-83],對字節碼數組進行遍歷,把每個字節轉化成對應的16進制數,這樣就變成了[E4,B8,AD],最后變成[%E4,%B8,%AD] 此時已經沒有了多字節字符,全部是單字節字符。
2、第二次encodeURI,進行編碼,會把%看成一個轉義字符,并不編碼%以后字符,會把%編碼成%25.把數組最后變成[%25E4,%25B8,%25AD]然后就把處理后的數據[%25E4,%25B8,%25AD]發往服務器端,
當應用服務器調用getParameter方法,getParameter方法會去向應用服務器請求參數
應用服務器最初獲得的就是發送來的[%25E4,%25B8,%25AD],應用服務器會對這個數據進行URLdecode操作,應用服務器進行解碼的這一次,不管是按照UTF-8,還是GBK,還是ISO-8859,,都能得到[%E4,%B8,%AD],因為都會把%25解析成%.并把這個值返回給getParameter方法
3\、再用UTF-8解碼一次,就得到"中"了。
想想看,如果不編碼兩次,當服務器自動解碼的時候,假如是按照ISO-8859去解碼UTF-8編碼的東西,就是會出現亂碼。
JS:
- document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;
JAVA后臺:
- roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");
posted @
2015-08-18 11:20 ForMeBlog 閱讀(421) |
評論 (0) |
編輯 收藏
一、概念
Annontation是Java5開始引入的新特征。中文名稱一般叫注解。它提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(類、方法、成員變量等)進行關聯。
更通俗的意思是為程序的元素(類、方法、成員變量)加上更直觀更明了的說明,這些說明信息是與程序的業務邏輯無關,并且是供指定的工具或框架使用的。
Annontation像一種修飾符一樣,應用于包、類型、構造方法、方法、成員變量、參數及本地變量的聲明語句中。
二、原理
Annotation其實是一種接口。通過Java的反射機制相關的API來訪問annotation信息。相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行為。
annotation是不會影響程序代碼的執行,無論annotation怎么變化,代碼都始終如一地執行。
Java語言解釋器在工作時會忽略這些annotation,因此在JVM 中這些annotation是“不起作用”的,只能通過配套的工具才能對這些annontaion類型的信息進行訪問和處理。
Annotation與interface的異同:
1)、Annotation類型使用關鍵字@interface而不是interface。
這個關鍵字聲明隱含了一個信息:它是繼承了java.lang.annotation.Annotation接口,并非聲明了一個interface
2)、Annotation類型、方法定義是獨特的、受限制的。
Annotation 類型的方法必須聲明為無參數、無異常拋出的。這些方法定義了annotation的成員:方法名成為了成員名,而方法返回值成為了成員的類型。而方法返回值類型必須為primitive類型、Class類型、枚舉類型、annotation類型或者由前面類型之一作為元素的一維數組。方法的后面可以使用 default和一個默認數值來聲明成員的默認值,null不能作為成員默認值,這與我們在非annotation類型中定義方法有很大不同。
Annotation類型和它的方法不能使用annotation類型的參數、成員不能是generic。只有返回值類型是Class的方法可以在annotation類型中使用generic,因為此方法能夠用類轉換將各種類型轉換為Class。
3)、Annotation類型又與接口有著近似之處。
它們可以定義常量、靜態成員類型(比如枚舉類型定義)。Annotation類型也可以如接口一般被實現或者繼承。
三、應用場合
annotation一般作為一種輔助途徑,應用在軟件框架或工具中,在這些工具類中根據不同的 annontation注解信息采取不同的處理過程或改變相應程序元素(類、方法及成員變量等)的行為。
例如:Junit、Struts、Spring等流行工具框架中均廣泛使用了annontion。使代碼的靈活性大提高。
四、常見標準的Annotation
從java5版本開始,自帶了三種標準annontation類型,
(1)、Override
java.lang.Override 是一個marker annotation類型,它被用作標注方法。它說明了被標注的方法重載了父類的方法,起到了斷言的作用。如果我們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。
這個annotaton常常在我們試圖覆蓋父類方法而確又寫錯了方法名時加一個保障性的校驗過程。
(2)、Deprecated
Deprecated也是一種marker annotation。當一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標注的程序元素。所以使用這種修飾具有一定的 “延續性”:如果我們在代碼中通過繼承或者覆蓋的方式使用了這個過時的類型或者成員,雖然繼承或者覆蓋后的類型或者成員并不是被聲明為 @Deprecated,但編譯器仍然要報警。
注意:@Deprecated這個annotation類型和javadoc中的 @deprecated這個tag是有區別的:前者是java編譯器識別的,而后者是被javadoc工具所識別用來生成文檔(包含程序成員為什么已經過時、它應當如何被禁止或者替代的描述)。
(3)、SuppressWarnings
此注解能告訴Java編譯器關閉對類、方法及成員變量的警告。
有時編譯時會提出一些警告,對于這些警告有的隱藏著Bug,有的是無法避免的,對于某些不想看到的警告信息,可以通過這個注解來屏蔽。
SuppressWarning不是一個marker annotation。它有一個類型為String[]的成員,這個成員的值為被禁止的警告名。對于javac編譯器來講,被-Xlint選項有效的警告名也同樣對@SuppressWarings有效,同時編譯器忽略掉無法識別的警告名。
annotation語法允許在annotation名后跟括號,括號中是使用逗號分割的name=value對用于為annotation的成員賦值:
代碼:
@SuppressWarnings(value={"unchecked","fallthrough"})
public void lintTrap() { /* sloppy method body omitted */ }
在這個例子中SuppressWarnings annotation類型只定義了一個單一的成員,所以只有一個簡單的value={...}作為name=value對。又由于成員值是一個數組,故使用大括號來聲明數組值。
注意:我們可以在下面的情況中縮寫annotation:當annotation只有單一成員,并成員命名為"value="。這時可以省去"value="。比如將上面的SuppressWarnings annotation進行縮寫:
代碼:
@SuppressWarnings({"unchecked","fallthrough"})
如果SuppressWarnings所聲明的被禁止警告個數為一個時,可以省去大括號:
@SuppressWarnings("unchecked")
五、自定義annontation示例
示例共涉及四個類:
清單1:Author.java
package com.magc.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 定義作者信息,name和group
* @author magc
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Author {
String name();
String group();
}
清單2:Description.java
/**
*
*/
package com.magc.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author magc
*
* 定義描述信息 value
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Description {
String value();
}
清單3:Utility.java
package com.magc.annotation;
@Description(value = "這是一個有用的工具類")
public class Utility {
@Author(name = "haoran_202",group="com.magc")
public String work()
{
return "work over!";
}
}
注:這是個普通的Java類,運行了@Description和@Author注解。
清單3:AnalysisAnnotation.java
package com.magc.annotation;
import java.lang.reflect.Method;
public class AnalysisAnnotation {
/**
* 在運行時分析處理annotation類型的信息
*
*
*/
public static void main(String[] args) {
try {
//通過運行時反射API獲得annotation信息
Class rt_class = Class.forName("com.magc.annotation.Utility");
Method[] methods = rt_class.getMethods();
boolean flag = rt_class.isAnnotationPresent(Description.class);
if(flag)
{
Description description = (Description)rt_class.getAnnotation(Description.class);
System.out.println("Utility's Description--->"+description.value());
for (Method method : methods) {
if(method.isAnnotationPresent(Author.class))
{
Author author = (Author)method.getAnnotation(Author.class);
System.out.println("Utility's Author--->"+author.name()+" from "+author.group());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
注:這是個與自定義@Description和@Author配套的基礎框架或工具類,通過此類來獲得與普通Java類Utility.java關聯的信息,即描述和作者。
運行AnalysisAnnotation,輸出結果為:
Utility's Description--->這是一個有用的工具類
Utility's Author--->haoran_202 from com.magc
posted @
2015-06-11 18:06 ForMeBlog 閱讀(256) |
評論 (0) |
編輯 收藏
在ORACLE 數據庫中有一種方法可以實現級聯查詢
select * //要查詢的字段
from table //具有子接點ID與父接點ID的表
start with selfid=id //給定一個startid(字段名為子接點ID,及開始的ID號)
connect by prior selfid=parentid //聯接條件為子接點等于父接點,不能反
這個SQL主要用于菜單的級聯查詢,給一個父接點可以查出所有的子接點。及子接點的子接點,一查到底,很實用。不過呢這個程序只能在oracle里面用,我目前還不知道在其它數據庫里是怎么調用的。等我找到了,再貼出來與大家分享。
這個程序,估計好多人看不明白,其實放了這么久我也一時沒看明白,重新測了一下,補充說明一下,不然我下次又看不懂了。
以一個windows系統的菜單為例。我那一個這樣的表menu。
說明:
mid:菜單的ID號
mname:菜單名稱
mpid:菜單的
quickey:快捷鍵
validate:權限表(存放userid,或者角色id)
mid |
mname |
mpid |
quickey |
validate |
1 |
文件 |
|
ctrl+f |
1,2,3,4,11,23,45 |
2 |
編輯 |
|
ctrl+e |
|
3 |
新建 |
1 |
alt+w |
|
4 |
文件夾 |
3 |
|
|
如果我想知道在“文件”菜單下有那些子菜單的話。我就可以這樣用這個SQL程序:
select * from menu
start with mid=1
connect by prior mid=mpid;
這樣就可以把 “文件”里的子菜單全部列出來了。當然實際應用不會這么簡單,如附加其實條件,尤其是權限管理,這時根據你的系統要求,是對個個驗證,還是對角色驗證,把這些人的ID放在validate這個字段里,組成一個字符串,N個ID用逗號隔開,(注意,在往數據庫保存時要注意對字符串處理一下,截取掉最后一個逗號這樣可以節省很多麻煩)
select * from menu
where validate in(……)
and mid in(
select mid from menu //這里不能用*號了。
start with mid=1
connect by prior mid=mpid;
)
最后再補充一點關于隨機查詢的代碼
select * from user order by sys_guid()
posted @
2015-03-12 12:04 ForMeBlog 閱讀(1478) |
評論 (0) |
編輯 收藏
今天看到某網友關于“如何以Java實現網頁截圖技術”的咨詢帖,由于出現該咨詢的地點非常不適合較長回復,故以博文形式回答。
事實上,如果您想以Java實現網頁截圖,也就是“輸入一段網址,幾秒鐘過后就能截取一張網頁縮略圖”的效果。那么,您至少有3種方式可以選擇。
1、最直接的方式——使用Robot
方法詳解:該方法利用Robat提供的強大桌面操作能力,硬性調用瀏覽器打開指定網頁,并將網頁信息保存到本地。
優勢:簡單易用,不需要任何第三方插件。
缺點:不能同時處理大量數據,技術含量過低,屬于應急型技巧。
實現方法:使用如下代碼即可
- public static void main(String[] args) throws MalformedURLException,
- IOException, URISyntaxException, AWTException {
-
- Desktop.getDesktop().browse(
- new URL("http://google.com/intl/en/").toURI());
- Robot robot = new Robot();
- robot.delay(10000);
- Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
- int width = (int) d.getWidth();
- int height = (int) d.getHeight();
-
- robot.keyRelease(KeyEvent.VK_F11);
- robot.delay(2000);
- Image image = robot.createScreenCapture(new Rectangle(0, 0, width,
- height));
- BufferedImage bi = new BufferedImage(width, height,
- BufferedImage.TYPE_INT_RGB);
- Graphics g = bi.createGraphics();
- g.drawImage(image, 0, 0, width, height, null);
-
- ImageIO.write(bi, "jpg", new File("google.jpg"));
- }
2、最常規的方式——利用JNI,調用第三方C/C++組件
方法詳解:目前來講,Java領域對于網頁截圖組件的開發明顯不足(商機?),當您需要完成此種操作時,算得上碰到了Java的軟肋。但是,眾所周知Java也擁有強大的JNI能力,可以輕易將C/C++開發的同類組件引為己用。
優勢:實現簡單,只需要封裝對應的DLL文件,就可以讓Java實現同類功能。
劣勢:同其他JNI實現一樣,在跨平臺時存在隱患,而且您的程序將不再屬于純Java應用。
實現方法:可參見此用例,具體封裝何種C/C++組件請自行選擇。
PS:示例來源于ACA HTML to Image Converter項目(http://www.acasystems.com/en/web-thumb-activex/faq-convert-html-to-image-in-java.htm ),這是一個收費的HTML轉Image第三方組件,但封裝方式在Java中大同小異。
引用JNI封裝:
- import sun.awt.*;
- import java.awt.*;
- import javax.swing.*;
- import java.awt.event.*;
- import java.awt.*;
- import java.awt.peer.*;
- public class Snap
- {
- static
- {
- System.loadLibrary("Snap");
- }
- public static void main( String[] argv )
- {
- Snap t_xSnap = new Snap();
- t_xSnap.Start("http://www.google.com", "snapshot-google.png");
- }
- public native void Start(String pi_strURL, String pi_strImageName);
- }
CPP部分的實現:
- #include <windows.h>
- #include <atlbase.h>
- #include "snap.h"
- #pragma comment(lib,"atl.lib")
- #import "./../../acawebthumb.dll" no_namespace
- JNIEXPORT void JNICALL Java_Snap_Start(JNIEnv *pEnv, jobject, jstring pi_strUrl, jstring pi_strFileName)
- {
- CoInitialize(0);
- _bstr_t t_strUrl = pEnv->GetStringUTFChars(pi_strUrl, 0);
- _bstr_t t_strFileName = pEnv->GetStringUTFChars(pi_strFileName, 0);
- IThumbMakerPtr HTML_Converter = NULL;
- HRESULT hr = HTML_Converter.CreateInstance(L"ACAWebThumb.ThumbMaker");
- if (SUCCEEDED(hr))
- {
- HTML_Converter->SetURL(t_strUrl);
- if ( 0 == HTML_Converter->StartSnap() )
- HTML_Converter->SaveImage(t_strFileName);
- }
- if (HTML_Converter)
- HTML_Converter.Release();
- CoUninitialize();
- }
以該組件圖像化yahoo界面的效果圖:
3、最扎實的方法——自行解析HTML標記,并將其圖像化
方法詳解:眾所周知,HTML之所以在瀏覽器中以具體的網頁格式出現,并非服務器端傳了一整個應用到客戶端,而是源自于瀏覽器對于客戶端自行解析的結果。因此,只要我們將對應的解析一一實現,那么將網頁圖形化,就將不是什么難事。
優勢:純Java實現,一勞永逸,一旦開發完成則永遠通用,而且有一定的商用價值。
劣勢:開發費時,且需要針對不同語法做精確分析,才能保證輸出的基本正確。尤其在涉及到JavaScript解析時,難度將尤其增大。
實現方法:目前尚無具體案例可供參考。但是,由于Java有jdic之類的瀏覽器項目存在(https://jdic.dev.java.net/ ),而Java圖形界面又屬繪制生成。從理論上說,我們可以將所有具備Graphics的組件圖形化保存。
而如果自行解析,那么您需要建立HTML解析器(或使用第三方的,萬幸Java在這方面的組件很多),了解Java2D機制,了解何時該使用drawString繪制文字,何時又該使用drawImage插入圖片等等。
補充:
這是一個利用內置瀏覽器截圖的示例,使用了DJNativeSwing組件。
示例工程下載地址(Eclipse工程,含lib):http://greenvm.googlecode.com/files/Screenshot.7z
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.SwingUtilities;
- import chrriis.dj.nativeswing.swtimpl.NativeComponent;
- import chrriis.dj.nativeswing.swtimpl.NativeInterface;
- import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
- import chrriis.dj.nativeswing.swtimpl.components.WebBrowserAdapter;
- import chrriis.dj.nativeswing.swtimpl.components.WebBrowserEvent;
- public class Main extends JPanel {
-
-
-
- private static final long serialVersionUID = 1L;
-
- final static public String LS = System.getProperty("line.separator", "/n");
-
- final static public String FS = System.getProperty("file.separator", "http://");
-
- final static StringBuffer jsDimension;
-
- static {
- jsDimension = new StringBuffer();
- jsDimension.append("var width = 0;").append(LS);
- jsDimension.append("var height = 0;").append(LS);
- jsDimension.append("if(document.documentElement) {").append(LS);
- jsDimension.append(
- " width = Math.max(width, document.documentElement.scrollWidth);")
- .append(LS);
- jsDimension.append(
- " height = Math.max(height, document.documentElement.scrollHeight);")
- .append(LS);
- jsDimension.append("}").append(LS);
- jsDimension.append("if(self.innerWidth) {").append(LS);
- jsDimension.append(" width = Math.max(width, self.innerWidth);")
- .append(LS);
- jsDimension.append(" height = Math.max(height, self.innerHeight);")
- .append(LS);
- jsDimension.append("}").append(LS);
- jsDimension.append("if(document.body.scrollWidth) {").append(LS);
- jsDimension.append(
- " width = Math.max(width, document.body.scrollWidth);")
- .append(LS);
- jsDimension.append(
- " height = Math.max(height, document.body.scrollHeight);")
- .append(LS);
- jsDimension.append("}").append(LS);
- jsDimension.append("return width + ':' + height;");
- }
-
- public Main(final String url, final int maxWidth, final int maxHeight) {
- super(new BorderLayout());
- JPanel webBrowserPanel = new JPanel(new BorderLayout());
- final String fileName = System.currentTimeMillis() + ".jpg";
- final JWebBrowser webBrowser = new JWebBrowser(null);
- webBrowser.setBarsVisible(false);
- webBrowser.navigate(url);
- webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
- add(webBrowserPanel, BorderLayout.CENTER);
- JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));
- webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
-
- public void loadingProgressChanged(WebBrowserEvent e) {
-
- if (e.getWebBrowser().getLoadingProgress() == 100) {
- String result = (String) webBrowser
- .executeJavascriptWithResult(jsDimension.toString());
- int index = result == null ? -1 : result.indexOf(":");
- NativeComponent nativeComponent = webBrowser
- .getNativeComponent();
- Dimension originalSize = nativeComponent.getSize();
- Dimension imageSize = new Dimension(Integer.parseInt(result
- .substring(0, index)), Integer.parseInt(result
- .substring(index + 1)));
- imageSize.width = Math.max(originalSize.width,
- imageSize.width + 50);
- imageSize.height = Math.max(originalSize.height,
- imageSize.height + 50);
- nativeComponent.setSize(imageSize);
- BufferedImage image = new BufferedImage(imageSize.width,
- imageSize.height, BufferedImage.TYPE_INT_RGB);
- nativeComponent.paintComponent(image);
- nativeComponent.setSize(originalSize);
-
- if (imageSize.width > maxWidth
- || imageSize.height > maxHeight) {
-
- image = image.getSubimage(0, 0, maxWidth, maxHeight);
-
-
-
-
-
-
-
-
-
-
- }
- try {
-
- ImageIO.write(image, "jpg", new File(fileName));
- } catch (IOException ex) {
- ex.printStackTrace();
- }
-
- System.exit(0);
- }
- }
- }
- );
- add(panel, BorderLayout.SOUTH);
- }
- public static void main(String[] args) {
- NativeInterface.open();
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
-
- JFrame frame = new JFrame("以DJ組件保存指定網頁截圖");
-
- frame.getContentPane().add(
- new Main("http://blog.csdn.net/cping1982", 640, 480),
- BorderLayout.CENTER);
- frame.setSize(800, 600);
-
- frame.invalidate();
- frame.pack();
- frame.setVisible(false);
- }
- });
- NativeInterface.runEventPump();
- }
- }
posted @
2015-01-21 12:00 ForMeBlog 閱讀(436) |
評論 (0) |
編輯 收藏
public HttpServletResponse download(String path, HttpServletResponse response) {
try {
// path是指欲下載的文件的路徑。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后綴名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下載文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 設置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
// 下載本地文件
String fileName = "Operator.doc".toString(); // 文件的默認保存名
// 讀到流中
InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路徑
// 設置輸出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
// 循環取出流中的數據
byte[] b = new byte[100];
int len;
try {
while ((len = inStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
// 下載網絡文件
int bytesum = 0;
int byteread = 0;
URL url = new URL("windine.blogdriver.com/logo.gif");
try {
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = new FileOutputStream("c:/abc.gif");
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
posted @
2015-01-04 16:32 ForMeBlog 閱讀(190) |
評論 (0) |
編輯 收藏
原始的message.xml
<?xml version="1.0" encoding="UTF-8"?><users>
<Messages>
<sendName>sendUsers</sendName>
<receiveName>snake</receiveName>
<date>2007-12-04 12:20:00</date>
<status>1</status>
<message>this is Content</message>
</Messages>
</users>
java程序
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class UpdateXml {
public static boolean doc2XmlFile(Document document, String filename) {
boolean flag = true;
try {
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
// transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(filename));
transformer.transform(source, result);
} catch (Exception ex) {
flag = false;
ex.printStackTrace();
}
return flag;
}
public static Document load(String filename) {
Document document = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new File(filename));
document.normalize();
} catch (Exception ex) {
ex.printStackTrace();
}
return document;
}
public static void xmlUpdateDemo() {
Document document = load("message.xml");
Node root = document.getDocumentElement();
if (root.hasChildNodes()) {
NodeList ftpnodes = root.getChildNodes();
for (int i = 0; i < ftpnodes.getLength(); i++) {
NodeList ftplist = ftpnodes.item(i).getChildNodes();
for (int k = 0; k < ftplist.getLength(); k++) {
Node subnode = ftplist.item(k);
// if (subnode.getNodeType()==Node.ELEMENT_NODE&&subnode.
// getNodeName()=="ftp-chn")
// {
// ftpnodes.item(i).removeChild(subnode);
// }
if (subnode.getNodeType() == Node.ELEMENT_NODE
&& subnode.getNodeName() == "status") {
subnode.getFirstChild().setNodeValue("9");
}
}
}
}
doc2XmlFile(document, "message.xml");
}
public static void main(String args[]) throws Exception {
UpdateXml.xmlUpdateDemo();
}
}
修改后的message.xml
<?xml version="1.0" encoding="UTF-8"?><users>
<Messages>
<sendName>sendUsers</sendName>
<receiveName>snake</receiveName>
<date>2007-12-04 12:20:00</date>
<status>9</status>
<message>this is Content</message>
</Messages>
</users>
posted @
2014-07-29 17:05 ForMeBlog 閱讀(533) |
評論 (0) |
編輯 收藏
摘要: 一、概述
ant 是一個將軟件編譯、測試、部署等步驟聯系在一起加以自動化的一個工具,大多用于Java環境中的軟件開發。在實際軟件開發中,有很多地方可以用到ant。
開發環境:
System:Windows
JDK:1.6+
IDE:eclipse
ant:1.9.1
Email:hoojo_@126.com
Blog:http://blog....
閱讀全文
posted @
2014-07-29 17:01 ForMeBlog 閱讀(279) |
評論 (0) |
編輯 收藏
摘要: Ant是一個Apache基金會下的跨平臺的構件工具,它可以實現項目的自動構建和部署等功能。在本文中,主要讓讀者熟悉怎樣將Ant應用到Java項目中,讓它簡化構建和部署操作。 一. 安裝與配置
下載地址:http://ant.apache.org...
閱讀全文
posted @
2014-07-29 16:49 ForMeBlog 閱讀(3223) |
評論 (0) |
編輯 收藏
在開放過程中有時候工作環境不編譯文件,解決方案如下:
1、確保 project->build automatically 已經被選上。
2、如果選上了也不好使, 使用這一招: project->clean..->選第2個clean select project,,勾上start build immediatelly。
3、刪除現在的項目,提前設置好編譯文件輸出路徑,重新導入源文件,設置MyEclipse為保存時編譯,然后在保存的時候就可以自動編譯了。
4、如果項目里引了某個不用的jar包,而那個包又被你刪了,就會出現不報錯但怎么也編譯不出來class文件的情 況,可以把所有包都刪除,然后一個一個的再引入(需要的),不要一下子把所有包都引入來,沒用的可能會引起不良后果。
5、想刪掉某個class文件重新生成,刪除class文件后,但classes目錄下的文件夾被其它程序打開,比如Total Commander。此時編譯也不會通過,在problems下可能會提示“con't delete classes ……”,關掉其它程序重新編譯即可。
6、還有種情況是remove掉 JRE System Library,重新導入即可編譯。但是什么原因導致的還不清楚。
7、把build path中所有包都remove掉,然后又add jars,add libraries把需要的加進去,居然又開始編譯了。
8、project->properties->java build path->source->.../WEB-INF/src的output folder不要默認,編輯讓它指向../WEB-INF/classes然后重新點擊build工程即可自動編譯。我的問題出在這里,我把這個編譯目錄給誤刪了。
9、再就是最重要的要看工程下面是否缺少了work目錄,由于CVS控制時不把work加如版本,所以 checkout后沒有這個目錄,要手工加上有的工程就能自動編譯了最開始的時候,我只找到了前面7個方法,但是他們都沒有解決我的問題,無意中我打開了"Problems"標簽,發現里面說缺少work目錄,手工 加上,然后刷新項目就可以了,最后兩個是我在寫這個總結的時候發現的,特別是第九條對使用CVS進行版本控制的項目比較有用.classpath這個xml文件要仔細看。
posted @
2014-04-24 15:48 ForMeBlog 閱讀(12275) |
評論 (0) |
編輯 收藏
weblogic安裝的系統是window,weblogic版本是8.1.5版本,運行weblogic服務后,查看bea\user_projects\domains\mydomain\myserver目錄下myserver.log文件(我這邊建的服務是默認的服務myserver,如果你沒有用默認服務,那你就到你建的server下面找),以記事本的方式打開文件,查找file.encoding等于的值,這個默認是系統的編碼,如果系統編碼不適合你當前的編碼,可以通過下面方式修改我們weblogic的編碼。
一、首先修改啟動文件startWebLogic.cmd,將編碼改變
startWebLogic.cmd文件在bea\user_projects\domains\mydomain目錄下,以記事本方式打開,拉到最下面有一下內容:
%JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% -Dweblogic.Name=%SERVER_NAME% -Dweblogic.ProductionModeEnabled=%PRODUCTION_MODE% -Djava.security.policy="%WL_HOME%\server\lib\weblogic.policy" weblogic.Server 在“%JAVA_OPTIONS%”后面添加-Dfile.encoding="UTF-8",中間要用空格但是不要換行。
二、重新啟動weblogic服務
重啟weblogic服務后,可以到bea\user_projects\domains\mydomain\myserver目錄下查看myserver.log文件里面的file.encoding值變成了UTF-8,則證明修改成功了。
posted @
2014-04-09 16:53 ForMeBlog 閱讀(8712) |
評論 (0) |
編輯 收藏
一、搭建框架的目的
主要學習了解各個框架之間如何結合使用。了解用戶訪問到返回給用戶結果的流程怎樣進行,原理是什么。怎樣才能深入理解使用框架。
二、項目實現目標
用戶訪問頁面填寫用戶名和密碼,進過后臺處理返回登錄成功或失敗。
三、理解項目流程
首先,用戶訪問login.jsp頁面,瀏覽器顯示登錄要填寫的信息,點擊提交后首先在web.xml里面配置Struts攔截器會處理,之后轉到struts.xml,根據用戶訪問的請求找到相應的配置,根據配置找到applicationContext.xml里面bean對于的Java文件,對于這個對象Spring里面有數據庫操作類的注入,這使得Action類能夠連接數據庫并處理數據,Action類里面返回處理結果,根據struts.xml配置返回相應的界面。
下載
項目文件四、數據庫代碼
1
create table USERINFO
2
(
3
ID NUMBER,
4
USERNAME VARCHAR2(50),
5
PASSWORD VARCHAR2(50)
6
)
posted @
2014-03-07 17:53 ForMeBlog 閱讀(474) |
評論 (0) |
編輯 收藏
摘要: 學習能力代表著成長的加速度,大家上場的時候,其實速度都差不到那里去。但是過了幾年,差距就拉大了。因為有人在 5 檔上飚車,有人在 1 檔慢慢前行…還有在開倒車。
對于職場新人,雇主在學習能力方面更為重視。畢竟和有經驗的員工相比,公司招應屆生,你的潛力還是一個關鍵因素。
本文包括 3 部分:
· &nbs...
閱讀全文
posted @
2014-02-24 11:15 ForMeBlog 閱讀(277) |
評論 (0) |
編輯 收藏
初學struts也是一知半解,比如action與dispatchAction的區別,最近便讓我十分困惑。
做為一個初學者,在目前使用過的東西中,主要有mapping.findForward(),action,dispatchAction三個實用功能,這三者放在一起本不太合適,但是在我看來,也有一定的相關性。
struts主要用途
1. 判斷url傳值所要做的操作。比如 http://www.baidu.com/index.jsp?run=showAll ,這個如果使用了action,可以使用request.getParameter()接收。
2. 使用mapping.findForward(url);替換servlet的response.sendRedirect("http://www.baidu.com");
3. 把form提交的內容封裝到formBean。這樣在使用了大量form的時候,可以用formBean的一實例lf.formName這樣去調用。
好處在于不用使用request.getParameter("formName");去接收。
4. 使用dispatchAction,在struts-config.xml中進行配置,直接可以判斷get鏈接中的傳值,也可以避免使用request.getParameter("formName");去接收。
formBean與dispatchAction的區別:
顯而易見,formBean使用在大量的post表單的情況下。
dispatchAction常用來處理url鏈接中傳來的值。
Action與dispatchAction的區別:
這里使用區別并不合適,因為dispatchAction繼承自Action,所以dispatchAction是對action進行了功能的擴充,action常需要使用getParameter()先獲取傳入的值,再判斷這個值是否正常,再重定向到不同的頁面。
而dispatchAction把判斷放以了struts-config.xml文件中,而不需要再到業務層進行判斷。并且dispatchAction在使用中,更常用于處理url傳入的get請求。
Struts的生存周期
啟動web服務器 -- 加載web.xml文件 -- 產生ActionServlet實例 -- 加載struts-config.xml文件 -- 解析出多個action并放入actionMapping池
客戶端發現請求 -- web容器 -- 請求發送到ActionServlet -- 分發到不同的action并實例化 -- 模型層處理 -- 處理結果返回到actionServlet -- 返回結果到視圖層
舉例
下面是一個使用了dispatchAction的項目的完整struts-config.xml配置
---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans />
<global-exceptions />
<global-forwards />
<form-beans> //formbean的定義,name="loginForm"對應于下文中的name="loginForm"
<form-bean name="loginForm" type="org.jsw.struts.form.LoginForm" />
</form-beans>
<action-mappings >
<action //定義了一個action
path="/manager" //此action的訪問路徑
name="loginForm" //此action用于接收哪個formbean,對應于上文<form-beans>中的內容
parameter="method" //此action用于接怍method的值,如果method值是add,那么自動調用業務層的add方法
type="com.umt.struts.action.ManagerAction">
<forward name="success" path="/success.jsp"></forward> //定義了重向向地址
<forward name="delete" path="/delete.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="com.jsw.struts.ApplicationResources" />
</struts-config>
posted @
2013-11-05 16:37 ForMeBlog 閱讀(476) |
評論 (0) |
編輯 收藏
String str = "";//add your string content
InputStream inputStream = new ByteArrayInputStream(str.getBytes());
1 package org.kodejava.example.io;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.InputStream;
5
6 public class StringToStream {
7 public static void main(String[] args) {
8 String text = "Converting String to InputStream Example";
9
10 /*
11 * Convert String to InputString using ByteArrayInputStream class.
12 * This class constructor takes the string byte array which can be
13 * done by calling the getBytes() method.
14 */
15 try {
16 InputStream is = new ByteArrayInputStream(text.getBytes("UTF-8"));
17 } catch (UnsupportedEncodingException e) {
18 e.printStackTrace();
19 }
20 }
21 }
22
1、字符串轉inputStream
- String string;
-
- InputStream is = new ByteArrayInputStream(string.getBytes());
2、InputStream轉字符串
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- int i;
- while ((i = is.read()) != -1) {
- baos.write(i);
- }
- String str = baos.toString();
- System.out.println(str);
3、String寫入OutputStream
- OutputStream os = System.out;
- os.write(string.getBytes());
4、OutputStream寫入String
這聽起來有點荒謬,OutputStream本來就是輸出源,還寫入String?
不過最近項目里確實遇到了個類似的問題,比如 SOAPMessage.writeTo(OutputStream os) 這個方法,是將SOAPMessage的內容寫到一個輸出流中,而我想得到這個流的內容,總不能把他先寫進文件再去讀這個文件吧,研究了好半天,終于想起可以如下這般:
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- String str = baos.toString();
這里需要用到一個特殊的類ByteArrayOutputStream,利用他,我們可以將輸出流在內存中直接轉換成String類型。
具體代碼如下:
首先從輸入流中將數據讀出來寫入ByteArrayOutputStream,然后再將其轉換成String.
- InputStream in = urlconn.getInputStream();
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
-
- byte[] buffer = new byte[2048];
- int length = 0;
- while((length = in.read(buffer)) != -1) {
- bos.write(buffer, 0, length);
- }
- in.close();
-
-
- new String(bos.toByteArray(), "UTF-8");
-
-
根據同樣的原理,我們可以將outputstream直接轉換成String對象。
指定一下字符集
byte[] b = str.getBytes("utf-8");
String s = new String(b,"utf-8");
OUTPUTSTREAM中方法WRITE用法
void write(byte[] b)
將 b.length 個字節從指定的 byte 數組寫入此輸出流。
void write(byte[] b, int off, int len)
將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此輸出流。
abstract void write(int b)
將指定的字節寫入此輸出流。
轉載地址:
http://blog.csdn.net/soundtravel/article/details/6927006
posted @
2013-07-11 16:18 ForMeBlog 閱讀(352) |
評論 (0) |
編輯 收藏
解決方案1(推薦):
只需要在project build path中先移除JRE System Library,再添加庫JRE System Library,重新編譯后就一切正常了。
解決方案2:
Windows -> Preferences -> Java -> Compiler -> Errors/Warnings ->
Deprecated and trstricted API -> Forbidden reference (access rules): -> change to warning
posted @
2013-06-07 15:26 ForMeBlog 閱讀(196) |
評論 (0) |
編輯 收藏
在靜態頁面中,table標簽里面的換行可以用<tr></tr>來實現換行,但是從數據庫里面讀出來的數據是數組,
遍歷出來中間沒有辦法加入<tr></tr>實現換行,結果是頁面上顯示一列。現在可以解決了,你可以試一試用下面方法。
下面是舉的一個例子你可以考到有struts 2環境的項目中看一下。
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="s" uri="/struts-tags" %>
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head>
6 <title>My JSP 'index.jsp' starting page</title>
7 <meta http-equiv="pragma" content="no-cache">
8 <meta http-equiv="cache-control" content="no-cache">
9 <meta http-equiv="expires" content="0">
10 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
11 <meta http-equiv="description" content="This is my page">
12 <!--
13 <link rel="stylesheet" type="text/css" href="styles.css">
14 -->
15 <s:head/>
16 </head>
17
18 <body>
19 <table border="0">
20 <tr>
21 <s:iterator value="{'banana','apple','orange','cherry'}" id="fruitName" status="st">
22 <td><s:property value="fruitName"/></td>
23 <s:if test="(#st.index+1)%3==0"><!-- #st.index獲取數組的下標 -->
24 </tr><tr>
25 </s:if>
26 </s:iterator>
27 </tr>
28 </table>
29 </body>
30 </html>
posted @
2012-03-17 18:47 ForMeBlog 閱讀(1912) |
評論 (0) |
編輯 收藏
你可以在struts.xml文件中修改成如下:
<action name="addnew" class="ay.jf.action.AddNewAction">
<result name="success" type="chain" >
<param name="namespace">/manager</param>
<param name="actionName">newlist</param>
<param name="method">receive</param>
</result>
</action>
<action name="newlist" class="ay.jf.action.NewLIstAction">
<result name="success">/feng.jsp</result>
</action>
posted @
2011-11-05 18:41 ForMeBlog 閱讀(987) |
評論 (0) |
編輯 收藏
在Struts2里,如果需要在Action中使用session,可以通過下面兩種方式得到
1.通過ActionContext class中的方法getSession得到
2.Action實現org.apache.struts2.interceptor.SessionAware接口的方式來對session進行操作
一、
package s2.ex.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class SessionTestAction extends ActionSupport {
public String execute() {
ActionContext actionContext = ActionContext.getContext();
Map session = actionContext.getSession();
session.put("UserName", "admin"); //設置session
return SUCCESS;
}
}
在這個例子中,通過ActionContext得到session,并往session里放置一個key為UserName,值為admin的內容。
二、下面是一個實現org.apache.struts2.interceptor.SessionAware接口來對session操作的例子
package s2.ex.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class SessionTest1Action extends ActionSupport implements SessionAware {
private Map session;
public void setSession(Map session) {
this.session = session;
}
public String execute() {
this.session.put("UserName", "admin");
return SUCCESS;
}
}
下面是一個在JSP中使用session的例子:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Session Test-JAVA中文網:http://www.javaweb.cc/</title>
</head>
<body>
<h1><s:property value="#session.USER_NAME"/></h1> <h1></h1>
</body>
</html>
此文章經過修改,根據Java中文網
地址是:http://javaweb.cc/architecture/struts/261792.shtml
posted @
2011-10-22 10:13 ForMeBlog 閱讀(1305) |
評論 (0) |
編輯 收藏
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
OutputStream out; //輸出響應正文的輸出流
InputStream in; //讀取本地文件的輸入流 //獲得filename請求參數
String filename=request.getParameter("filename");
if(filename==null){
out=response.getOutputStream();
out.write("Please input filename.".getBytes());
out.close();
return;
} //創建讀取本地文件的輸入流
in= getServletContext().getResourceAsStream("/store/"+filename);
int length=in.available(); //設置響應正文的MIME類型
response.setContentType("application/force-download");
response.setHeader("Content-Length",String.valueOf(length));
response.setHeader("Content-Disposition", "attachment;filename=\""+filename +"\" ");/** 把本地文件中的數據發送給客戶 */
out=response.getOutputStream();
int bytesRead = 0;
byte[] buffer = new byte[512];
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
in.close();
out.close();
}
}
posted @
2010-12-03 22:04 ForMeBlog 閱讀(210) |
評論 (0) |
編輯 收藏
如果你在你的數據庫中存的Blob類型的圖片,你想讀取它并顯示為圖片。你可以先建一個showimage.jsp頁面,如果你連接數據庫的密碼和用戶名跟這里不一樣,記得要改一下不然就會出錯。
<%@ page contentType="text/html;charset=bg2312"%>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>顯示數據庫圖片測試頁</title>
</head>
<body>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:denglu","root","root");
Statement stmt=con.createStatement();
String sql=new String();
sql = "select id from picturenews";
ResultSet rs=stmt.executeQuery(sql);
//顯示最后一條記錄的圖片
rs.last();
%>
<table>
<tr><td><img src='testimageout.jsp?id=<%=rs.getInt("id")%>'></td></tr>
</table>
</body>
</html>
在建另一頁面讀取數據庫中圖片testimageout.jsp
<%@ page contentType="text/html; charset=gbk" %>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*, javax.sql.*" %>
<%@ page import="java.util.*"%>
<%@ page import="java.math.*"%>
<%
String photo_no = request.getParameter("photo_no");
//mysql連接
Class.forName("com.mysql.jdbc.Driver").newInstance();
String URL="jdbc:mysql://localhost:3306/todream";
Connection con = DriverManager.getConnection(URL,"root","root");
try{
// 準備語句執行對象
Statement stmt = con.createStatement();
String sql = " SELECT * FROM todream_exhibition WHERE id = "+ photo_no;
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
Blob b = rs.getBlob("workimg");
long size = b.length();
//out.print(size);
byte[] bs = b.getBytes(1, (int)size);
response.setContentType("image/jpeg");
OutputStream outs = response.getOutputStream();
outs.write(bs);
outs.flush();
rs.close();
}
else {
rs.close();
response.sendRedirect("./images/error.gif");
}
}
finally{
con.close();
}
%>
轉載http://wenwen.soso.com/z/q114766705.htm 如果你想嘗試你必須要將數據庫建好,并與這一樣或將jsp頁面改了跟你的一樣。
posted @
2010-11-16 13:49 ForMeBlog 閱讀(1211) |
評論 (0) |
編輯 收藏
今天是星期四,這一星期過的還是比較好的,過的很充分,每節課都聽得進去。學習的東西基本上都會。昨天定了立個計劃,現在也知道自己干什么啦!這星期過后可能就要考試了,不過我不是太緊張,因為我個人認為自己學的還會可以吧!每天學習10分鐘10年之后你將會成為這方面的專家。
posted @
2009-12-03 15:38 ForMeBlog 閱讀(166) |
評論 (0) |
編輯 收藏