Java Servlet学习笔记——4.隐藏域

写在前面

这一部分学习隐藏域的知识,也会有一个实例代码。

隐藏域

使用隐藏域来保持状态类似于URL重写技术, 但不是将值附加到URL上, 而是放到HTML表单的隐藏域中。 当表单提交时, 隐藏域的值也同时提交到服务器端。 隐藏域技术仅当网页有表单时有效。 该技术相对于URL重写的优势在于: 没有字符数限制, 同时无须额外的编码。 但该技术同URL重写一样, 不适合跨越多个界面。

实例代码

下面代码将实现通过网页,利用隐藏域来更新客户信息并显示客户信息。

首先构造一个Customer类,有三个成员变量,customer id、name与city。

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;
    }
}

构造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?id=" + customer.getId()
                        + "'>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("'", "&#39;")
                        + "'/></td></tr>");
            writer.println("<tr><td>City:</td><td>"
                        + "<input name='city' value='" + customer.getCity().replaceAll("'", "&#39;")
                        + "'/></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);
    }
}

函数功能说明

1.init()函数。初始化两个Customer类。

2.sendCustomerList()函数。将Customer类成员变量信息输出打印到浏览器中。

3.getCustomer()函数。根据customerId获取对应customer成员。

4.sendEditCustomerForm()函数。将Customer类编辑表单发送到浏览器。

5.doGet()函数。Servlet响应函数,将根据URL不同调用sendCustomerList(response)或sendEditCustomerForm(request, response)函数。

6.doPost()函数。根据customerId设置对应的Customer类。并调用sendCustomerList(response)函数。

代码说明

CustomerServlet类继承自HttpServlet, 其URL映射分别为/customer、 /editCustomer和 /updateCustomer。这三个URL都会调用CustomerServlet类,前两个URL会调用Servlet的doGet方法,而/updateCustomer 会调用doPost方法。因为在函数sendEditCustomerForm()中,表单生成时有如下语句:

writer.println("<html><head>"
            + "<title>Edit Customer</title></head>"
            + "<body><h2>Edit Customer</h2>"
            + "<form method='post' "
            + "action='updateCustomer'>");

表单是通过post方式提交的, 因此调用的是servlet的doPost方法。

/customer是本例的入口URL。 该URL会列举出在init 方法中所初始化的类级别的列表对象customers(在真实应用中, 通常是从数据库中获取用户信息)。当然在第一次调用Servlet时,会调用init()函数,然后同样由于第一次调用Servlet没有其他请求信息,所以会调用sendCustomerList()函数,并向浏览器输出一个页面,附有两个href链接。

每个客户信息后都有一个edit链接,每个edit链接的href属性为 /editCustomer?id=customerId。 当通过/editCustomer访问servlet时,servlet会返回一个编辑表单。

猜你喜欢

转载自blog.csdn.net/zy2317878/article/details/80243783