【问题标题】:using ServletContext and ServletConfig in scriptlets and EL在 scriptlet 和 EL 中使用 ServletContext 和 ServletConfig
【发布时间】:2011-10-08 16:51:37
【问题描述】:

我尝试运行以下几行。

<%=application.getInitParameter("tagline")%>               
<br />
<%=config.getInitParameter("admincontact")%>

${initParam.tagline}
<br />
${pageContext.servletConfig.initParameter("admincontact")}

而我的 web.xml 是

<servlet>
<jsp-file>/index.jsp</jsp-file>
<init-param>
    <param-name>admincontact</param-name>
    <param-value>8939302763</param-value>  
</init-param>
</servlet>
    <context-param>
<param-name>tagline</param-name>
<param-value>Each one Plant one</param-value>

我在 ${pageContext.servletConfig.initParameter("admincontact")} 和空值 &lt;%=config.getInitParameter("admincontact")%&gt;.

问候, 约翰

【问题讨论】:

  • javax.el.MethodNotFoundException:无法找到具有 [1] 个参数的方法 [initParameter]

标签: jstl el jsp-tags


【解决方案1】:

关于这个有一个FAQ on JavaRanch

声明如下;

如何使用 EL 访问 servlet init 参数?

不能使用以下语法来访问 servlet 初始化参数:

${pageContext.servletConfig.initParameter.name}

您无法使用此技术获取 Servlet 初始化参数。这 getInitParameter(java.lang.String name) 不适合这种情况, 因为它需要一些参数。

根据JavaBean规范,属性有getter & setter 表单中的方法

public type1 getXXX() -- 没有参数。

public void setXXX(type1)

现在将 pageContext 视为 bean 对象。这 PageContext 类具有 getServletConfig()、getRequest()、 getSession() 等。您可以像 pageContext.page 一样访问这些, EL 中的 pageContext.request 等。

ServletContext 对象有几个方法,例如 getMajorVersion(), getMinorVersion() 没有参数。所以我们可以访问这些方法 将其视为 sevletContext bean 的属性 pageContext.servletContext.majorVersion 和 pageContext.servletContext.minorVersion。

如果你想使用 EL 访问 Servlet 初始化参数,那么它是 最好为 servlet 和 将它作为范围变量放在请求中 - 假设 初始化参数。然后,您将能够按名称获取任何参数 使用 ${requestScope.initParameters.name}。

注意

我们可以通过${initParam.name}访问上下文初始化参数

【讨论】:

  • "如果你想使用 EL 访问 Servlet 初始化参数,那么最好为 servlet 创建一个初始化参数的 Map 并将其作为作用域变量放入请求中" 怎么做?
  • @John:如果您对使用 EL 没有特别大惊小怪,那么我建议您只使用脚本调用 和 我认为您在原始问题中将这些放在了前面,这可能会导致您面临一些问题。 免责声明我已经有一段时间没有使用JSP和Java了。
【解决方案2】:

除了 Moose 先生的回答之外,我还发现了这个使用 EL 定义自定义标签的解决方案。 它在我的情况下有效。 这里link

基本上你必须像这样创建一个 Java 类:

package example.customTags;

import javax.servlet.jsp.JspPage;

public class MyFunctions {

        public static String getJspInitParameter(JspPage page, String param){
            return page.getServletConfig().getInitParameter(param);
        }
    }

像这样创建一个 tld 文件(我的文件路径是WEB-INF/myTags/customTags.tld):

<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>2.0</jsp-version>
    <short-name>Functions</short-name>
    <function>
        <name>getJspInitParameter</name>
        <function-class>example.customTags.MyFunctions</function-class>
        <function-signature>
            java.lang.String getJspInitParameter(javax.servlet.jsp.JspPage, java.lang.String)
        </function-signature>
    </function>
</taglib>

并像这样在您的 JSP 中使用它:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="my" uri="../WEB-INF/myTags/customTags.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Example</title>
    </head>
    <body>
        <c:out value="${my:getJspInitParameter(pageContext.page, 'admincontact')}"/>
    </body>
</html>

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多