我第一次尝试使用JSF,但我不了解JSF的JSP标记库。
在Eclipse(Indigo)下创建新JSP文件时,我可以选择一些模板:
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 %>
指令?
感谢您的帮助
答案 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。