这是我的servlet的目录结构:
+---build
| \---classes
+---Files
| esoutput.json
| newOutput.xml
| newoutputfinal.xml
| output.xml
|
+---src
| \---com
| \---example
| AddQueryTag.java
| ElasticsearchClient.java
| JsonToXml.java
| mainClass.java
| output.xml
| SaveJsonContent.java
| SaxonImplementation.java
|
+---target
| +---classes
| | +---com
| | | \---example
| | | AddQueryTag.class
| | | ElasticsearchClient.class
| | | JsonToXml.class
| | | mainClass.class
| | | output.xml
| | | SaveJsonContent.class
| | | SaxonImplementation.class
| | |
| | \---META-INF
| | | MANIFEST.MF
| | |
| | \---maven
| | \---com.example
| | \---PIBTest1
| | pom.properties
| | pom.xml
| |
| \---test-classes
\---WebContent
| firstPage.html
|
+---META-INF
| MANIFEST.MF
|
\---WEB-INF
| resultfile.html
| web.xml
|
+---lib
\---src
我的主servlet类(mainClass.java)如下所示:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Some processing code goes here
//My resultfile.html gets updated and finally I use Request Dispatcher to forward it
request.getServletContext().getRequestDispatcher("/WEB-INF/resultfile.html")
.forward(request, response);
}
这是一个搜索应用程序。用户在“firstpage.html”上输入查询并返回结果。
当我第一次启动我的网络应用程序时,“firstpage.html”在我在web.xml文件中配置时启动。因此,当我第一次启动我的网络应用程序时,它显示“firstpage.html”,然后用户输入查询并创建“resultfile.html”。但是,网络应用程序显示的是空白页面。 我检查了“resultfile.html”并正确生成了文件。所以我的代码没问题。我希望能够转发生成的“resultfile.html”页面。我在这里做错了吗?我是Servlets的新手。谢谢大家。
我正在使用Tomcat V7.0和eclipse。
更新:当用户返回“firstpage.html”并输入新查询时,“resultfile.html”会显示旧查询的结果。 “resultfile.html”不显示更新的信息。
更新2:我的“resultfile.html”由SaxonImplementation类生成。该类的代码如下:
package com.example;
import java.io.File;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class SaxonImplementation {
public void simpleTransform(String sourcePath, String xsltPath,
String resultDir) {
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
TransformerFactory tFactory = TransformerFactory.newInstance();
try {
Transformer transformer = tFactory
.newTransformer(new StreamSource(new File(xsltPath)));
transformer.transform(new StreamSource(new File(sourcePath)),
new StreamResult(new File(resultDir)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
我从mainClass.java的doGet方法调用此类来将XML转换为HTML文件。
答案 0 :(得分:1)
我不知道为什么resultsfile显示为空白。存在服务器缓存问题的可能性,但我不知道。为此我建议手动编辑文件和/或手动查看文件。您需要确定系统是写入空白文件还是仅打印空白页,即使文件可能正确。感谢您的更新。在将文件发送到客户端之前,文件未完全写入,或者存在服务器缓存问题,因为这些文件不会经常更改。请确保flush
或close
已完成FileWriter
或FileOutputStream
(您用来写resultfile.html
)之前你在请求上打电话给forward
。如果您确定已经发生这种情况,则必须是缓存问题。因此,我建议您手动阅读resultfile
并将其写入response
而不是forward
。
话虽如此,我认为您需要更改软件的设计,以提高工作效率和多用户安全性。写入共享的resultsfile.html将无法实现多用户安全。
我会将结果直接写给用户。 response
有一个名为getWriter
的函数,该函数返回Writer
,您可以使用该函数直接发送HTML'给客户。 (完全跳过resultfile.html
)
更新:Google搜索" StreamResult自定义Writer"显示此页面可能会对您有所帮助:How to convert stream results to string您可以使用new StreamResult(new File(resultDir))
而不是new StreamResult(writer)
writer
来自response.getWriter()
的结果