【问题标题】:request.getAttribute is null in servletservlet 中的 request.getAttribute 为空
【发布时间】:2013-07-18 14:03:45
【问题描述】:

我在我的 jsp 中设置 request.getAttribute 如下

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <%


        request.setAttribute("name", "anita");


        %>
        <%=request.getAttribute("name") %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <form method="POST" action="QnAAuthServlet">

    <input type="hidden" name="orgName" value="SENDFORBOB"></input>
    <input type="submit"></input>
    </form>
    </body>
    </html>

我也可以在我的 JSP 中打印它

我正在尝试在我的 servlet 中请求 request.getAttribute,如下所示

    public class QnAAuthServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

        public QnAAuthServlet() {
            super();

        }

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        }

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        enter code here
            String name = (String) request.getAttribute("name");
            System.out.println("name = " + name);

        }

    }

但名称在我的 servlet 中始终为空。请有人帮我解决这个问题。

【问题讨论】:

    标签: jsp servlets


    【解决方案1】:

    一个请求代表...一个HTTP请求。一旦服务器完成为请求生成响应,请求就不再存在。当你的 servlet 执行时,它会得到一个新的 HttpServletRequest 对象,当然 JSP 存储在上一个请求中的属性早就忘记了。

    如果要将数据从 HTML 页面(由 JSP 生成)传递到 servlet,则必须作为请求参数传递,或作为表单输入发送。

    【讨论】:

    • 但是,我如何将对象从 JSP 发送到 servlet?不只是一个字符串。该对象具有内部获取器来获取其中的值。
    • 有几种可能性。 1. 根本不要传递物体。将数据保存到数据库中,稍后再检索。 2. 使用几个隐藏字段 3. 使用会话,......没有具体问题要解决,很难提供好的答案。
    • 好的。我也试过这个。但是 session.getAttribute("name");适用于非 IE 浏览器。但是,不在 IE 上。我已将 IE 中接受 cookie 的级别设置为低以使其正常工作。为什么会这样?你能告诉我在这种情况下我可以使用 urlrewriting 吗?
    【解决方案2】:

    这是因为您正在向 servlet 发送一个新请求。只要请求完成,请求参数就会存在,并且在提供响应时不可用。

    如果你想传递名字,你将不得不做这样的事情

    <input type="hidden" name="name" value="someValue">
    

    如果您希望参数可用于多个请求,那么您可以使用HttpSession

    session.setAttribute("name","prasad");
    

    【讨论】:

    • 好的。我也试过这个。但是 session.getAttribute("name");适用于非 IE 浏览器。但是,不在 IE 上。我已将 IE 中接受 cookie 的级别设置为低以使其正常工作。
    • 我需要一点说明,当我在 servlet 中执行 request.setAttribute 并尝试在转发的 jsp 中获取 request.getAttribute 时,我将获得价值。这是如何运作的?在内部,jsp 也是一个 servlet。对吗?
    【解决方案3】:

    如果我理解正确,您的 servlet 正在收到一个新请求。如果您需要在请求中将名称传递给 servlet,那么您需要创建一个名称为“name”的输入元素。您无法设置将在呈现当前页面的请求中发布的请求。

    【讨论】:

    • 目前在这个例子中我只传递了字符串。但是,在我的实际实现中,我必须将一个对象从 jsp 传递给 servlet。所以,如果我创建输入元素,那将无济于事。
    • 除非您使用 spring 或其他东西将您的请求映射为一个对象,否则您将无法在您的请求中包含一个对象。
    • 可能不建议这样做,但您可以在会话中放置一个对象。我看不出有任何理由为什么您要在 JSP 中的请求中放置一个值以让它在请求中返回,因为这已经在服务器端呈现。
    • 好的。我也试过这个。但是 session.getAttribute("name");适用于非 IE 浏览器。但是,不在 IE 上。我已将 IE 中接受 cookie 的级别设置为低以使其正常工作。为什么会这样?你能告诉我在这种情况下我可以使用 urlrewriting 吗?
    • 会话在服务器端维护,不受用户浏览器的影响。也许你应该再调查一下。
    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多