第一个Servlet程序及分析
第一个Servlet程序:
1 package cc.openhome; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 /** 13 * Servlet implementation class HelloServlet 14 */ 15 @WebServlet("/hello.view") 16 public class HelloServlet extends HttpServlet { 17 18 /** 19 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 20 */ 21 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 22 // TODO Auto-generated method stub 23 response.setContentType("text/html;charst=UTF8");//设置响应内容类型其 24 PrintWriter out=response.getWriter();//取得响应输出对象 25 String name=request.getParameter("name");//获得"请求参数" 26 out.println("<html>"); 27 out.println("<head>"); 28 out.println("<title>Hello Servlet</title>"); 29 out.println("</head>"); 30 out.println("<body>"); 31 out.println("<h1> Hello! "+name+" !</h1>"); 32 out.println("</body>"); 33 out.println("</html>"); 34 out.close(); 35 } 36 37 /** 38 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 39 */ 40 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 // TODO Auto-generated method stub 42 } 43 44 }
范例中继承了HttpServlet,并重新定义了doGet()方法,当浏览器GET方法发送请求时,会调用此方法。
由于HttpServletResponse对象代表对客户端的响应,因此可以通过setContentType()设置内容类型。告知浏览器,要以text/html解析,采用字符编码是UTF-8。接着再调用getWriter()方法取得代表响应输出的PrintWriter对象,通过PrintWriter的println()方法输出响应的文字。
运行结果:
小结:
1、要编写Servlet类,必须继承HttpServlet类,并重新定义doGet(),doPost()等对应的HTTP请求方法,容器会分别建立代表请求、响应的HttpServletRequest和HttpServletResponse,可以从前者取得所有关于该次请求的相关信息,从后者对客户端进行各种响应。
2、在Servlet的API定义中,Servlet是一个接口,其中定义了与Servlet生命周期相关的init()、destroy()方法,以及提供服务的service()方法等。GenericServlet实现了Servlet接口,不过它直接将service()标识为abstract,GenericServlet还实现了ServletConfig接口,将容器初始化Servlet调用init()时传入的ServletConfig封装起来。真正在service()方法中定义了HTTP请求基本处理流程是HttpServlet,而doGet()doPost()传入的参数是HttpServletRequest和HttpServletResponse,不是通用的ServletRequest、ServletResponse。
3、可以使用@WebServlet标注来告知容器哪些Servlet会提供服务以及额外信息,也可以定义在web.xml中。一个Servlet至少会有三个名称,类名称、注册的Servlet名称、URL模式名称。
4、一个请求的URI实际上是由三部分组成. requestURI = contextPath+servletPath+pathInfo
requestURI可以通过HttpServletRequest.getRequestURI()得到。如:/FirstServlet/servlet/path.view
contextPath(环境路径)可以通过HttpServletRequest.getContextPath()得到如:/FirstServlet
servletPath(servlet路径)可以通过HttpServletRequest.getServletPath()得到如:/servlet
pathInfo(路径信息)可以可以通过HttpServletRequest.getPathInfo()得到如:/path.view