Servlet学习笔记(二)
摘要:今天学习了Servlet API中的第二个包:java.http.servlet。该包中的许多类型覆盖了javax.servlet 中的类型。同时,该包中利用了HTTP提供的特性。
HttpServlet
Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http。 前几日刚刚学习了java.servlet 。在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口和类,而今天学习的javax.servlet.http,在包中定义了采用HTTP通信协议的HttpServlet类。与servlet类似,在使用HttpServlet时,还要使用HttpServletRequest和HttpServletResponse对象。它们分别继承与servle中的ServeltRequest与ServeltResponse。HttpServelt常用来接收与发送HTML表格。下面给出一个实例。
处理HTML表单
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormServlet extends HttpServlet {
public void destroy() {
super.destroy();
}
private static String Title = "Form";
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>" +
Title +
"</title></head>");
out.println("<body><h1>" +
Title +
"</h1><form method='post'>");
out.println("<table><tr><td>Name:</td>" +
"<td><input name='name' /></td></tr>");
out.println("<tr><td>Address:</td>" +
"<td><textarea name='address' cols='40' rows='5'>" +
"</textarea></td></tr>");
out.println("<tr><td>Country:</td>" +
"<td><select name='country'><option>USA</option>" +
"<option>China</option></select></td></tr>");
out.println("<tr><td>Delivery Method:</td>" +
"<td><input type='radio' name='deliveryMethod'value='firstClass' />First Class"
+ " <input type='radio'name='deliveryMethod' value='secondClass'>SecondClass</td></tr>");
out.println("<tr><td>Shipping Instructions:</td>" +
"<td><textarea name='shippingInstruction' cols='40' rows='5'></textarea></td></tr>");
out.println("<tr><td> </td>" +
"<td><textarea name='shippingInstruction' cols='40' rows='5'></textarea></td></tr>");
out.println("<tr><td>Please send me the latest product catalog:</td>" +
"<td><input type='checkbox' name='catalogRequest' /></td></tr>");
out.println("<tr><td> </td>" +
"<td><input type='reset'/><input type='submit'></td>" +
"</tr></table></form>" +
"</body></html>");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>" +
Title +
"</title></head>");
out.println("<body><h1>" +
Title +
"</h1>");
out.println("<table><tr>" +
"<td>Name:</td><td>"
+ request.getParameter("name") + "</td></tr>");
out.println("<tr><td>Address:" +
"</td><td>"
+ request.getParameter("address") + "</td></tr>");
out.println("<tr><td>Country:" +
"</td><td>"
+ request.getParameter("country") + "</td></tr>");
out.println("<tr><td>Delivery Method:" +
"</td><td>"
+ request.getParameter("deliveryMethod") + "</td></tr>");
String[] instructions = request
.getParameterValues("shippingInstruction");
out.println("<tr><td>Shipping Instructions:" +
"</td><td>");
if (instructions != null) {
for (String instruction : instructions) {
out.println(instruction + "<br/>");
}
}
out.println("</td></tr>");
out.println("<tr><td>Catalog Request:" +
"</td><td>");
if (request.getParameter("catalogRequest") != null) {
out.println("Yes");
} else {
out.println("No");
}
out.println("</td></tr></table>" +
"</body></html>");
out.flush();
out.close();
}
public void init() throws ServletException {
}
}
在HttpServlet中,通常不需要再覆盖service方法。HttpServlet中的service方法会查看通常用来发送请求的HTTP方法(通过调用request与getMethod)。并调用一下某个方法(doGet,doPost,doTrace,doOptions,doDelete,doHead,doPut)。在这七个HTTP方法中,doGet与doPost是最常用的。因此在HttpServlet中,常常是重写doGet与doPost方法。
doGet与doPost方法
当用户通过浏览器调用该Servlet类时,通过调用doGet方法发送了一个表单给浏览器。如下图所示:
doGet方法,将显示提交客户端信息而且信息长度有限制。所以不适合处理含保密信息的数据以及传输大量数据
在程序中,有如下代码:
<form method='post'>"
说明表单的方法被设置为post,当用户提交表单时,采用的是HTTP POST方法。与doGet方法相比,doPost方法允许客户端提交没有长度限制的信息,而且不会显示的将信息显示在浏览器地址栏中。何时调用doGet和doPost方法没有具体限制,当调用get方法时,则Servlet调用doGet方法,而调用post方法时,则调用doPost方法。在上面的程序中,表单的method被设置为post,则在调用Servlet时,将调用doPost方法。
HttpServletRequest与HttpServletResponse
在上述程序中,doGet与doPost方法中均包含参数HttpServletRequest与HttpServletResponse对象。它们分别继承于ServletRequest与ServletResponse。
其中HttpServletRequest方法增加了以下几个方法:
- String getContextPath()。返回表示请求context的请求URI部分。
- Cookie[] getCookies()。返回一个Cookie独享数组。
- String getHeader()。返回指定HTTP表头的值。
- HttpSession getSession()。返回与这个请求有关的session对象。
- void addCookie()。给响应对象添加Cookie。
- void addHeader()。给响应对象添加标头。
- void sendRedirect()。将浏览器重定向到指定位置。
总结:
HttpServlet与servlet差异
- HttpServlet中,不覆盖service方法,而是经常覆盖doGet与doPost方法。
- 用HttpServletRequest与HttpServletResponse对象代替ServletRequest与ServletResponse对象。
doGet与doPost方法差异
- 传输数据量,doPost方法无限制,doGet方法有限制。
- doPost方法隐藏提交的信息,doGet方法显示提交信息。
- doPost与doGet方法合适调用,取决于用户 发送的方法,若为post调用doPost方法,若为get调用doGet方法。