【问题标题】:Why I get null when retrieving servlet's init parameter from JSP?为什么从 JSP 中检索 servlet 的 init 参数时我得到 null?
【发布时间】:2021-04-15 08:00:04
【问题描述】:

我有 DD(web.xml 文件),代码非常简单:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>TestProject</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  <servlet-name>test</servlet-name>
  <jsp-file>/result.jsp</jsp-file>

  <init-param>
  <param-name>email</param-name>
  <param-value>example@gmail.com</param-value>
  </init-param>
  </servlet>
  
  <context-param>
  <param-name>name</param-name>
  <param-value>Max</param-value>
  </context-param>
  
</web-app>

注意我有两个参数(一个在 application 中,另一个在 configuration 范围内)。当我尝试将它们放入 result.jsp 时:

<html><body>
Name is: <%=application.getInitParameter("name") %>
<br>
Email is: <%=config.getInitParameter("email") %>
</body></html>

,我得到以下输出:

Name is: Max 
Email is: null 

我的问题很简单:“电子邮件”参数是如何获得 NULL 的?我的 JSP 文件不应该“看到”我如何配置它并返回“example@gmail.com”吗?

【问题讨论】:

    标签: java xml jsp servlets parameters


    【解决方案1】:

    这是您的整个web.xml 文件吗?您是否有机会直接在浏览器中访问 JSP?喜欢:

    http://localhost:8080/<yourAppContext>/result.jsp
    

    如果是这样,那么你会得到这样的回应:

    Name is: Max
    Email is: null 
    

    没有错。没错。

    你得到这个结果的原因是你不是通过你在web.xml中定义的配置访问JSP,你只是直接访问JSP,在后台有不同的隐式配置,不是那个你认为你正在配置。

    如果你想要这个回复:

    Name is: Max
    Email is: example@gmail.com
    

    然后你需要添加一个 servlet 映射。完整的配置是:

    <servlet>
        <servlet-name>test</servlet-name>
        <jsp-file>/result.jsp</jsp-file>
    
        <init-param>
            <param-name>email</param-name>
            <param-value>example@gmail.com</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>   
    </servlet-mapping>
    

    并且您需要访问此 URL,而不是 JSP 路径,使用:

    http://localhost:8080/<yourAppContext>/test
    

    您可能还想阅读以下内容:

    为了进一步说明这一点,重要的是要提到您需要一个映射才能使您的一个 servlet 有用。如果您只是在web.xml 中定义一个servlet,它就在那里。你需要告诉服务器如何使用它,为此你使用&lt;servlet-mapping&gt;。它告诉服务器对于路径上的请求,需要调用一些特定的 servlet 来处理请求

    您可以创建此映射以使用&lt;servlet-class&gt; 指向一个servlet 类或使用&lt;jsp-file&gt; 指向一个JSP。它们基本上是一样的,因为 JSP 最终会变成一个 servlet 类。

    我认为让您感到困惑的是(基于下面的评论),对于 JSP 文件,您已经有一些由服务器创建的隐式映射,如 here 所述。

    当你直接访问 JSP 时,用

    http://localhost:8080/<yourAppContext>/result.jsp
    

    您正在使用 隐式 服务器映射,它不包含任何附加的特殊配置(例如您要发送给它的电子邮件)。

    当你访问 JSP 时

    http://localhost:8080/<yourAppContext>/test
    

    您正在访问 您的 映射。您可以根据需要进行配置,并发送您想要的任何参数,您的 JSP 现在将能够读取它们。

    【讨论】:

    • 对不起,伙计,但我不太明白。我可以要求您重新编辑答案并进一步解释这部分:And the reason is that you are not accessing the servlet you defined in web.xml, you are just accessing the JSP directly, which is another servlet behind the scene, and not the one you think you are configuring. 你在说什么 另一个 servlet? JSP变成了Servlet,所以在运行时总共是一个 Servlet。这个细节是我困惑的核心。再感谢一次!
    • 我已经更新了我的答案。再读一遍,看看现在是否清楚。我承认我最初选择的词不是最好的。
    • 太好了,我开始慢慢了解它了。只有一件事要问,我找不到。为什么我什至必须映射 servlet?我知道用户去http://localhost:8080/&lt;yourAppContext&gt;/com.example.MyServlet 访问一个servlet 是愚蠢的(他们不在乎它在哪里)。但是为什么我在技术上做不到呢?为什么我必须制作可以运行一些 jsp 文件或 servlet 类的“假” URL?我的意思是为什么我也不能直接导航到我的应用程序中的某些文件,但我每次都需要映射帮助?
    • 因为您的浏览器可以理解 URL、HTML、HTTP 等。您的浏览器不知道 servlet 是什么,也不在乎。在其他语言和平台中,您没有 servlet,但您有其他东西。浏览器应该知道那里的每个 Web 实现吗?这就是网络的运作方式,如果你想构建一个网络应用程序,你必须遵守互联网的规则。你如何实现这是你自己的问题。打个比方:当你去餐馆时,你为什么要坐在餐桌旁点菜?你为什么不直接冲进厨房开始吃饭呢?
    • 好吧,就像你说的那样,if servlet 容器会被实现为这样工作。但他们不是。但是,如果您真的愿意,没有什么能阻止您自己实现此行为。但是您仍然需要使用“当前工作”的 servlet 容器来实现它。不过我确实建议你把时间花在更有建设性的事情上:)
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多