ServletDemo
1、 Servlet 接口
继承 Servlet 接口,实现Servlet 接口的 所有抽象方法!
实现类代码
package xw.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class ServletInterfaceDemo implements Servlet { //继承 Servlet 接口,实现接口中所有的抽象方法 总共五个, 如果不实现,那么该类就要定义为抽象类 public void destroy() { System.out.println("destory()..."); } /* * 可以用来获取Servlet的配置信息 */ public ServletConfig getServletConfig() { System.out.println("getServletConfig()..."); return null; } /* * 获取Servlet的信息 */ public String getServletInfo() { System.out.println("getServletInfo()..."); return "我是一个快乐的Servlet"; } /* * 它是生命周期方法 * 它会在Servlet对象创建之后马上执行,并只执行一次!(出生之后) * */ public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init()..."); /* * 获取初始化参数 */ System.out.println(servletConfig.getInitParameter("p1")); System.out.println(servletConfig.getInitParameter("p2")); /* * 获取所有初始化参数的名称 */ Enumeration e = servletConfig.getInitParameterNames(); while(e.hasMoreElements()) { System.out.println(e.nextElement()); } } /* * 它是生命周期方法 * 它会被调用多次!!! * 每次处理请求都是在调用这个方法! */ public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("service()..."); } }
web.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>servletInterfaceDemo</servlet-name> <servlet-class>xw.servlet.ServletInterfaceDemo</servlet-class> <init-param> <param-name>p1</param-name> <param-value>v1</param-value> </init-param> <init-param> <param-name>p2</param-name> <param-value>v2</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>servletInterfaceDemo</servlet-name> <url-pattern>/servlet/ServletInterfaceDemo</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
访问路径:http://localhost:8080/JavaWebTest/servlet/ServletInterfaceDemo
显示效果:
2、GenericServlet 抽象类
模拟 GenericServlet
通过两个servlet 类,模拟 GenericServlet 实现原理
package xw.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 模拟GenericServlet,理解 GenericServlet 类的内部实现原理 * */ public class AGenericServlet implements Servlet { //GenericServlet类内部定义 一个ServletConfig 类型的 config 属性 //类继承了GenericServlet 类之后,可以直接使用 ServletConfig类的config 对象 private ServletConfig config; /* * 需要就写,不需要就不写 */ public void destroy() { System.out.println("啊~我要死了!"); } /* * 请放心,这个方法一定会在init()方法之后被调用! * init()被调用后,本类的成员this.config已经有值了! */ public ServletConfig getServletConfig() { return this.config; } /* * 没有用的东西,爱实现不实现 */ public String getServletInfo() { return "我是一个快乐的Servlet"; } /* * 由Tomcat来调用,并且只调用一次 * 它是这些方法中第一个被调用的,它会在构造器之后马上被调用! */ public void init(ServletConfig config) throws ServletException { // 把tomcat传递的Servletconfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他方法中使用! this.config = config; init(); } /* * 这个方法是本类自己定义的!不是Servlet接口中的方法 */ public void init() { } public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { /* * 这里是否可以使用ServletConfig的成员呢? */ System.out.println("每次处理请求都会被调用!"); } public ServletContext getServletContext() { return config.getServletContext(); } public String getServletName() { return config.getServletName(); } public String getInitParameter(String name) { return config.getInitParameter(name); } }
实现类 ,继承 模拟的GenericServlet 类
package xw.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class BGenericServlet extends AGenericServlet { public void init() { System.out.println("哇~~~~,很高兴啊~~~"); } public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { String value = getInitParameter("p1"); System.out.println("重写父类service 方法!"); } }
<servlet> <servlet-name>BGenericServlet</servlet-name> <servlet-class>xw.servlet.BGenericServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BGenericServlet</servlet-name> <url-pattern>/servlet/BGenericServlet</url-pattern> </servlet-mapping>
访问地址:
显示效果:
继承 GenericServlet
package xw.servlet; import java.io.IOException; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class CGenericServlet extends GenericServlet { @Override public void init() throws ServletException { System.out.println("哈哈哈~我来也!"); } /* * 查看帮助文档 GenericServlet 类为抽象类,类中唯一的抽象方法为 service,必须重写。 * */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("hello world"); } @Override public void destroy() { System.out.println("destory()"); } }
显示效果如下:
2、HttpServlet 抽象类
package xw.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DHttpServlet extends HttpServlet { /* *HttpServlet 是抽象类,类中没有抽象方法,extends 自 GenericServlet *抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。 如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过 */ //httpServlet 是高效的,线程不安全的,每次请求服务器都会开启一个线程。 //但是如果,该类中,只有get读方法,没有set写方法,也不会出现 ,线程安全问题。 高手的写法。 但是,最好还是都写出局部变量 private User user = new User(); @Override public void init() throws ServletException { System.out.println("hello --> world!"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet()..."); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doPost()..."); } }
访问页面 login.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="/JavaWebTest/servlet/DHttpServlet" method="post"> <input type="submit" value="提交"/> </form> </body> </html>
显示效果:
posted on 2015-10-29 18:22 weiqinshian 阅读(298) 评论(0) 编辑 收藏 举报