【问题标题】:jsp useBean is NULL by getAttribute by servletjsp useBean 通过 servlet 的 getAttribute 为 NULL
【发布时间】:2011-06-28 23:15:24
【问题描述】:

用户在 servlet 中为空。如果做错了请让我。

我正在尝试获取 bean rateCode.jsp 中的所有 html 元素

<%@page import="com.hermes.data.RateCode_" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title>Rate Code</title>
    </head>
    <body>      
         <jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="request" >
            <jsp:setProperty name="user" property="*"/></jsp:useBean>
            <form  id="f_rateCode" action="/ratePromoCodes" method="post"  >
                <table align="center" border="1" cellspacing="0">
                    <tr>
                        <td colspan="2" align="center" class="header">Rate Code Administrations</td>
                    </tr>
                    <tr>
                        <td align="right" style="border-style: solid;">Rate Code:</td>
                        <td align="left" style="border-style: solid;">
                            <input type="text" id="code" name="code" value="${user.code}"  size="10" maxlength="32" style="width: 100px"/>
                    </td>
                </tr>

                <tr>
                    <td align="right" style="border-style: solid;">Rate Description:</td>
                    <td align="left" style="border-style: solid;">
                        <input type="text" id="description" name="description" value="<%=user.getDescription()%>" maxlength="128" size="40"></td>
                </tr>              
                <tr><td><input type="submit" value="ok" /></td> </tr>
            </table>
        </form>

Servlet - ratePromoCodes

protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        RateCode_ rc = (RateCode_) req.getAttribute("user");
        Enumeration an = req.getAttributeNames();
        Enumeration pn = req.getParameterNames();
        Object o = null;
        while (an.hasMoreElements()) {
            o = an.nextElement();
            System.out.println(o);
        }
        while (pn.hasMoreElements()) {
            o = pn.nextElement();
            System.out.println(o);
        }
    }

RateCode.java (javaBean)

public class RateCode_  {    
    private String code ;
    private String description;
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

【问题讨论】:

    标签: jsp servlets javabeans


    【解决方案1】:

    您正在 JSP 中使用请求范围的 bean。这个 JSP 被提交并且一个 Servlet 响应。

    当 Servlet 被执行时,一个新的“生命周期”开始了,并且请求范围不包含在 JSP 中使用/创建的任何请求范围 bean。

    您必须将 bean 的属性作为请求参数提交,并在 servlet 中一一读取。

    【讨论】:

    • 我们可以将它作为一个 Bean (RateCode) 来获取,这样我就不必一个接一个地绑定它。自动像 RateCode bean 中的所有 html 输入元素一样。
    【解决方案2】:

    问题(及其解决方案)如下:

    您创建了一个请求范围 bean user,但是一旦页面被加载,请求就完成并消失了 - 难怪它在下一个请求中是 null,这与这个完全无关。您可能想要做的是:

    1) 从您的 jsp 页面中完全删除 &lt;jsp:useBean ...&gt;,使其如下所示:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@page import="com.hermes.data.RateCode_" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head><title>Rate Code</title></head>
    <body>
    <form id="f_rateCode" action="/forwarder.jsp" method="post">
        <table align="center" border="1" cellspacing="0">
            <tr>
                <td colspan="2" align="center" class="header">Rate Code Administrations</td>
            </tr>
            <tr>
                <td align="right" style="border-style: solid;">Rate Code:</td>
                <td align="left" style="border-style: solid;"><input type="text" id="code" name="code" value=""
                                                                     size="10" maxlength="32" style="width: 100px"/></td>
            </tr>
            <tr>
                <td align="right" style="border-style: solid;">Rate Description:</td>
                <td align="left" style="border-style: solid;"><input type="text" id="description" name="description"
                                                                     value="" maxlength="128"
                                                                     size="40"></td>
            </tr>
            <tr>
                <td><input type="submit" value="ok"/></td>
            </tr>
        </table>
    </form>
    </body>
    </html>
    

    2) 您的表单现在重定向到另一个 jsp,即转发器。如下所示:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="request"/>
    <jsp:setProperty name="user" property="*" />
    <jsp:forward page="/ratePromoCodes" />
    

    这是做什么的:它在请求范围内创建 bean - 提交表单的请求。然后它使用表单中的数据填充 bean 属性,最后它转发(IN SAME REQUEST,HERE IS THE POINT)到执行某些工作的 servlet。

    3) 最后在你的 servlet 中做一些事情,我这样做是为了测试:

    public class TestServlet extends javax.servlet.http.HttpServlet {
        protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
            RateCode_ code = (RateCode_) request.getAttribute("user");
            System.out.println(code);
        }
    }
    

    【讨论】:

    • thanx 伙计,它可以工作,但为什么它不能与 servlet 一起工作。得到空。有没有其他方法可以做到这一点,但只能在 JSP 中。没有框架。
    • scope="session" 在 SESSION 中时也会给出 NULL。
    • 要点是,如果您希望 bean 具有根据表单输入的值设置的属性,您必须在表单提交后调用 。如果您直接进入 Servlet,它将与会话范围一起工作,但是 1) 您必须使用 request.getSession().getAttribute("user") 2) 请注意,如果您将 放在表单页面中,则 bean当表单为空时,将尝试在页面加载时填充。因此,bean 在 servlet 中不会为空,但属性不会被设置。
    • 是的,你说得对,我试过这个 request.getSession().getAttribute("user") 我找到了“user”,但是代码和描述的值是 NULL
    • 为此,我们必须为每个页面添加另一个 jsp 转发,如果出现验证错误,所有 html 表单将是空白的,用户必须再次填写。他们将其保持在同一个jsp中的方法也是如此。这是链接,但使用转发和另一个jsp。 [链接]javaworld.com/jw-03-2000/jw-0331-ssj-forms.html?page=3
    【解决方案3】:

    您似乎误解了jsp:useBean 的工作和目的。

    首先,您已将 bean 声明为在会话范围内,并使用当前请求的所有参数填充它。

    <jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="session">
        <jsp:setProperty name="user" property="*"/>
    </jsp:useBean>
    

    因此,这个 bean 被存储为 session 属性,名称为 user。您需要在 servlet 中将其作为会话属性而不是请求属性来检索。

    RateCode_ user = (RateCode_) request.getSession().getAttribute("user");
    

    (顺便说一句,user 是一个可怕且令人困惑的属性名称,我会将其重命名为 rateCode 之类的,最后没有这个奇怪的 _

    但是,它不会包含任何内容。 getCode()getDescription() 将返回 null&lt;jsp:setProperty&gt;not 用所有请求参数填充它,但此时您正尝试在 servlet 中访问它。只有当您将包含参数的请求转发回 JSP 页面时,它才会这样做。然而,这发生在 servlet 中的业务逻辑之外。

    您需要自己收集它们作为请求参数。首先摆脱 JSP 中的整个&lt;jsp:useBean&gt; 事物,并在servlet 的doPost() 方法中执行以下操作:

    RateCode_ user = new RateCode_();
    user.setCode(request.getParameter("code"));
    user.setDescription(request.getParameter("description"));
    // ...
    request.setAttribute("user", user); // Do NOT store in session unless really necessary.
    

    然后你可以在JSP中访问它,如下所示:

    <input type="text" name="code" value="${user.code}" />
    <input type="text" name="description" value="${user.description}" />
    

    (这里只对XSS attacks敏感,你要安装JSTL并使用fn:escapeXml

    不,您确实不需要在 JSP 中需要 &lt;jsp:useBean&gt;。保留它,当您将 MVC(第 2 级)方法与真正的 servlet 一起使用时,它实际上没有任何价值。 &lt;jsp:useBean&gt; 仅适用于 MV 设计(MVC 级别 1)。要节省收集请求参数的样板代码,请考虑使用 MVC 框架或 Apache Commons BeanUtils。另请参阅下面的链接以获取提示。

    另见:

    【讨论】:

    • 谢谢哥们。我做了同样的事情和action="forward.jsp"forward.jsp&lt;jsp:useBean id="user" class="com.data.RateCode" scope="request"/&gt; &lt;jsp:setProperty name="user" property="*" /&gt; &lt;jsp:forward page="/code" /&gt; ,我得到它RateCode_ user = request.getAttribute("rateCode")但是如何在没有另一个jsp(forward.jsp)的情况下填充Bean RateCode,所以我不必一个接一个地获取参数就像我们在 struts 中所做的那样。我只需要使用 JSP、servlet。
    • 如答案中所述,请勿使用jsp:useBean。在 servlet 中填充它。
    • 但是怎么做呢?正如你所说。 req.getParameter("code") 有什么方法可以填充 bean b'coz 我在 jsp 中有很多输入字段。感谢您的支持。
    • @Ryan:不,两者都适用。但是,当您使用 servlet 时,这是没有意义的。它在基本/入门无 servlet-only JSP webapps 中很有帮助。你只需要了解它的生命周期。它不提供任何控制请求/响应的方法。仅对数据进行预处理/后处理,仅此而已。您可以破解执行业务操作方法并返回结果的 getter,但这很难看。 servlet 为您提供了一种控制请求/响应和调用操作的简洁方法。如果您的唯一意图是在 servlet 中填充 bean,请检查 commons BeanUtils 或仅使用 JSF 之类的 MVC 框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多