JSP的本质就是Servlet,我们将编号的JSP部署到Web容器中,Web容器会将JSP编译成对应的Servlet。直接使用Servlet的坏处:Servlet的开发效率低,当使用Servlet生成表现层页面时,页面中所有的HTML标签,都需要采用Servlet的输出流来输出,非常麻烦。现在的Servlet责任主要是作为控制器使用,不再用来生成页面标签,不充当视图角色。
Servlet是特殊的java类,这个类必须继承HttpServlet,每个
Servlet可以响应客户端的请求。
Servlet提供不同的方法用于响应客户端请求。
- doGet:用于响应客户端的GET请求。
- doPost:用于响应客户端的POST请求。
- doPut:用于响应客户端的PUT请求。
- doDelete:用于响应客户端的DELETE请求。
常用的就是GET和POST两种,Servlet为了响应这两两种请求,必须重写doGet()和doPost()方法。大部分时候,
Servlet对于所有请求的响应都是一样的,这时可以采用重写service()方法来响应客户端的所有请求。另外,HttpServlet还包含两个方法。
- init(ServletConfig config):创建Servlet实例时,调用该方法的初始化Servlet资源。
- destroy():销毁Servlet实例时,自动调用该方法的回收资源。
下面提供一个Servlet的示例,该Servlet将获取表单请求参数,并将请求参数显示给客户端。
//Servlet必须继承HttpServlet类
@WebServlet(name="firstServlet"
, urlPatterns={"/firstServlet"})
public class FirstServlet extends HttpServlet
{
//客户端的响应方法,使用该方法可以响应客户端所有类型的请求
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,java.io.IOException
{
//设置解码方式
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charSet=GBK");
//获取name的请求参数值
String name = request.getParameter("name");
//获取gender的请求参数值
String gender = request.getParameter("gender");
//获取color的请求参数值
String[] color = request.getParameterValues("color");
//获取country的请求参数值
String national = request.getParameter("country");
//获取页面输出流
PrintStream out = new PrintStream(response.getOutputStream());
//输出HTML页面标签
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet测试</title>");
out.println("</head>");
out.println("<body>");
//输出请求参数的值:name
out.println("您的名字:" + name + "<hr/>");
//输出请求参数的值:gender
out.println("您的性别:" + gender + "<hr/>");
//输出请求参数的值:color
out.println("您喜欢的颜色:");
for(String c : color)
{
out.println(c + " ");
}
out.println("<hr/>");
out.println("您喜欢的颜色:");
//输出请求参数的值:national
out.println("您来自的国家:" + national + "<hr/>");
out.println("</body>");
out.println("</html>");
}
}
上面 的Servlet类继承了HttpServlet类, 表明它可作为一个Servlet使用。
Servlet和JSP的区别在于:
- Servlet中没有内置对象, 原来JSP中 的内置对象都必须由程序显式创建。
- 对于静态的HTML标签, Servlet都必续使用页面输出流逐行输出。
普通Servlet类里的service()方法的作用, 完全等同于JSP生成Servlet类的_jspServlce()方法。 因此原JSP页面的JSP脚本、静态HTML内容, 在普通Servlet里都应该转换成service()方法的代码或输出语句:原JSP声明中的内容, 对应为在Servlet中定义的成员变量或成员方法。