tomcat下jsp出现getOutputStream() has already been called for this response异常的原因和解决Ҏ
在tomcat下jsp中出现此错误一般都是在jsp中用了输出(如输出图片验证码Q文件下载等Q,
没有妥善处理好的原因?br />
具体的原因就?br />
在tomcat中jsp~译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最?br />
有一D这L代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
q里是在释放在jsp中用的对象Q会调用response.getWriter(),因ؓq个Ҏ是和
response.getOutputStream()相冲H的Q所以会出现以上q个异常?/p>
然后当然是要提出解决的办法,其实挺简单的Qƈ不是和某些朋友说的那?-
jsp内的所有空格和回RW号所有都删除掉)Q?/p>
在用完输出以后调用以下两行代码即可:
out.clear();
out = pageContext.pushBody();
最后这里是一个输出彩色验证码例子Q这L例子几乎随处可见Q?br /> 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();
}%>
开发环境ؓQ?/span>MyEclipse 7.1.1 + Jdk 1.6.0_13 + Tomcat 6.0.18 + MySQL 6.0.10 alpha
所用表Q?/span>test.employee
q个实例主要是实现简单的CRUDҎ。在搭徏环境前,需要处理一个问题:因ؓSpring2.5 AOP Liberaries里的asm2.2.3.jar?/span>Hiberate中的生成代理用的asm.jar冲突Q我们需要删?/span>asm2.2.3.jarQ不然就会发生异常:java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor 。具体的删除ҎQ避免在Tomcat中的lib下删除了Q然后又重新发布目时此jar又重新发不到lib下)Q在MyEclipse中?/span>Window?/span>à?/span>Preferences?/span>à?/span>MyEclipse Enterprise Workbench?/span>à?/span>Project Capabilities?/span>à?/span>Spring】在spring2.5 AOP Libraries中删?/span>asm2.2.3.jar
在开?/span>S2SH架构Ӟ先整?/span>Spring + Hibernate Q然后再整合Struts + Spring 完成S2SH架构的搭建?/span>
一?/span>Srping ?/span> Hibnernate 的整?/span>
Q?/span>1Q添?/span>Hibernate支持
在添?/span>Hibernate支持之前Q我们先在?/span>MyEclipse DataBase Explorer】中讄数据库连接。所用的mysql/jdbc的jar包ؓmysql-connector-java-5.1.8-bin.jar?br />
注意Q?/span>MySQL?/span>URL为:jdbc:mysql://localhost:3306/testQ我所Ҏ学的视频案例是连?/span>oracle的,Ҏ视频中所学的时候,url没有d数据库,在测试过E当中怎么样也扑ֈ实体Q原因就是因为在url中没有添加数据库的选择。)
后面按照默认讄一直到?/span>finish】即可?/span>
Q?/span>aQ在D中找到?/span>MyEclipse】,然后选择?/span>Add Hibernate Capbilities?br />
q里可以直接选择jar包拷贝到lib下面Q也可以先不拯Q到时?/span>MyEclipse会自动拷贝到lib下?/span>
Q?/span>bQ由?/span>Hibernate要与Spring整合Q所以在q一步无需再配|更详细?/span>hibernate.cfg.xml
在这个按列中Q我们?/span>JDBC Driver模式?/span>
Q?/span>cQ不创徏sessionFactory。然后?/span>finish?br />
Q?/span>2Q添?/span>Spring支持
Q?/span>aQ在D中找到?/span>MyEclipse】,然后选择?/span>Add Spring Capbilities?/span>
d5个类库?br />
Q?/span>bQ生?/span>applicationContext.xmlQ徏议将其放?/span>WEB-INF下面?br />
Q?/span>cQ创?/span>sessionFactory。然后?/span>finish?br />
Q?/span>3Q整?/span>Spring?/span>Hibernate
打开applicationContextQ在当中增加DataSource?/span>SessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> |
先将原先自动生成的上qC码删除?br />
然后?/span>Outline的导航中选择?/span>New DataSource and SessionFactory?br />
后面要用?/span>Mapping ResourcesQ所以你可以在这里随便填一个D厅R?br />
最后添加部分属性(d?/span>hibernate.show_sqlQ后形成代码如下Q?/span>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/test"></property> <property name="username" value="root"></property> <property name="password" value="123"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="mappingDirectoryLocations"> <list> <value>file:src</value> </list> </property> </bean> |
自此已经完成?/span>Spring?/span>Hibernate的整合?/span>