Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jsp useBean通过servlet的getAttribute为NULL_Jsp_Servlets_Javabeans - Fatal编程技术网

jsp useBean通过servlet的getAttribute为NULL

jsp useBean通过servlet的getAttribute为NULL,jsp,servlets,javabeans,Jsp,Servlets,Javabeans,用户在servlet中为null。如果你做错了,请告诉我 我正在尝试获取BeanRateCode.jsp中的所有html元素 <%@page import="com.hermes.data.RateCode_" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Rate Code</t

用户在servlet中为null。如果你做错了,请告诉我

我正在尝试获取BeanRateCode.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>
RateCode.java(javaBean)


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

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

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

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

<%@ 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>
您创建了一个请求范围bean
user
,但一旦加载页面,请求就完成并消失了——难怪下一个请求中的
null
与此请求完全无关。您可能想做的是:

1) 从jsp页面中完全删除
,使其看起来如下所示:

<%@ 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>

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

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

<jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="session">
    <jsp:setProperty name="user" property="*"/>
</jsp:useBean>
user
是一个可怕且令人困惑的属性名称,顺便说一句,我想把它重命名为
rateCode
或其他什么,但最后没有这个奇怪的

但是,它将不包含任何内容。
getCode()
getDescription()
将返回
null
尚未填充所有请求参数,此时您正试图在servlet中访问它。只有当您将包含参数的请求转发回JSP页面时,它才会这样做。但是,这超出了servlet中的业务逻辑

您需要自己收集它们作为请求参数。首先去掉JSP中的整个
内容,并在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}" />

(这仅对敏感,您希望安装JSTL并使用
fn:escapeXml

不,您不需要JSP中的
。别提了,当您在实际servlet中使用MVC(级别2)方法时,它实际上没有任何价值。
仅适用于MV设计(MVC 1级)。为了节省收集请求参数的样板代码,请考虑使用MVC框架或Apache Cube BeANUTLS。有关提示,请参见下面的链接

另见:

我们可以将其作为一个Bean(费率代码)来获取,这样我就不必逐个绑定它了。和RateCodeBean.thanx.budy中的所有html输入元素一样,它可以工作,但为什么不能与servlet一起工作呢。得到空值。除了JSP之外,还有其他方法可以做到这一点吗。如果不使用framework.scope=“session”,则在会话中也会给出NULL。问题是,如果希望bean根据表单输入的值设置属性,则必须在表单提交后调用。如果直接转到Servlet,它将与会话作用域一起工作,但1)必须使用request.getSession().getAttribute(“用户”)2)注意,如果将表单放入表单页面,当表单为空时,bean将尝试在页面加载时填充。因此,该bean在servlet中不会为null,但不会设置属性。是的,我尝试了此请求。getSession()。getAttribute(“用户”)我找到了“用户”但代码和描述的值为空。为此,我们必须为每个页面添加另一个jsp for forward,如果出现验证错误,所有html表单都将为空,用户必须重新填充。这也是一种将其填充在同一jsp中的方法。这里是链接,但使用的是转发和另一个jsp。[链接]thanx buddy。我也做了同样的事情,
action=“forward.jsp”
forward.jsp
,我得到了
RateCode\uuuuser=request.getAttribute(“RateCode”)
,但是如何在没有另一个jsp(forward.jsp)的情况下填充Bean RateCode,这样我就不必像在struts中那样逐个获取参数。我必须只使用JSP,servlet。正如答案中所解释的,不要使用
JSP:useBean
。在servlet中填充它。但是如何填充呢?正如你所说
req.getParameter(“code”)
有没有办法在bean b'z中填充,因为我在jsp中有这么多输入字段。Thanx表示您的支持。@Ryan:不,它在两种情况下都有效。但是当您使用servlet时,这是没有意义的。它在basic/starter无服务JSP纯Web应用程序中很有用。您只需要了解它的生命周期。它不提供任何控制请求/响应的方法。仅对数据进行预/后处理,而不进行其他处理。你可以入侵一个getter,它执行业务操作方法并返回结果,但这很难看。servlet为您提供了控制请求/响应和调用操作的干净方法。如果您的唯一目的是在servlet中填充bean,请检查commons BeanUtils或使用类似JSF的MVC框架。@Ryan:另请参见:和
<jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="session">
    <jsp:setProperty name="user" property="*"/>
</jsp:useBean>
RateCode_ user = (RateCode_) request.getSession().getAttribute("user");
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.
<input type="text" name="code" value="${user.code}" />
<input type="text" name="description" value="${user.description}" />