tomcat下jsp出现getOutputStream() has already been called for this response异常的原因和解决Ҏ(gu)
在tomcat下jsp中出现此错误一般都是在jsp中用了(jin)输出(如输出图片验证码Q文件下载等Q,
没有妥善处理好的原因?br />
具体的原因就?br />
在tomcat中jsp~译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最?br />
有一D这L(fng)代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
q里是在释放在jsp中用的对象Q会(x)调用response.getWriter(),因ؓ(f)q个Ҏ(gu)是和
response.getOutputStream()相冲H的Q所以会(x)出现以上q个异常?/p>
然后当然是要提出解决的办法,其实挺简单的Qƈ不是和某些朋友说的那?-
jsp内的所有空格和回RW号所有都删除掉)(j)Q?/p>
在用完输出以后调用以下两行代码即可:(x)
out.clear();
out = pageContext.pushBody();
最后这里是一个输出彩色验证码例子Q这L(fng)例子几乎随处可见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>test.employee
Ҏ(gu)。在搭徏环境前,需要处理一个问题:(x)因ؓ(f)Spring2.5 AOP Liberaries?/span>Hiberate冲突Q我们需要删?/span>asm2.2.3.jar。具体的删除Ҏ(gu)Q避免在Tomcat下删除了(jin)Q然后又重新发布目时此jar下)(j)Q在MyEclipse?/span>à?/span>à?/span>à?/span>à】在spring2.5 AOP Libraries
架构Ӟ先整?/span>Spring + Hibernate 完成S2SH一?/span>Srping 的整?/span> Q添?/span>Hibernate在添?/span>Hibernate】中讄数据库连接。所用的mysql/jdbc的jar包ؓ(f)mysql-connector-java-5.1.8-bin.jar?br />
】即可?/span> Q在D中找到?/span>MyEclipse?br />
包拷贝到lib?x)自动拷贝?/span>libQ由?/span>Hibernate整合Q所以在q一步无需再配|更详细?/span>hibernate.cfg.xml 模式?/span> Q不创徏sessionFactory?br />
Q添?/span>SpringQ?/span>a】,然后选择?/span>Add Spring Capbilities个类库?br />
Q生?/span>applicationContext.xml下面?br />
Q创?/span>sessionFactory?br />
Q整?/span>SpringQ在当中增加DataSource
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> 的导航中选择?/span>New DataSource and SessionFactory Q所以你可以在这里随便填一个D厅R?br />
<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>Hibernate
注意Q?/span>MySQL为:(x)jdbc:mysql://localhost:3306/test的,Ҏ(gu)视频中所学的时候,url中没有添加数据库的选择。)(j)
最后添加部分属性(d?/span>hibernate.show_sql
]]>