如何使用<fmt:setLocale>为JSP设置语言环境?

Bri*_*ler 0 jsp locale jstl setlocale

我正在尝试在JSP中设置本地.

我以为我能做的事情如下:

<fmt:setLocale value="${param['local']}" scope="session"/>
Run Code Online (Sandbox Code Playgroud)

关于这个主题的Java自己的页面似乎说得非常多.

但是,当我去执行它时,我得到:

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: /pages/ResourceBundlesJSTL.jsp(11,0) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
 org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
 org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
 org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
 org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1232)
 org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:868)
 org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1539)
 org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
 org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)
 org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)
 org.apache.jasper.compiler.Node$Root.accept(Node.java:475)
 org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
 org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1787)
 org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:211)
 org.apache.jasper.compiler.Compiler.compile(Compiler.java:360)
 org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
 org.apache.jasper.compiler.Compiler.compile(Compiler.java:327)
 org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:594)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:316)
 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
Run Code Online (Sandbox Code Playgroud)

我也试过了

<fmt:setLocale value="<%= param['local'] %>" scope="session"/>
Run Code Online (Sandbox Code Playgroud)

我得到了同样的错误.

Bal*_*usC 5

有几种可能的原因.从你的问题中直接看出它是哪一个.无论如何我会在这里提到它们.

  • 如果您的web.xml根声明至少不符合Servlet 2.4(这意味着JSP 2.0在运行时taglib中支持EL时),就会发生这种情况.由于已经有好几年了,而且你正在使用与Servlet 3.0兼容的servlet容器,我将它重新声明为Servlet 3.0.

    <web-app 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0"> 
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果fmttaglib声明至少不符合JSTL 1.1(专为JSP 2.0设计),也会发生这种情况.确保它看起来像TLDDOC:

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    
    Run Code Online (Sandbox Code Playgroud)

    (没有/jsp表示JSTL 1.0)

  • 如果您的JSTL版本中存在过时的JSTL版本,Webapp/WEB-INF/lib或者Tomcat/lib像JSTL 1.0甚至是遗留的雅加达版本,也会发生这种情况.对于Tomcat 6.x或更新版本,最好在这里选择JSTL 1.2 (并且不要忘记删除旧版本standard.jar!).