---恢复内容开始---
利用隐藏表单来保持状态,与采用网址重写技术类似,但是通过隐藏表单表单的方式,其url后不显式跟随值,而是将他们放到表单中,在提交表单时,其值传递至服务器。
使用这种方式时,需要页面中本身含有表单或自己构建一个表单来使用。可以传递更多的字符且不需要进行字符编码。
下文中通过隐藏表单的方式修改类的值。
package com.slowalker.rewrite;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HiddenForm
*/
@WebServlet(name="/HiddenForm",
urlPatterns= {"/customer", "/editCustomer", "/updateCustomer"})
//一个servlet页面映射多个路径
public class HiddenForm extends HttpServlet {
private static final long serialVersionUID = 1L;
private ArrayList<Customer> customers = new ArrayList<>(2);
public void init()
throws javax.servlet.ServletException {
customers.add(new Customer(1 , "lp", "yk"));
customers.add(new Customer(2, "hx", "xa"));
}
public HiddenForm() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = request.getRequestURI();
if (url.endsWith("/customer")) sendCustomerList(request, response);
if (url.endsWith("/editCustomer")) sendEditCustomerForm(request, response);
}
protected void sendCustomerList(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.println("<html><head><title>Customer List</title></head>"
+ "<body>"
+ "<table>");
for (Customer c:customers) {
pw.println("<tr><td>" + c.getId() +"</td><td>" + c.getName() + "</td><td>" + c.getCity() +"</td>"
+ "<td>" + "<a href='editCustomer?id=" + c.getId() +"'>edit</a>" + "</td>" +"</tr>");
}
pw.println("</table></body></html>");
}
private Customer getCustomer(int id) {
for (Customer c:customers) {
if (c.getId() == id) return c;
}
return null;
}
protected void sendEditCustomerForm(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html");
int customerId = 0;
try {
customerId = Integer.parseInt(request.getParameter("id"));
}catch (NumberFormatException e){}
Customer customer = getCustomer(customerId);
PrintWriter pw = response.getWriter();
if (customer != null) {
pw.println("<html><head><title>edit customer</title></head>"
+ "<body><h2>edit customer</h2>"
+ "<form method='post' action='updateCustomer'>");
/*
* 隐藏表单
*/
pw.println("<input type='hidden' name='id' value='" + customer.getId() + "'/>");
pw.println("<table>"
+ "<tr><td>Name:</td><td>" + "<input name='name' value='" + customer.getName().replaceAll("'", "'") + "'/>" + "</td></tr>"
+ "<tr><td>City:</td><td>" + "<input name='city' value='" + customer.getCity().replaceAll("'", "'") + "'/>" + "</td></tr>");
pw.println("<tr><td conspan='2' style='text-align:right'>"
+ "<input type='submit' value='Update'/></td></tr>");
pw.println("<tr><td colspan='2'><a href='customer'>Customer List</a></td></tr>");
pw.println("</table></body></html>");
}else {
pw.println("No Customer Found");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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(request, response);
}
}