Servlet程序(一)
一、Servlet是什么
-
Servlet程序是一个接口
-
Servlet是JavaWeb三大组件之一
-
Servlet程序是运行在web服务器上的java小程序,它可以用来接收客户端的请求,以及响应客户端。
二、手动实现一个Servlet程序
1、创建Java类去实现servlet接口
1 public class demo implements Servlet{ 2 @Override 3 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 4 System.out.println("hello word"); 5 } 6 7 @Override 8 public void destroy() { 9 10 } 11 12 @Override 13 public ServletConfig getServletConfig() { 14 // TODO Auto-generated method stub 15 return null; 16 } 17 18 @Override 19 public String getServletInfo() { 20 // TODO Auto-generated method stub 21 return null; 22 } 23 24 @Override 25 public void init(ServletConfig arg0) throws ServletException { 26 // TODO Auto-generated method stub 27 28 } 29 }
2、实现service方法
@Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("hello word"); }
3、需要到Web.xml文件中去配置一个servlet访问地址。
<!-- servlet标签 表示在web服务器上配置了一个Servlet程序 --> <servlet> <!-- servlet唯一的名字 --> <servlet-name>HelloServlet</servlet-name> <!-- servlet全类名 --> <servlet-class>demo</servlet-class> </servlet> <!-- servlet-mapping配置一个请求地址 --> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
访问时就可以用localhost:端口号/项目名/hell就可以,因为我们再配置文件里设置了它的访问地址。
三、Servlet的生命周期
1. 调用Servlet程序的构造方法 (初次访问被调用)
2. 调用Servlet程序的init初始化方法 (初次访问被调用)
3. 调用Servlet程序的Servlet方法 (每次访问都被调用)
4. 调用Servlet程序的Servlet方法(在web工程停止时被调用)
四、GET请求和POST请求的分发处理
请求分发处理就是当客户端向服务器发出请求时,在服务器获取到请求后查看请求的类型,是GET还是POST。就是用request接口的HttpServletRequest类中的getMethod()方法得到。
1 public void service(ServletRequest request, ServletResponse response) 2 throws ServletException, IOException { 3 // 判断是GET请求还是POST请求 4 // getMethod() 可以得到, 5 HttpServletRequest httpRequest = (HttpServletRequest) request; 6 String method = httpRequest.getMethod(); 7 System.out.println("请求方式!"+method); 8 }
五、继承HttpServlet实现Servlet程序
在实际开发中,我们很少会通过实现Servlet接口的形式来实现Servlet程序,而是通继承HttpServlet抽象类来实现Servlet程序,通过重写doGet()和doPost()来分发处理来自客户端的请求!
1 public class demo1 extends HttpServlet { 2 /* 3 * 需要根据你的业务需求,重写doGet或doPost方法 4 * doGet在GET请求的时候调用 5 * doPost方法在Post请求的时候调用*/ 6 @Override 7 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 8 9 super.doGet(req, resp); 10 } 11 @Override 12 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 13 14 super.doPost(req, resp); 15 } 16 17 }
六、利用Eclipse创建Servlet程序
七、Servlet的体系结构
八、ServletConfig类
(一)、认识ServletConfig类
1、ServletConfig类从类名中我们就可以体现出它的本质作用。就是Servlet程序的配置信息类嘛!
2、每次Tomcat服务器创建Servlet程序的时候,都会创建一个ServletConfig对象,传递给init()初始化方法,做初始化使用!
3、注意:在这里Servlet程序是由Tomcat服务器创建,ServletCobfig类也是有它创建,这是需要我们弄清楚的地方!
(二)、ServletConfig类的三大作用
1、可以获取Servlet-name标签Servelt配置的名字(也就是在web.xml中配置的名称)
2、可以获取<init-param>标签中配置的初始化参数
3、获取ServletConfig 对象
(三)、具体实现
是通过重写init方法来实现的·,init()中有ServletConfig类型参数,通过参数去调用getServletName()、getInitParameter("参数名");、getServletConfig()分别获取Servlet程序的名称、参数、对象。
1 @Override 2 public void init(ServletConfig config) throws ServletException { 3 // 1、获取<Servlet-name>标签配置的名称 4 System.out.println("Servlet的名字:"+config.getServletName()); 5 // 2、获取Servlet程序的初始化参数 6 System.out.println("Servlet初始化参数:"+config.getInitParameter("canshu")); 7 // 3、获取Servlet对象 8 System.out.println("Servlet对象:"+config.getServletContext()); 9 }
(四)、Servlet程序编码中常见的问题
1、ServletConfig类不光可以在init()方法中使用,也可以在其他方法中使用,例如doget和dopost方法中。但是要注意:当你重写了init()方法后,就不能在其他方法中使用。如果想要使用必须在init()方法中调用super.init(config)方法。
1 @Override 2 public void init(ServletConfig config) throws ServletException { 3 // 必须添加,否则不能在其他方法中使用 4 super.init(config); 5 }
2、当重写了dogett()和dopost(),不要调用super.doGet(req,resp);或者super.doPost(req,resp)方法;否则就会向客户端发送错误!
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doPost(req, resp); }