存档

‘茶余饭后’ 分类的存档

getOutputStream() has already been called for this response

2009年9月3日 root 没有评论

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),
没有妥善处理好的原因。
具体的原因就是
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。

然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样–
将jsp内的所有空格和回车符号所有都删除掉),

在使用完输出流以后调用以下两行代码即可:
out.clear();
out = pageContext.pushBody();

最后这里是一个输出彩色验证码例子(这样的例子几乎随处可见)
imag.jsp

<%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%@ page import="java.io.OutputStream" %>
<%!
Color getRandColor(int fc,int bc){
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
try{
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
OutputStream os=response.getOutputStream();
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(rand,13*i+6,16);
}
session.setAttribute("rand",sRand);
g.dispose();

ImageIO.write(image, "JPEG",os);
os.flush();
os.close();
os=null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
}
catch(IllegalStateException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}%>

分类: 茶余饭后 标签:

给Tomcat,Apache配置gzip压缩(HTTP压缩)功能

2009年9月2日 root 没有评论

背景:
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人

一,对于Tomcat5.0以后的版本是支持对输出内容进行压缩的. 使用的是gzip压缩格式

下面是tomcat5.5.20 中的$tomcat_home$/conf/server.xml的原内容

1 < Connector port ="80" maxHttpHeaderSize ="8192"
2 maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
3 enableLookups ="false" redirectPort ="8443" acceptCount ="100"
4 connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="utf-8" />
5
7
8

从上面的第8行内容可以看出,要使用gzip压缩功能,你可以在Connector实例中加上如下属性即可
1) compression=”on” 打开压缩功能
2) compressionMinSize=”2048″ 启用压缩的输出内容大小,这里面默认为2KB
3) noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩
4) compressableMimeType=”text/html,text/xml” 压缩类型

我这里的配置内容为:

1 2 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
3 enableLookups="false" redirectPort="8443" acceptCount="100"
4 connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf-8"
5 compression="on"
6 compressionMinSize="2048"
7 noCompressionUserAgents="gozilla, traviata"
8 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
9
11
12
19

ps:对于某些文本文件比如:log、txt等文件,我们也可以让服务器采用gzip压缩传输,修改conf目录下web.xml,添加


log
text/plain

等,就可以指定压缩传输了。通常情况下,压缩传输能大幅度提高展示速度。

二,对于Apache而言,有两种情况
1)针对Apache2.0之前的版本,它原本是不支持的,不过可以通过添加第三方的module_gzip模块来启用
2)针对Apache2.0及之后的版本,Apache提供支持, 不过不叫gzip,而叫mod_deflate
下面就对Apache2.0及之后的版本作一个说明
1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#,
2) 添加LoadModule deflate_module modules/mod_deflate.so
3) 在VirtualHost中添加
1
2 SetOutputFilter DEFLATE
3 BrowserMatch ^Mozilla/4 gzip-only-text/html
4 BrowserMatch ^Mozilla/4\.0[678] no-gzip
5 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
6 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
7 Header append Vary User-Agent env=!dont-vary
8

9

我这里面有一个完整的演示
1# 加载deflate模块
2LoadModule headers_module modules/mod_headers.so
3LoadModule deflate_module modules/mod_deflate.so
4
5 DocumentRoot f:/apacheTest
6
7 SetOutputFilter DEFLATE
8 BrowserMatch ^Mozilla/4 gzip-only-text/html
9 BrowserMatch ^Mozilla/4\.0[678] no-gzip
10 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
11 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
12 Header append Vary User-Agent env=!dont-vary
13

14

分类: 茶余饭后 标签:

忙乱了一阵子终于有点时间更新自己的博客了!

2009年8月29日 root 没有评论

最近一段时间可忙死了,公司网站改版,程序重新设计了下。现在的界面跟以前是完全不一样了,现在的美工还可以,是我工作三年来第一次遇见这么好的美工。以前遇到的一些美工做的东西太差了。现在是美工做好页面,切页面和程序都是我负责,可把我累坏了,连更新博客的时间都没有了!不过值得庆幸的是,这次网站改版自己比较满意,自己收获也不小。
以后应该是可以稍微轻松点了,以后研究下如何推广网站,把重点放在网站推广方面。
人太累了,也就变懒了,就写到这里吧。

分类: 茶余饭后 标签:

jQuery插件Add2Cart添加到购物车实现JS动态提示添加到购物车效果

2009年8月5日 root 没有评论

经常看到在一些购物类网站提供把产品添加到购物车的动态添加提示效果,把产品添加到购物车的提示效果实质是实现一个把产品原图大小的图片添加到购物车图片上的动画,增加一个产品原图具有阴影效果的图片放在购物车上,jQuery插件Add2Card可实现添加到购物车功能,具体大家可查看一下演示:
下载:add2card-demo

分类: 茶余饭后 标签:

java UTF-8转换GB2312

2009年8月5日 root 没有评论

Java则采用了平台无关的UNICODE,Java从一个byte流中读取一个字符串时,将把平台 相关的byte转变为平台无关的Unicode字符串。在输出时Java将把Unicode字符串转变为平台相关的byte流,如果某个Unicode字 符在某个平台上不存在,将会输出一个’?'。
GB2312编码中一个汉字是16位的,而UTF8中一个汉字却是24位的。
如果发出页面采用了UTF-8的编码,怎样实现转换到gb2312?

private String utf8Togb2312(String str){
StringBuffer sb = new StringBuffer();
for(int i=0; i char c = str.charAt(i);
switch (c) {
case '+':
sb.append(' ');
break;
case '%':
try {
sb.append((char)Integer.parseInt(
str.substring(i+1,i+3),16));
}
catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
i += 2;
break;
default:
sb.append(c);
break;
}
}
// Undo conversion to external encoding
String result = sb.toString();
String res=null;
try{
byte[] inputBytes = result.getBytes("8859_1");
res= new String(inputBytes,"UTF-8");
}
catch(Exception e){}
return res;
}

分类: 茶余饭后 标签:

Java解析JSON的方法

2009年7月24日 root 没有评论
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.HashMap;
import java.util.Map;
 
import org.json.JSONException;
import org.json.JSONObject;
 
public class Test {
 
    public static void main(String[] args) throws JSONException {
        String json = "{\"name\":\"reiz\"}";
        JSONObject jsonObj = new JSONObject(json);
        String name = jsonObj.getString("name");
 
        jsonObj.put("initial", name.substring(0, 1).toUpperCase());
 
        String[] likes = new String[] { "JavaScript", "Skiing", "Apple Pie" };
        jsonObj.put("likes", likes);
 
        Map <String, String> ingredients = new HashMap <String, String>();
        ingredients.put("apples", "3kg");
        ingredients.put("sugar", "1kg");
        ingredients.put("pastry", "2.4kg");
        ingredients.put("bestEaten", "outdoors");
        jsonObj.put("ingredients", ingredients);
        System.out.println(jsonObj);
 
        System.out.println(jsonObj);
    }
}

json

分类: 茶余饭后 标签:

今天把博客程序升级到了2.8版本

2009年6月15日 root 没有评论

前几天登录博客后台,有提示WordPress升级到了2.8版本,当时没时间去升级。在本地的程序上升级了下,没弄好,有错误显示,因为当时忙于一个网站上线,所有就没有再弄这个。今天想起来了,于是把服务器上的程序文件下载到本地,数据也更新到服务器上的,然后利用后台的自动升级开始升级,升级很顺利,等过了段时间后一看升级的页面,显示已经升级成功。升级成功后发现几个插件无法使用,也有随之的更新,于是利用插件的自动更新。有几个插件自动更新一会就好了,只是遇到了两个无法更新成功,于是从网上下载最新的手动更新,更新也很顺利一会更新完了。等更新完后,把本地的所有程序文件上传到服务器,替换原来旧的文件,然后把数据库也更新掉。整个更新都很顺利也很简单,没有开始想的那么复杂,不愧有这么多人使用整个blog程序,这个程序真的很不错!

分类: 茶余饭后 标签:

男人穿衣更讲究,测测你的“衣Q”有多高!

2009年6月10日 root 没有评论

分类: 茶余饭后 标签:

使用这个博客的几点问题

2009年4月10日 root 没有评论

从前天装上这个博客,开始只是转了几篇文章,有些是自己以前写的,有些是转载别人的。知道今天写blog 才发现其中的几个问题:

    1、默认的编辑器不是可视化编辑器;开始可以顶格写,如果分段最好空一行,然后输入四个空格后开始一个新的段落。
    2、自己选的这个模板有些小问题,侧边栏不能关闭,这个无大碍可以忍受。
    3、虽然已经修改了几个地方在firefox中的CSS问题,但是还有这个页面登录成功,操作成功提示的时候页面显示样式有问题,需要有时间去修改下。

正体来说这个blog程序还算不错,有些功能我还没全看到,以后就用这个blog记录自己的点点滴滴了。

希望自己每天都更新…

分类: 茶余饭后 标签: ,

职业生涯——强歼

2009年4月8日 root 没有评论

职业生涯——强歼

裸奔的狗原创

你觉得现在的工作就像被强歼,没有自己的意志。
那么既然反正都是被强歼,总要选张舒服点的床。
如果连床也没得选,也得逃到个过路人多的地方,想呼救的时候也方便些。
————虽然被其他人救了也不过是被带到其他地方继续被强歼
只是,可能现在强歼你的人比刚才那个更有钱,事后给你的补偿多点。
于是我们的职业生涯就是由一次一次的被不同的,或者相同的人强歼所构成的。

其实,强歼对你也不是对你完全没有好处。
你也在被强歼的时候也逐渐累计了被强歼的经验,
慢慢的懂得了如何让强歼你的人更舒服,也让自己慢慢的学着喜欢被强歼。
又过了一段时间,你已经忘记了你是在被强歼,
你觉得没人强歼你会非常的不习惯,生活也要求你必须不断的被人强歼才能活下去
到了这时候,你已经不是在被强歼,而是一个妓女。

你终于完成了你的原始积累,有了些钱,于是开始报复,到处强歼别人
其实,当你最后爬到了这个位置,就有了资格强歼别人,没人会觉得奇怪。
你已经知道,
虽然在你现在在强歼着别人,
但是同时也得自愿被更高的人鸡歼,
但是你已经乐在其中,不再想去寻求解脱,你的职业生涯也就此完结。

然后,你写了本书,
是你的自传,
书的名字叫做《强歼》
那书中有第一句话,
你说你一直用那句话来鞭策自己,才能平步青云。
那句话就是:

亲爱的性伙伴啊,请记得,如果长期处在被强歼的最底层,那你很快就会患上性病,口味刁点的也就不削强歼你了…………………………

2006年10月30日

分类: 茶余饭后 标签: ,