1.直接实现Servlet接口的缺点是什么?11
-我们只需要service方法,大多数情况下不需要使用其他方法。代码很难看。
2.Adapter11适配器设计模式-手机直接插入220V电压,手机直接报废。我该怎么办?你可以找到一个充电器。这个充电器是一个适配器。手机连接到适配器。适配器连接到220V的电压。这个问题就解决了。
-写一个Genericservlet类,这个类是抽象类,其中有一个抽象方法service。
-实现Servlet接口的Genericservlet。
-Genericservlet是一种适配器。
-以后编写的所有Servlet类别都可以继承GenericServlet,重写Service方法。
com中的代码.bjpowernode.javaweb.servlet.Genericservletet适配器模式改造标准通用package com.bjpowernode.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;///适配器模式改变Servletetet 11//编写一个标准通用的Servlet,命名为GenericServlet,以后所有的Servlet类别都不会直接实现Servlet接口//以后所有的Servlet类别都会继承GenericServlet类别,Genericservlet是适配器publicic abstract class GenericServlet implements Servlet{ @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } //把这种方法改成抽象方法是最常用的,因此,子类必须实现service方法 @Override public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException; @Override public String getServletInfo() { return null; } @Override public void destroy() { }}
LoginServletpackage com.bjpowernode.javaweb.servlet;import jakarta.servlet.ServletException;import jakarta.servlet.ServletRequest;import jakarta.servlet.ServletResponse;import java.io.IOException;///这个loginservlet继承了我们改造的genericservlet 我们的Genericservlet继承了Servlet接口,实现了它的方法,而且最常用的service方法是抽象//所以我们的loginservlet继承genericservlet只需要实现service方法(因为它的抽象方法是抽象的// 必须实现,这正好适合我们的意思)因为实现service的代码更漂亮,不冗余publice class LoginServlet extends GenericServlet{ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println(“正在处理用户登录请求,请稍后……”); }}
VipServletpackage com.bjpowernode.javaweb.servlet;import jakarta.servlet.ServletException;import jakarta.servlet.ServletRequest;import jakarta.servlet.ServletResponse;import java.io.IOException;///这个Vipservlet继承了我们改造的Genericservlet 11public class VipServlet extends GenericServlet{ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println(vip可以享受更好的服务……); }}
web配置文件.xmlxmlns: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"> LoginServlet com.bjpowernode.javaweb.servlet.LoginServlet LoginServlet /login vipServlet com.bjpowernode.javaweb.servlet.VipServlet vipServlet /vip
3.改造Genericservlet123.1思考:Genericservlet类需要改造吗?如何改造?更有利于子类程序的编写?12-思考第一个问题:我提供了Genericservlet之后,init方法还会实施吗?
-也将执行。将执行genericservlet类中的init方法。(即子类不执行父类)
-思考第二个问题:谁调用init方法?
-Tomcat服务器调用。
3.2改造Genericservlet案例12.2com中的代码.bjpowernode.javaweb.servlet2.GenericServlet
package com.bjpowernode.javaweb.servlet2;import jakarta.servlet.*;import java.io.IOException;///适配器模式改变Servletetet 12//改造Genericservleter 12//编写一个标准通用的Servlet,命名为GenericServlet,以后所有的Servlet类别都不会直接实现Servlet接口//以后所有的Servlet类别都会继承GenericServlet类别,Genericservlet是适配器publicic abstract class GenericServlet implements Servlet{ ///成员变量 private ServletConfig config; /** * ServletConfig在init方法中的对象是小猫创造的。 * 在init方法的参数中,这个ServletConfig对象属于局部变量。 * 在init方法的参数中,这个ServletConfig对象属于局部变量。 * 那么Servletconfig对象以后一定要用service方法,怎样才能保证Servletconfig对象呢? * 可用于service方法吗? */ ///加final,以确保子类不能重写init方法 @Override public final void init(ServletConfig config) throws ServletException { //解释 //this.config指成员变量 config指Servletconfig参数 config config将参数的config赋值为成员变量,可以保证成员变量的config不空,从而确保 //getServletConfig()方法中返回的return config不是空的 this.config=config; ////调用我们写的init this.init(); } /////我们写的init ///供子类重写 public void init(){ } @Override public ServletConfig getServletConfig() { return config; } //把这种方法改成抽象方法是最常用的,因此,子类必须实现service方法 @Override public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException; @Override public String getServletInfo() { return null; } @Override public void destroy() { }}
LoginServletpackage com.bjpowernode.javaweb.servlet2;import jakarta.servlet.ServletConfig;import jakarta.servlet.ServletException;import jakarta.servlet.ServletRequest;import jakarta.servlet.ServletResponse;import java.io.IOException;///这个loginservlet继承了我们改造的genericservlet 我们的Genericservlet继承了Servlet接口,实现了它的方法,而且最常用的service方法是抽象//所以我们的loginservlet继承genericservlet只需要实现service方法(因为它的抽象方法是抽象的// 必须实现,这正好适合我们的意思)因为实现service的代码更漂亮,不冗余publice class LoginServlet extends GenericServlet { // 思考一个问题: 12 // 有必要在Loginservlet类中重写init方法吗? // 当然有可能,所以init方法被重写了。 // 但是我们不希望子类重写init方法,需要在父类的init方法中添加final,可能是因为子类重写init方法 // 使用getservletconfig()在子类中获得的config为空null(因为一旦子类重写了父类的init,就不会执行) /*public void init(ServletConfig config) throws ServletException { System.out.println(”重写自己的规则。。。。。。"); }*/ // 父类将原来的init方法final,我的子类无法重写这种init方法。 // 如果我还想在这个时候重写init方法,我该怎么办? @Override public void init(){ System.out.println("LoginServlet's init() method execute!"); } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println(”用户登录请求正在处理中,请稍后……”; //想在LoginServlet子类中使用Servletconfig对象 ServletConfig config = this.getServletConfig(); System.out.printlnServletconfig对象可以在service方法中获得 "+config); }}
web配置文件.xml<servlet> <servlet-name>LoginServlet2</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet2.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet2</servlet-name> <url-pattern>/login2</url-pattern> </servlet-mapping> <servlet> <servlet-name>vipservlet2</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet2.VipServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>vipservlet2</servlet-name> <url-pattern>/vip2</url-pattern> </servlet-mapping>
3.3好消息Genericservlet不需要我们自己写,原码提供123.3.1案例演示com中的代码.bjpowernode.javaweb.servlet2.UserServletpackage com.bjpowernode.javaweb.servlet2;import jakarta.servlet.GenericServlet;import jakarta.servlet.ServletException;import jakarta.servlet.ServletRequest;import jakarta.servlet.ServletResponse;import java.io.IOException;Genericservlet//演示使用系统 12public class UserServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println(Genericservlet输出使用系统); }}
web配置文件.xml<servlet> <servlet-name>userServlet</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet2.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>userServlet</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping>