Servlet学习
1. 什么是Servlet
1.1 Servlet是JavaEE规范之一,规范就是接口。
1.2 Servlet是JavaWeb 三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
1.3 Servlet是运行在服务器上的一个java小程序,他可以接收客户端发送过来的请求,并响应数据给客户端。
2. 手动实现Servlet程序
2.1 编写一个类去实现Servlet接口。
2.2 实现service方法,处理请求,并响应数据。
1 package com.example.web_02; 2 3 import javax.servlet.*; 4 import java.io.IOException; 5 6 public class Servlet1 implements Servlet { 7 @Override 8 public void init(ServletConfig servletConfig) throws ServletException { 9 10 } 11 12 @Override 13 public ServletConfig getServletConfig() { 14 return null; 15 } 16 /* 17 service方法是专门用来处理请求和相应的 18 */ 19 @Override 20 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { 21 System.out.println("Servlet1被访问了"); 22 } 23 24 @Override 25 public String getServletInfo() { 26 return null; 27 } 28 29 @Override 30 public void destroy() { 31 32 } 33 }
2.3 到web.xml中配置servlet程序的访问地址。
<?xml version="1.0" encoding="UTF-8"?>Servlet1 com.example.web_02.Servlet1 Servlet1 /servlet1
2.4启动,调试
默认访问index.jsp页面,更改路径为http://localhost:8080/web_02/servlet1
输出结果为:
3. Servlet程序常见错误
常见错误1:url-pattern中配置的路径没有以“/”开头。常见错误2:servlet-name 配置的值不存在。常见错误3:servlet-class标签的全类名配置错误。
4. url地址如何定位到Servlet中去访问
客户端(浏览器):http://localhost:8080/web_02/servlet1。http://表示HTTP协议,localhost是服务器ip,:8080是服务器端口号,/web_02是工程路径,/servlet1是资源路径。
通过ip地址定位服务器,通过端口号定位到Tomcat(一个端口号只能对应一个程序,但一个程序可以对应多个端口号),通过工程路径确定访问那个工程,这里根据web.xml配置文件中由servlet-mapping部署的路径名/servlet1访问servlet-name为Servlet1的Servlet,再执行Servlet1中的service方法。
5. Servlet的生命周期
(1)执行Servlet构造方法。(2)执行init初始化方法。(3)执行service方法。(4)执行destroy销毁方法。
示例:
1 package com.example.web_02; 2 3 import javax.servlet.*; 4 import java.io.IOException; 5 6 public class Servlet1 implements Servlet { 7 public Servlet1() { 8 System.out.println("构造方法被执行了"); 9 } 10 11 @Override 12 public void init(ServletConfig servletConfig) throws ServletException { 13 System.out.println("初始化方法被执行了"); 14 } 15 16 @Override 17 public ServletConfig getServletConfig() { 18 return null; 19 } 20 /* 21 service方法是专门用来处理请求和相应的 22 */ 23 @Override 24 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { 25 System.out.println("Servlet1被访问了"); 26 } 27 28 @Override 29 public String getServletInfo() { 30 return null; 31 } 32 33 @Override 34 public void destroy() { 35 System.out.println("销毁方法被执行了"); 36 } 37 }
修改地址后:
结果输出,并不断刷新页面后显示:
6. Servlet对请求的分发处理
package com.example.web_02; import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class Servlet1 implements Servlet { public Servlet1() { System.out.println("构造方法被执行了"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("初始化方法被执行了"); } @Override public ServletConfig getServletConfig() { return null; } /* service方法是专门用来处理请求和相应的 */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Servlet1被访问了"); //类型转换,因为HttpServlet有getMethod方法 HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String method = httpServletRequest.getMethod(); System.out.println("请求的方法是"+method); if("GET".equals(method)){ doGet(); }else if("POST".equals(method)){ doPost(); } } public void doGet(){ System.out.println("get请求"); } public void doPost(){ System.out.println("post请求了"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("销毁方法被执行了"); } }
7. 通过继承HttpServlet类来实现servlet程序
一般在实际项目开发中,都是使用继承HttpServlet类的方法去实现Servlet程序。
1、编写一个类去继承HttpServlet类。2、根据业务需要去重写doGet或doPost方法。3、到web.xml中配置Servlet程序的访问地址。
package com.example.web_02; 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 Servlet2 extends HttpServlet { @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); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>Servlet1servlet-name> <servlet-class>com.example.web_02.Servlet1servlet-class> servlet> <servlet-mapping> <servlet-name>Servlet1servlet-name> <url-pattern>/servlet1url-pattern> servlet-mapping> <servlet> <servlet-name>Servlet2servlet-name> <servlet-class>com.example.web_02.Servlet2servlet-class> servlet> <servlet-mapping> <servlet-name>Servlet2servlet-name> <url-pattern>/servlet2url-pattern> servlet-mapping> web-app>
8. 使用IDEA创建servlet程序
在对应包下new一个servlet,修改类名,并取消勾选吧下面create Java EE6+....,在web.xml文件中只需添加
<servlet-mapping> <servlet-name>Servlet3servlet-name> <url-pattern>/servlet3url-pattern> servlet-mapping>
9. Servlet类的继承体系
javax.servlet Interface Servlet(接口)被Class GenericServlet(类)实现。Class HttpServlet(类)继承Class GenericServlet(类),最后由自定义的Servlet程序继承Class HttpServlet(类)。Servlet接口只是定义Servlet程序的访问规范,GenericServlet类实现了Servlet接口。做了很多空实现,并持有一个ServletConfig类的引用,并对ServletConfig的使用做一些方法。HttpServlet抽取类实现了service()方法,并实现了请求的分发处理。
今天返校,由于时间紧迫,剩余的servlet内容明天记录在博客内。