Servlet入门
1. 什么是servlet
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。 Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),是最重要的组件。
Servlet 的作用
1. 接收请求 :接收客户端发送的请求数据;
2. 业务逻辑的处理;
3. 响应结果 :将处理结果响应给客户端(浏览器);
2、Servlet入门开发步骤
1. 创建一个普通java类实现Servlet接口; 2. 重写Servelt接口中的所有抽象方法; 3. 注册这个类; 1. 在web.xml中配置这个类的信息; 2. 配置这个类的映射路径; 4. 在service方法中处理请求和响应的业务逻辑; 5. 发布项目,启动项目之后,通过映射路径访问这个类;
3、入门案例一
需求:编写一个Servlet,接收客户端(浏览器)的请求: 接收到请求之后给浏览器响应数据"hello world"
实现步骤:
1. 创建一个普通java类FirstServlet 实现Servlet接口,并重写Servlet接口的所有抽象方法;
1 import javax.servlet.*; 2 import java.io.IOException; 3 4 public class FirstServlet implements Servlet { 5 @Override 6 public void init(ServletConfig servletConfig) throws ServletException { 7 System.out.println("初始化"); 8 } 9 10 @Override 11 public ServletConfig getServletConfig() { 12 return null; 13 } 14 @Override 15 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { 16 System.out.println("业务逻辑"); 17 servletResponse.getWriter().println("hello world"); 18 } 19 20 @Override 21 public String getServletInfo() { 22 return null; 23 } 24 25 @Override 26 public void destroy() { 27 System.out.println("销毁"); 28 } 29 }
2. 在web.xml中配置这个FirstServlet 的类路径和映射路径,配置信息如下:
【注意】 url-pattern 映射路径前面必须添加"/";
1 <servlet> 2 <servlet-name>first</servlet-name> 3 <servlet-class>zf.zjq.demo1.FirstServlet</servlet-class> 4 </servlet> 5 6 <servlet-mapping> 7 <servlet-name>first</servlet-name> 8 <url-pattern>/first</url-pattern> 9 </servlet-mapping>
3.启动访问 localhost:8080/first
Servlet生命周期(从创建到销毁)
1. 谁创建:tomcat创建; 2. 何时创建:第一次访问这个Servlet的时候 特点: 1. 只会创建一次(单例); 2. 对象创建完成之后,会调用init()方法; 3. 如何工作:每次请求到这个Servlet时,由service方法处理请求和响应信息; 1. service()方法接收用户的请求,和处理响应; 2. 特点: 1. 每次对这个Servlet的访问都会由service()方法来处理; 2. service()方法的两个参数:request和response对象专门用来处理请求和响应; 4. 何时销毁: Servlet对象在服务器正常关闭的时候销毁,销毁前会调用destory()方法; 注意:Servlet对象是单例的,会不会产生线程安全问题? 答:线程安全问题的产生是因为要争夺共同的资源,所以只要不在Servlet类中设置成员变量就可以避免。
优化方案1,案例二
使用GenericServlet类优化,GenericServlet类是一个抽象类,它实现了多个接口,其中有一个是Servlet,所以它重写了Servlet接口中的所有方法。我们只需要继承GenericServlet类,重写其中的service方法即可。
1. 编写一个普通的java类,SecondServlet ,继承GenericServlet;
package zf.zjq.demo1; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; public class SecondServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { servletResponse.getWriter().print("hello GenericServlet!"); } }
2.在web.xml配置SecondServlet :
<servlet> <servlet-name>second</servlet-name> <servlet-class>zf.zjq.demo1.SecondServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>second</servlet-name> <url-pattern>/second</url-pattern> </servlet-mapping>
3. 启动tomcat并访问:localhost:8080/second
优化方案2 ,案例三
Sun公司提供了HttpServlet,对GenericServlet再次进行扩展和功能加强。编写Servlet就可以采用继承HttpServlet来完成servlet的开发,这样的Servlet可以获取更多的业务功能。
步骤
1,编写一个普通的java类,ThirdServlet ,继承HttpServlet ;
package zf.zjq.demo1; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ThirdServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("处理get请求提交的数据"); doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("处理post请求提交的数据……"); resp.getWriter().println("hello world"); }
}
2.在web.xml配置SecondServlet :
<servlet> <servlet-name>third</servlet-name> <servlet-class>zf.zjq.demo1.ThirdServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>third</servlet-name> <url-pattern>/third</url-pattern> </servlet-mapping>
3. 启动tomcat并访问:localhost:8080/third
3,Servlet映射路径配置规范
url-pattern中的映射路径配置存在以下几种方式:
1. 完全匹配 /user/hello 资源路径为/user/hello时可以访问
2. 目录匹配 /user/* 资源路径中含有/user目录均可访问
3. 后缀名匹配 *.do 资源路径中以.do结尾的均可访问
4. 缺省路径 / 访问的路径找不到,就会去找缺省路径
tomcat获得匹配路径时,优先级顺序:1 >2 > 3 > 4
一般使用完全匹配,即一个Servlet对应一个映射路径。
4,小结
1. Servlet编程的作用:接收浏览器的请求,处理请求数据,给浏览器响应数据;
2. Servlet接口:
1. Sun公司规定如果想要在服务端接收和响应客户端的数据,必须实现Servlet接口;
2. 由于Servlet是一个接口,实现Servlet接口后必须重写其中所有的方法;
3. GenericServlet:
1. GenericServlet:是一个抽象类,它实现了Servlet接口,与协议无关;
2. 继承GenericServlet,只需要重写service方法即可接收和响应数据;
4. HttpServlet:
1. HttpServlet:是一个抽象类,它继承了GenericServlet,为HTTP请求定制的;
2. 继承HttpServlet,重写doGet和doPost方法,能够更加方便地处理不同请求的数据;