2010年11月16日
关于HTTP请求超时字段定义
一、ConnectionRequestTimeout 超时
HttpClient 使用连接池来管理连接,这个时间是从连接池获取连接的超时时间,可以联想从数据库连接池获取数据库连接。
二、ConnectTimeout 超时
建立连接超时,客户端和服务器间建立连接进行的三次握手完成的时间
三、SocketTimeout 超时
数据传输过程中数据包之间间隔的最大时间,Http响应报文可能有多个小报文组成,
如果传输报文的间隔时间超过设置这个时间,会报 java.net.SocketTimeoutException: Read timed out 异常的
posted @
2018-04-20 14:36 ForMeBlog 阅读(341) |
评论 (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 阅读(418) |
评论 (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 阅读(405) |
评论 (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 阅读(242) |
评论 (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 阅读(1463) |
评论 (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", "//");
-
- 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 阅读(425) |
评论 (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 阅读(180) |
评论 (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 阅读(524) |
评论 (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 阅读(268) |
评论 (0) |
编辑 收藏
摘要: Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作。 一. 安装与配置
下载地址:http://ant.apache.org...
阅读全文
posted @
2014-07-29 16:49 ForMeBlog 阅读(3210) |
评论 (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 阅读(12237) |
评论 (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 阅读(8694) |
评论 (0) |
编辑 收藏
一、搭建框架的目的
主要学习了解各个框架之间如何结合使用。了解用户访问到返回给用户结果的流程怎样进行,原理是什么。怎样才能深入理解使用框架。
二、项目实现目标
用户访问页面填写用户名和密码,进过后台处理返回登录成功或失败。
三、理解项目流程
首先,用户访问login.jsp页面,浏览器显示登录要填写的信息,点击提交后首先在web.xml里面配置Struts拦截器会处理,之后转到struts.xml,根据用户访问的请求找到相应的配置,根据配置找到applicationContext.xml里面bean对于的Java文件,对于这个对象Spring里面有数据库操作类的注入,这使得Action类能够连接数据库并处理数据,Action类里面返回处理结果,根据struts.xml配置返回相应的界面。
下载
项目文件四、数据库代码
1create table USERINFO
2(
3 ID NUMBER,
4 USERNAME VARCHAR2(50),
5 PASSWORD VARCHAR2(50)
6)
posted @
2014-03-07 17:53 ForMeBlog 阅读(465) |
评论 (0) |
编辑 收藏
摘要: 学习能力代表着成长的加速度,大家上场的时候,其实速度都差不到那里去。但是过了几年,差距就拉大了。因为有人在 5 档上飚车,有人在 1 档慢慢前行…还有在开倒车。
对于职场新人,雇主在学习能力方面更为重视。毕竟和有经验的员工相比,公司招应届生,你的潜力还是一个关键因素。
本文包括 3 部分:
· &nbs...
阅读全文
posted @
2014-02-24 11:15 ForMeBlog 阅读(266) |
评论 (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 阅读(465) |
评论 (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 阅读(347) |
评论 (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 阅读(189) |
评论 (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 阅读(1906) |
评论 (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 阅读(981) |
评论 (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 阅读(1297) |
评论 (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 阅读(206) |
评论 (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 阅读(1201) |
评论 (0) |
编辑 收藏