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
およびのすべてのフィールドがaddress
null として表示されます。