《Servlet、JSP和Spring MVC初學指南》——2.2 隱藏域
本節書摘來自異步社區《Servlet、JSP和Spring MVC初學指南》一書中的第2章,第2.2節,作者:【加】Budi Kurniawan(克尼亞萬) , 【美】Paul Deck著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
2.2 隱藏域
使用隱藏域來保持狀態類似於URL重寫技術,但不是將值附加到URL上,而是放到HTML表單的隱藏域中。當表單提交時,隱藏域的值也同時提交到服務器端。隱藏域技術僅當網頁有表單時有效。該技術相對於URL重寫的優勢在於:沒有字符數限製,同時無須額外的編碼。但該技術同URL重寫一樣,不適合跨越多個界麵。
清單2.3展示了如何通過隱藏域來更新客戶信息。清單2.2的Customer類為客戶對象模型。
清單2.2 Customer類
package app02a.hiddenfields;
public class Customer {
private int id;
private String name;
private String city;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
清單2.3 CustomerServlet類
package app02a.hiddenfields;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* Not thread-safe. For illustration purpose only
*/
@WebServlet(name = "CustomerServlet", urlPatterns = {
"/customer", "/editCustomer", "/updateCustomer"})
public class CustomerServlet extends HttpServlet {
private static final long serialVersionUID = -20L;
private List<Customer> customers = new ArrayList<Customer>();
@Override
public void init() throws ServletException {
Customer customer1 = new Customer();
customer1.setId(1);
customer1.setName("Donald D.");
customer1.setCity("Miami");
customers.add(customer1);
Customer customer2 = new Customer();
customer2.setId(2);
customer2.setName("Mickey M.");
customer2.setCity("Orlando");
customers.add(customer2);
}
private void sendCustomerList(HttpServletResponse response)
throws IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("<html><head><title>Customers</title></head>"
+ "<body><h2>Customers </h2>");
writer.println("<ul>");
for (Customer customer : customers) {
writer.println("<li>" + customer.getName()
+ "(" + customer.getCity() + ") ("
+ "<a href='editCustomer?'>edit</a>)");
}
writer.println("</ul>");
writer.println("</body></html>");
}
private Customer getCustomer(int customerId) {
for (Customer customer : customers) {
if (customer.getId() == customerId) {
return customer;
}
}
return null;
}
private void sendEditCustomerForm(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
int customerId = 0;
try {
customerId =
Integer.parseInt(request.getParameter("id"));
} catch (NumberFormatException e) {
}
Customer customer = getCustomer(customerId);
if (customer != null) {
writer.println("<html><head>"
+ "<title>Edit Customer</title></head>"
+ "<body><h2>Edit Customer</h2>"
+ "<form method='post' "
+ "action='updateCustomer'>");
writer.println("<input type='hidden' name='id' value='"
+ customerId + "'/>");
writer.println("<table>");
writer.println("<tr><td>Name:</td><td>"
+ "<input name='name' value='" +
customer.getName().replaceAll("'", "'")
+ "'/></td></tr>");
writer.println("<tr><td>City:</td><td>"
+ "<input name='city' value='" +
customer.getCity().replaceAll("'", "'")
+ "'/></td></tr>");
writer.println("<tr>"
+ "<td colspan='2' style='text-align:right'>"
+ "<input type='submit' value='Update'/></td>"
+ "</tr>");
writer.println("<tr><td colspan='2'>"
+ "<a href='customer'>Customer List</a>"
+ "</td></tr>");
writer.println("</table>");
writer.println("</form></body>");
} else {
writer.println("No customer found");
}
}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String uri = request.getRequestURI();
if (uri.endsWith("/customer")) {
sendCustomerList(response);
} else if (uri.endsWith("/editCustomer")) {
sendEditCustomerForm(request, response);
}
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// update customer
int customerId = 0;
try {
customerId =
Integer.parseInt(request.getParameter("id"));
} catch (NumberFormatException e) {
}
Customer customer = getCustomer(customerId);
if (customer != null) {
customer.setName(request.getParameter("name"));
customer.setCity(request.getParameter("city"));
}
sendCustomerList(response);
}
}
CustomerServlet類繼承自HttpServlet,其URL映射分別為/customer、/editCustomer和 /updateCustomer。前兩個URL會調用Servlet的doGet方法,而/updateCustomer 會調用doPost方法。
/customer是本例的入口URL。該URL會列舉出在init 方法中所初始化的類級別的列表對象customers(在真實應用中,通常是從數據庫中獲取用戶信息),如圖2.4所示。
圖2.4 客戶列表
如圖2.4所示,每個客戶信息後都有一個edit鏈接,每個edit鏈接的href屬性為 /editCustomer? id=customerId。當通過/editCustomer訪問servlet時,servlet會返回一個編輯表單,如圖2.5所示。
圖2.5 客戶編輯表單
如果你點擊的是第一個客戶,servlet返回表單中的隱藏域如下:
<form method='post' action='updateCustomer'>
<input type='hidden' name='id' value='1'/>
<table>
<tr><td>Name:</td>
<td><input name='name' value='Donald DC.'/></td>
</tr>
<tr>
<td>City:</td><td><input name='city' value='Miami'/></td>
</tr>
<tr>
<td colspan='2' style='text-align:right'>
<input type='submit' value='Update'/>
</td>
</tr>
<tr>
<td colspan='2'><a href='customer'>Customer List</a></td>
</tr>
</table>
</form>
該隱藏域為所編輯的客戶id,因此當表單提交時,服務端就知道應更新哪個客戶信息。
需要強調的是,表單是通過post方式提交的,因此調用的是servlet的doPost方法。
最後更新:2017-05-27 18:01:28