0

JavaBean インスタンスを共有するサーブレットと JSP があります。サーブレットはそれらを初期化し (Bean にはコンストラクターのパラメーターが必要なため)、セッションに格納し、ユーザー入力を取得してフォーム POST 要求を介してサーブレットに送信する JSP に転送します。 . サーブレットのdoPostメソッドでは、JavaBeans を再度取得しますが、フォームによって設定される値はすべて null です。代わりにフォームで GET メソッドを使用すると、値が入力され、デバッグ中に JavaBean プロパティ値が実際に設定されていることがわかります。では、なぜ私のdoPostメソッドは null 値を持つセッションから Bean を取得しますか? 興味深いことに、各オブジェクトのコンストラクター パラメーターを介して渡されるフィールドは、実際には GET であろうと POST であろうと正しく設定されます。設定されていないのは、フォームを介して管理されるプロパティだけです。

簡略化されたコード サンプル

サーブレット

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    HttpSession session = request.getSession();
    Customer customer = (Customer)session.getAttribute("customer");
    if (customer == null)
    {
        customer = new Customer(.....);
        session.setAttribute("customer", customer);
    }
    Address address = (Address)session.getAttribute("address");
    if (address == null)
    {
        address = new Address(.....);
        session.setAttribute("address", address);
    }
    forward("/checkout.jsp", request, response);
}
...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    PrintWriter out = response.getWriter();
    Customer customer = (Customer)request.getSession().getAttribute("customer");
    if (customer != null)
    {
        out.println("Customer: " + customer.toString());
    }
    Address address = (Address)request.getSession().getAttribute("address");
    if (address != null)
    {
        out.println("Address: " + address.toString());
    }
}

JSP

<jsp:useBean id="customer" class="com.mycompany.myproject.Customer" scope="session" />
<jsp:setProperty name="customer" property="*"/>
<jsp:useBean id="address" class="com.mycompany.myproject.Address" scope="session" />
<jsp:setProperty name="address" property="*"/>

...

<form method="POST" action="${pageContext.request.contextPath }/checkout">
    <table>
        <tr>
            <td>Title</td>
            <td><input type="text" name="title" value="${ customer.title }" /></td>
        </tr>
        <tr>
            <td>Given name</td>
            <td><input type="text" name="givenName" value="${ customer.givenName }" /></td>
        </tr>
        ...
    </table>
    <input type="submit" value="Place order" />
</form>

このフォームにデータを入力して [Place Order] をクリックすると、toString() 呼び出しの出力で、customerおよびのすべてのフィールドがaddressnull として表示されます。

4

1 に答える 1

0

したがって、私が望んでいないことは不可能のようです。これは私が必要としているものですが、サーブレットでBeanにアクセスした<jsp:setProperty ... property="*" />に実行したい別のJSPを提供するまで利用できません。だから私は次のいずれかを行うことができます:

  • サーブレットでBeanを使用する前に、別のJSPにリダイレクトして値を入力します
  • 手動で値を設定する
  • リフレクションを使用してそれらを設定します(おそらくスケーラビリティの勝者)
  • おそらくBeanUtilsのようなものを使用してください
于 2012-09-01T22:38:59.433 に答える