Java Web学习笔记——Servlet

时间:2023-02-24 19:08:10

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方法发送了一个表单给浏览器。如下图所示:

Java Web学习笔记——Servlet

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对象。
HttpServletRequest方法增加了以下几个方法:
  • 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方法。