【问题标题】:JSTL Populate server-side variablesJSTL 填充服务器端变量
【发布时间】:2014-02-05 16:41:14
【问题描述】:

下载 NetBeans 项目here。文件 -> 下载

使用JSTL 1.2 我试图让我的网络应用程序记住我的输入,然后在提交表单后将其放入输入框中,但由于某种原因它不记得了。我只有 1 个.java 类和.jsp 文件。

PersonController.java

package controller;

public class PersonController {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="controller.PersonController" %>

<jsp:useBean id="personController" class="controller.PersonController" scope="session"/>
<jsp:setProperty name="personController" property="name" param="name"/>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>PersonController</title>
    </head>
    <body>
        <form method="post" action="index.jsp">
            <input name="name" maxlength="30" type="text" id="name" value="<c:out value="${personController.name}"/>"><br/>
            <input type="submit" name="button" value="Remember my name">
        </form>
    </body>
</html>

错误

  1. HTTP 状态 500 - /index.jsp (line: 4, column: 0) useBean 类属性 controller.PersonController 的值无效。

  2. 如果它没有显示错误 #1,那么它不会在发布之前的输入后填充输入字段 name

【问题讨论】:

    标签: java jsp jstl


    【解决方案1】:

    对于您的第一个错误,我调试了您的代码,并且您创建了一个参数化构造函数。您需要在 PersonController 类中添加默认构造函数。它将解决您的“useBean 类属性控制器的值。PersonController 无效”错误。

    对于正在设置的值,您使用的是Controller并提供了doGet方法但尚未定义为Servlet类,它是一个普通的java类。您需要使用 HttpServlet 类对其进行扩展。

    谢谢。

    【讨论】:

      【解决方案2】:

      如果您只想在提交后记住您的输入,则不需要 PersonController.java。 就这样写吧:

      <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
      
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
              <title>PersonController</title>
          </head>
          <body>
              <form method="post" action="index.jsp">
                  <input name="name" maxlength="30" type="text" id="name" value="<c:out value="${param.name}"/>"><br/>
                  <input type="submit" name="button" value="Remember my name">
              </form>
          </body>
      </html>
      

      【讨论】:

        【解决方案3】:

        这行不通。

        &lt;jsp:useBean&gt; 在默认范围(即页面)中查找名称为 personController 的 bean,并将其提供给您的 JSP 的其他部分,在您的情况下为 html 输入标记。但是没有人将这个 bean 设置到 pageScope 中,所以 useBean 将创建 PersonController 的新实例并放在那里。因此 name 值为 null。

        如果你不使用任何重定向,你可以简单地根据 HTTP 请求的参数填充输入的值:

        <input name="name" value="<c:out value="${param.name}"/>">
        

        如果您使用 HTTP 重定向(您应该在发送 POST 请求后),您可以将 name 存储到会话中。

        <jsp:useBean id="personController" class="controller.PersonController" scope="session"/>
        <jsp:setProperty name="personController" property="name" param="name"/>
        

        &lt;jsp:setProperty&gt; 将先前找到(或创建)的 bean personalController 的名称属性设置为名称为 name 的请求参数的值。

        【讨论】:

        • 这个答案对我不起作用,能否请您删除以便我的问题仍未得到解答?
        • 错误与第 4 行有关,即useBean - 来自您的代码。看起来 PersonController 不能作为 WEB-INF/classes/controller/PersonController 使用。即使没有建议的 setProperty 标记,您也会收到此错误。
        • 另一个原因是您的类无效,JSP 无法识别它。尝试将import="controller.PersonController" 添加到&lt;%@ page ... %&gt; 指令中。
        • 我们必须首先解决class attribute controller.PersonController is invalid 问题,但我没有想法。您可以仔细检查您的异常堆栈跟踪是否有任何其他提示?比如ClassNotFoundException...
        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        相关资源
        最近更新 更多