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 として表示されます。