JSP还是XHTML? PWC6228:模板文本正文中不允许#{...}

时间:2012-10-04 09:23:11

标签: jsp templates jsf el facelets

我第一次尝试使用JSF,但我不了解JSF的JSP标记库。

在Eclipse(Indigo)下创建新JSP文件时,我可以选择一些模板:

  • 新的JavaServer Faces(JSF)页面(html)
  • 新的JavaServer Faces(JSF)页面(xhtml)
  • 新的JavaServer Faces(JSF)页面(xhtml,xml语法)
  • ...

html模板使用<%@ taglib prefix="..." uri="..." %>,而xhtml模板使用<html xmlns:...="...">

当我选择xhtml模板时,似乎不支持JSF taglib,因为当我使用<h:outputText value="#{bean.beanMethod}" />时,我收到了异常:

  

[#| 2012-10-04T10:51:45.734 + 0200 |警告| glassfish3.1.1 | javax.enterprise.system.container.web.com.sun.enterprise.web | _ThreadID = 39; _ThreadName = Thread- 2; | ApplicationDispatcher [/ testjsf] PWC1231:servlet jsp的Servlet.service()抛出异常   org.apache.jasper.JasperException:/b.jsp(14,25)PWC6228:模板文本正文中不允许#{...}。       在org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:81)       在org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:376)       在org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:188)       at org.apache.jasper.compiler.Validator $ ValidateVisitor.visit(Validator.java:755)       在org.apache.jasper.compiler.Node $ ELExpression.accept(Node.java:947)       在org.apache.jasper.compiler.Node $ Nodes.visit(Node.java:2297)       在org.apache.jasper.compiler.Node $ Visitor.visitBody(Node.java:2347)       在org.apache.jasper.compiler.Node $ Visitor.visit(Node.java:2353)       在org.apache.jasper.compiler.Node $ Root.accept(Node.java:499)       在org.apache.jasper.compiler.Node $ Nodes.visit(Node.java:2297)       at org.apache.jasper.compiler.Validator.validate(Validator.java:1882)       在org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:223)       在org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)       在org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)       在org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)       在org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)       在org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:847)       在org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)       在org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:787)       在org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)       在org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)       在org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)       在org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)       在org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)       at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:546)       at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:364)       在com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:154)       at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)       在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)       在com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)       在javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)       在org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)       在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)       在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)       在org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)       在org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)       在com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)       at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)       在org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)       在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)       at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)       at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)       在com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)       在com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)       at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)       at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)       在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)       在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)       在com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)       at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)       在com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)       在com.sun.grizzly.ContextTask.run(ContextTask.java:71)       at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532)       在com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:513)       在java.lang.Thread.run(Thread.java:722)

使用html模板,它可以正常工作。

那么如何将JSF与xhtml模板一起使用?

使用:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

在一起,但我相信声明xmlns将取代<%@ taglib %>指令?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

大约3年前,JSP作为JSF 2.0视图技术已经deprecated。你为什么要用呢?


回到你的具体问题:

  

PWC6228:模板文本正文中不允许#{...}。

这基本上意味着<h:outputText>尚未被FacesServlet解析,因此被解释为普通模板文本,包括EL表达式。但是,JSP中不支持模板文本中的#{}<p>#{foo}</p>中的<h:outputText>。它仅在其继任者Facelets中得到支持。

FacesServlet未解析的<url-pattern>只能表示浏览器地址栏中显示的请求网址与FacesServlet的{​​{1}}不匹配正如在webapp的/WEB-INF/web.xml中所定义的那样。这样,FacesServlet将不会被调用,并且不会解析所有JSF组件并将其视为纯文本。

也许您已将其映射到*.xhtml,这说明Facelets文件工作正常?然后,您应该按b.xhtml而不是b.jsp打开它。

然而,如上所述,自JSF 2.0以来,JSP已被弃用。它不允许您使用所有JSF 2.0的强大功能,例如<h:head><f:ajax>等,更不用说Facelet templating awesomeness了。忘记JSP并坚持其继任者Facelets。