jsp useBean由servlet的getAttribute为NULL

时间:2011-02-17 09:33:43

标签: jsp servlets javabeans

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

我试图获取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;
    }
}

3 个答案:

答案 0 :(得分:7)

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

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

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

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

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

(顺便说一下,user是一个令人困惑且令人困惑的属性名称,我将其重命名为rateCode或其他内容,最后没有这个奇怪的_

然而,它什么都没有。 getCode()getDescription()将返回null<jsp:setProperty>已经 not 用所有请求参数填充它,但此时您正尝试在servlet中访问它。只有将包含参数的请求转发回JSP页面时才会这样做。但是,这发生在servlet中的业务逻辑之外。

您需要自己将它们作为请求参数收集。在JSP中首先摆脱整个<jsp:useBean>事物,并在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中需要<jsp:useBean>。保持它,当你使用真正的servlet的MVC(2级)方法时几乎没有价值。 <jsp:useBean>仅对MV设计(MVC级别1)有用。要保存收集请求参数的样板代码,请考虑使用MVC框架或Apache Commons BeanUtils。另见下面的提示链接。

另见:

答案 1 :(得分:4)

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

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

1)从jsp页面中完全删除<jsp:useBean ...>,使其看起来如下:

<%@ 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 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);
    }
}

答案 2 :(得分:0)

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

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

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