【发布时间】:2014-08-08 01:03:24
【问题描述】:
我是使用 Java Servlet 的初学者。我的 servlet 有一些问题。 我的过滤器没有被应用。我在过滤器中有一些打印语句,但我从未在控制台上看到任何打印内容,表明未应用过滤器。此外,我的过滤器应该将生成的 xml 转换为 Json 或 HTML。但它只是返回 xml 本身。
这是我的 web.xml:
<web-app>
<display-name>CP130 Assignment 8</display-name>
<servlet>
<description>Servlet obtaining stock quote from Yahoo Financial Services</description>
<display-name>CP130QuoteServlet</display-name>
<servlet-name>StockQuoteJsp</servlet-name>
<jsp-file>/Quote.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>StockQuoteJsp</servlet-name>
<servlet-class>edu.uw.rgm.web.YahooStockQuoteServlet</servlet-class>
<url-pattern>/Quote.jsp</url-pattern>
</servlet-mapping>
<filter>
<description>Filter using XSLT to format servlet response</description>
<display-name>CP130QuoteTransformFilter</display-name>
<filter-name>QuoteResponseFormatter</filter-name>
<filter-class>edu.uw.rgm.web.QuoteTransformFilter</filter-class>
<init-param>
<description>HTML transform</description>
<param-name>html-transform</param-name>
<param-value>xslt/quote2html.xslt</param-value>
</init-param>
<init-param>
<description>JSON transform</description>
<param-name>json-transform</param-name>
<param-value>xslt/quote2json.xslt</param-value>
</init-param>
<init-param>
<description>Plain transform</description>
<param-name>plain-transform</param-name>
<param-value>xslt/quote2plain.xslt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>QuoteResponseFormatter</filter-name>
<servlet-name>StockQuoteJsp</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>QuoteResponseFormatter</filter-name>
<url-pattern>/Quote.jsp</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
我已经三重检查了 web.xml 中的拼写错误
为什么我的过滤器没有作为响应应用?我还注意到 web.xml 中元素的顺序很重要。如果我在servlet 上方更改位置filters,则会出错。
编辑
过滤器:
public class QuoteTransformFilter implements Filter {
private FilterConfig cfg;
private String htmlStylePath;
private String jsonStylePath;
private String plainStylePath;
/**
* @see Filter#init(FilterConfig)
*/
@Override
public void init(final FilterConfig fConfig) throws ServletException {
cfg = fConfig;
String styleSheet = cfg.getInitParameter("html-transform");
htmlStylePath = cfg.getServletContext().getRealPath(styleSheet);
styleSheet = cfg.getInitParameter("json-transform");
jsonStylePath = cfg.getServletContext().getRealPath(styleSheet);
styleSheet = cfg.getInitParameter("plain-transform");
plainStylePath = cfg.getServletContext().getRealPath(styleSheet);
cfg.getServletContext().log(htmlStylePath);
cfg.getServletContext().log(jsonStylePath);
cfg.getServletContext().log(plainStylePath);
}
/**
* @see Filter#destroy()
*/
@Override
public void destroy() {
// no-op
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
ServletRequest requestWrapper = request;
// Illustrate the use of a request wrapper, and the use of a request document
if ("application/json".equals(request.getContentType()) && request instanceof HttpServletRequest) {
final ObjectMapper mapper = new ObjectMapper();
Properties props = mapper.readValue(request.getReader(), Properties.class);
requestWrapper = new PropertyRequestWrapper((HttpServletRequest)request, props);
}
final CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse)response);
String rsType = requestWrapper.getParameter("rstype");
if (rsType == null) {
rsType = "html";
}
cfg.getServletContext().log("rsType = '" + rsType +"'");
// pass the request along the filter chain
chain.doFilter(requestWrapper, responseWrapper);
final String xml = responseWrapper.toString();
System.out.println("printing rstype = "+rsType);
Source styleSource = null;
String responseStr = xml;
if (!rsType.equals("xml")) {
// Select the appropriate sytle sheet
if (rsType.equals("plain")) {
System.out.println("plain");
response.setContentType("text/plain");
styleSource = new StreamSource(plainStylePath);
} else if (rsType.equals("json")) {
response.setContentType("application/json");
styleSource = new StreamSource(jsonStylePath);
} else {
response.setContentType("text/html");
styleSource = new StreamSource(htmlStylePath);
}
// Process the XML document using the stylesheet
final StringReader sr = new StringReader(xml);
final Source xmlSource = new StreamSource(sr);
try {
final TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer;
transformer = transformerFactory.newTransformer(styleSource);
final CharArrayWriter caw = new CharArrayWriter();
final StreamResult result = new StreamResult(caw);
cfg.getServletContext().log("Transforming...");
transformer.transform(xmlSource, result);
responseStr = caw.toString();
} catch(final TransformerConfigurationException ex) {
cfg.getServletContext().log("Config error", ex);
return;
} catch (final TransformerException e) {
cfg.getServletContext().log("Transform error", e);
return;
}
}
System.out.println(responseStr);
response.setContentLength(responseStr.length());
final PrintWriter out = response.getWriter();
out.write(responseStr);
out.close();
}
}
我为 GET 请求尝试的 URL 是:
http://localhost:8080/StockQuote/Quote.jsp?symbol=GOOG&rstype=plain
【问题讨论】:
-
向我们展示过滤器代码和您提出的请求示例(URL 和其他相关详细信息)。
-
@SotiriosDelimanolis:在上面添加了它们。
-
您正在使用
ServletContext记录您的消息。那是寄到哪里的?你检查过吗?您是否尝试过调试您的应用程序并单步执行代码?您是否尝试过更改过滤器代码以引发异常并查看异常是否出现? -
我在上面的代码中插入了打印语句,看看它是否打印在控制台上。但什么都没有打印出来。我会检查日志文件。在过滤器代码中抛出异常是个好主意。现在让我检查一下
-
@SotiriosDelimanolis:我尝试在过滤器的 init 方法中抛出异常。但不会抛出异常。我还发现 index.jsp 没有在localhost:8080/StockQuote 加载。页面是空的
标签: java jsp servlets web.xml servlet-filters