【发布时间】:2010-10-03 14:09:00
【问题描述】:
在得到一个可行的解决方案后,我决定更进一步地使用代码,并想出了这个:
package hu.flux.helper;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import javax.servlet.jsp.JspWriter;
import com.objectmentor.library.web.framework.mocks.*;
// A holder for formatting data
public class NameAndAddress
{
public String firstName;
public String middleName;
public String lastName;
public String address1;
public String address2;
public String city;
public String state;
public String zip;
public String FormattedString()
{
String formattedString = "<PRE>\n" + firstName;
// Add the middle name only if it contains data.
if ((middleName != null) && (middleName.length() > 0))
{formattedString += " " + middleName;}
formattedString += " " + lastName + "\n";
formattedString += address1 + "\n";
if ((address2 != null) && (address2.length() > 0))
formattedString += address2 + "\n";
formattedString += city + ", " + state + " " + zip + "\n</PRE>";
return formattedString;
}
// Print out the name and address.
public void print(Writer writer) {
long now = System.currentTimeMillis();
System.out.println("--Entering-- " + now);
PrintWriter p = new PrintWriter (writer);
p.write(this.FormattedString());
now = System.currentTimeMillis();
System.out.println("--Exiting-- " + now);
}
/*
public void print(JspWriter out) throws java.io.IOException
{ print (new PrintWriter(out)); }
*/
@SuppressWarnings("deprecation")
public static void main (String args[])
{
NameAndAddress naa = new NameAndAddress();
naa.firstName = "Brian";
naa.middleName = "Matthew";
naa.lastName = "Kessler";
naa.address1 = "Tatra u. 15/b V/3";
naa.city = "Budapest";
naa.state = "Hungary";
naa.zip = "HU-1136";
System.out.println("\nTesting PrintWriter...");
PrintWriter p = null;
try { p = new PrintWriter("d:/temp/pwriter_text.txt"); }
catch (FileNotFoundException e)
{
System.err.print ("Can not create new PrintWriter: " + e);
e.printStackTrace();
}
naa.print(p);
p.flush();
FileInputStream fis;
DataInputStream dis;
try
{
fis = new FileInputStream("d:/temp/pwriter_text.txt");
dis = new DataInputStream (fis);
while (dis.available() != 0)
{ System.out.println(dis.readLine()); }
dis.close();
}
catch (Exception e)
{
System.err.println("File input error");
}
System.out.println("\nTested PrintWriter...");
System.out.println("---------------------");
System.out.println("\nTesting JSPWriter...");
JspWriter j = null;
naa.print(j);
System.out.print("\nTested JSPWriter...");
System.out.println("---------------------");
System.out.println("\nTesting MockJspWriter");
MockJspWriter m = null;
m = new MockJspWriter(255, true);
naa.print(m);
System.out.print(m.getContent());
System.out.println("\nTested MockJSPWriter...");
System.out.println("---------------------");
}
}
我希望 print() 方法可以同时捕获 JspWriter 和 PrintWriter。
虽然此解决方案适用于 PrintWriter,但当我尝试将其作为控制台应用程序运行时,我得到以下输出:
Testing PrintWriter...
--Entering--
--Exiting--
<PRE>
Brian Matthew Kessler
Tatra u. 15/b V/3
Budapest, Hungary HU-1136
</PRE>
Tested PrintWriter...
---------------------
Testing JSPWriter...
--Entering--
Exception in thread "main" java.lang.NullPointerException
at hu.flux.helper.NameAndAddress.print(NameAndAddress.java:46)
at hu.flux.helper.NameAndAddress.main(NameAndAddress.java:101)
但是,如果我尝试从 JSP 访问 print(Writer writer),则会收到不同的错误:
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoSuchMethodError: hu.flux.helper.NameAndAddress.print(Ljavax/servlet/jsp/JspWriter;)V
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:492)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:407)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
javax.servlet.ServletException: java.lang.NoSuchMethodError: hu.flux.helper.NameAndAddress.print(Ljavax/servlet/jsp/JspWriter;)V
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:898)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:827)
org.apache.jsp.Address_jsp._jspService(Address_jsp.java:92)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
java.lang.NoSuchMethodError: hu.flux.helper.NameAndAddress.print(Ljavax/servlet/jsp/JspWriter;)V
org.apache.jsp.Address_jsp._jspService(Address_jsp.java:81)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.2 logs.
Apache Tomcat/7.0.2
当从 JSP 调用时,我可以通过添加以下代码来调用具有 JspWriter 工作的类:
public void print(JspWriter out) throws java.io.IOException
{ print (new PrintWriter(out)); }
但是,当尝试从控制台应用程序中使用 JspWriter 时(为了测试——我认为没有人需要在控制台中使用 JspWriter!),上面的控制台错误被转移到这个函数中。
如果 print(JspWriter out) 可以解决 JSP 的问题,它不应该也解决控制台应用程序的问题吗?
另外,如果 JspWriter 是一个 Writer 对象,它不应该总是一个 Writer 对象,不管是从控制台调用还是从 JSP 调用?
【问题讨论】:
-
您可能想要了解的一件事是转换对象和转换对象之间的区别。强制转换不会更改实例的类。
Object o = (Object) new Integer(1);'o' 是一个整数。您可以通过Object o = (Object) new Integer(1); System.out.println(o.getClass().getName());看到这一点。因此,在您的print()方法中,您对 Object 所做的一切就是允许传入任何实例而不会产生编译时错误。您没有做任何任何事情来更改参数的类,以便代码可以工作。 -
好的,但这是函数内部的代码。为什么 Java 不将 JspWriter 识别为对象?
-
@brian kessler - 这是一个很好的问题。我认为您有多个问题,或者我们误解了堆栈跟踪。创建一个 main(),创建一个 NameAndAddress 实例,然后尝试一下。这将从等式中删除所有 jsp/容器问题。
-
@Tony Ennis - 在制作 NameAndAddress naa 并赋予其属性值之后,我不完全确定在 main() 中放入什么。我创建了一个 PrintWriter p,对其进行了初始化,然后调用 naa.print(p) 没有错误,也没有输出。然后我创建了一个 JspWriter j,但不知道如何实例化它;当我调用 naa.print(j) 时,Java 抱怨 null 值。我将更新上面问题中发布的 NameAndAddress 类,以便我们在同一页面上。
-
是的,为了让事情变得复杂,JspWriter 是抽象的。恼人的。我得再调查一下。在你的测试中,如果你用一个文件名创建你的 PrintWriter,输出会去哪里:
p = new PrintWriter("/Users/tonyennis/Desktop/out.txt");别忘了发出flush()。
标签: java jsp servlets object printwriter