【问题标题】:Accessing form data stored inside a jsp:useBean from within a servlet从 servlet 中访问存储在 jsp:useBean 中的表单数据
【发布时间】:2013-05-24 06:19:40
【问题描述】:

当用户在Login.jsp 上提交登录凭据时,我正在尝试填充一个bean 类(UserBean.javalp)。 然后从 servlet 访问这个 bean 类(ConfimUserDetails.java 也在包 lp 中)。
我无法从 Servlet 中访问 bean 类的 getUid()getPassword() 方法。

这是我所有的代码:

我在Login.jsp 中放置了以下内容,以便将表单数据映射到 bean 类。

<%@ page import="lp.UserBean" %>

<jsp:useBean id="ubean" class="lp.UserBean" scope="session"/>

<jsp:setProperty name="ubean" property="*"/> 

<form method="post" action="/TestServlet/ConfirmUserDetails">
    <table align="center">
        <tr>
            <th >Enter </th>
            <th>Login Details</th>
        </tr>
        <tr>
            <td >UserID : </td>
            <td ><input type="text" name="uid" size="15" maxlength="8" /></td>
        </tr>
        <tr>
            <td >Password : </td>
            <td ><input type="Password" name="password" size="15" maxlength="20" /></td>
         </tr>
         <tr>
            <td><input type="submit" value="Login" /></td>
        </tr>
    </table>
</form>

ConfirmUserDetails.java(接收 servlet)中的 doPost() 如下所示:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    HttpSession session = request.getSession(); 

    UserBean userBean;
    userBean = (UserBean)session.getAttribute("ubean");

    /*
    if (session.getAttribute("ubean") != null) {
        userBean = (UserBean)session.getAttribute("ubean");
    } else {
        System.out.println("bean did not get picked up-so lets create one");
        userBean = new UserBean();
        session.setAttribute("ubean", userBean);
    }
    */
    UID = userBean.getUid();
    Password=userBean.getPassword();

    PrintWriter out = response.getWriter();
    out.println(UID);

    try{
        cub = new ConfirmUserBean();
        cub= dcm.getUserData(UID,Password);
    }
    catch (Exception npe){
        System.out.println("something went wrong here");
        npe.printStackTrace();
    }

我已经在servlet中导入了上面的bean类(import lp.UserBean;)

Login.jsp 页面加载正常。然后当我点击提交时,我得到一个NullPointerException

这是堆栈跟踪 - 我正在使用 Eclipse 和 Tomcat:

May 24, 2013 7:03:00 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [lp.ConfirmUserDetails] in context with path [/TestServlet] threw exception
java.lang.NullPointerException
    at lp.ConfirmUserDetails.doPost(ConfirmUserDetails.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

如果您想查看我的 servlet 的顶部:

public class ConfirmUserDetails extends HttpServlet {

    private ConfirmUserBean cub;
    private DataConnectionManager dcm;
    private String UID;
    private String Password;
    private UserBean userBean;


    public void init(ServletConfig config) throws ServletException
    {
        super.init(config);
        dcm = new DataConnectionManager();
        dcm.setDBURL("jdbc:mysql://localhost:3306/loans");
        dcm.setDBUserName("lalinP");
        dcm.setDBPassword("lalin");

        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException e){
            System.out.println("driver could not be loaded");
            e.printStackTrace();
        }
    }

【问题讨论】:

  • 什么是行号。 70 在ConfirmUserDetailsat lp.ConfirmUserDetails.doPost(ConfirmUserDetails.java:70)?此外,您的 UserBean 不会在您的 Servlet 中包含 uidpassword 的任何值,因为 &lt;jsp:usebean&gt; 只会在会话中不存在 UserBean 时创建它,并将设置实际上为空的值当Login.jsp 被加载时。
  • 你能在第 70 行粘贴行代码吗?看来问题出在 UseBean 对象上。
  • 第 70 行读取“UID = userBean.getUid();”

标签: jsp servlets javabeans


【解决方案1】:

您似乎期望&lt;jsp:setProperty&gt; 将所有请求参数设置为bean 属性在调用servlet 之前。这是正确的。你必须自己收集和设置请求参数(或者选择一个自动完成这一切的 MVC 框架,例如 JSF、Spring MVC 等)。

&lt;jsp:setProperty&gt; 仅在 JSP 中的特定行由 JSP 引擎执行时才会执行。当您将表单提交给 servlet 时,只有当 servlet 转发到特定 JSP 时才会发生这种情况,这为时已晚。

完全摆脱&lt;jsp:useBean&gt;&lt;jsp:getProperty&gt;。当您已经在使用前端控制器 servlet 时,它们是无用的并且只会令人困惑。您需要自己在 servlet 中创建和管理 bean。使用 MVC 框架或 Apache Commons BeanUtils 可以方便地减少样板代码。

另见:

【讨论】:

  • 我明白了.. 所以,在提交表单时,不能直接使用 setproperty 属性将表单数据存储在 bean 中。我的印象是可以。请您解释一下何时可以在 JSP 页面上使用 setproperty 属性。此外,在这种情况下,最好的方法是使用 request.GetParameter() 获取数据? . 再次感谢您的帮助。
  • 点击“另请参阅”链接以获取有关这些附带问题的所有答案。
  • 至于最好的方法,这是使用现有 MVC 框架的 IMO。要查看 JSF 的 Hello World 示例,请查看 JSF wiki 页面:stackoverflow.com/tags/jsf/info。 Spring MVC(和 Struts2、Wicket、Play、Echo 等)有类似的方法(即只有一个“视图”(JSP 或 Facelet 文件)和一个“模型”(Javabean 类),你不需要'不需要编写控制器 servlet,MVC 框架提供它),但它们都超出了我的范围,所以我无法为它们指出其他示例。
  • 非常感谢您的帮助...... setProperty 属性的生命周期现在非常有意义。
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2012-08-02
  • 2013-02-17
  • 2021-01-08
  • 2016-05-22
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多