jsp useBean通过servlet的getAttribute为NULL
用户在servlet中为null。如果你做错了,请告诉我 我正在尝试获取BeanRateCode.jsp中的所有html元素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
<%@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>
您创建了一个请求范围beanuser
,但一旦加载页面,请求就完成并消失了——难怪下一个请求中的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}" />