Servlet核心
一、GenericServlet
通过实现Servlet接口来定义Servlet时存在一个很不方便的问题:有太多不需要的方法必须要实现。通常我们只关心service()方法,在service()方法中完成业务逻辑,但由于Servlet接口中还存在另外四个方法,所以也必须要实现。
我们可以进行循序渐进的改良,我们可以自定义一个GenericServlet类。
版本1-方法空实现
我们可以通过自定义一个GenericServlet的抽象类来实现Servlet接口,其中service()方法设置成抽象方法,而其余四个方法设置为空实现。然后用SomeServlet类来继承GenericServlet类,这样就只需要重写service()方法,而不用去管其他的四个方法了。
新创建一个项目06-genericServlet-1,代码如下:
版本2-获取ServletConfig
上一个版本的service()方法可以执行相应的程序,但是不能获取ServletConfig对象,为了实现这个功能,我们需要做一些修改
这时我们再刷新页面,发现可以正常获取到ServletConfig的对象。
版本3-实现ServletConfig接口
上面的版本在调用ServletConfig的四个方法时仍旧麻烦,需要先获取到对象才能调用,接下来我们尝试通过让GenericServlet实现ServletConfig接口,并直接重写该接口内的四个方法,这样的好处是SomeServlet类可以直接调用四个方法了。
我们复制上一个项目,改名为07-genericServlet-2
版本4-无参init()
如果我们需要SomeServlet有初始化动作,可以在GenericServlet中的init方法中进行编写,但是这样的弊端是如果有其他的类想要继承GenericServlet的话,那么初始化方法的内容都是一样的,它们共用一套init方法,而无法进行单独的设置。当然我们可以在SomeServlet里直接重写init方法,但是一定要注意,这句话千万不要略掉,否则父类GenericServlet的init方法无法启动,会导致ServletConfig对象为空等一系列问题。当然还有更好的解决方案,我们再次复制上个项目,重命名为08-genericServlet-3,然后稍微进行修改
其实这也是一种设计模式,叫模版方法设计模式。无参的init方法可以由不同的子类来实现,也不需要考虑的问题。但这种方法难理解之处在于父类调用无参init,编译时看的是父类的无参init方法,而运行时看的是调用者即子类的无参init方法。
Servlet规范中的GenericServlet
事实上,GenericServlet这个类早就已经被Servlet规范定义好了,我们只需要拿来用就可以了,而不需要重复前面的那一系列步骤了,它的带包全名是:。
二、HttpServlet获取请求的提交方式
我们新建一个项目09-httpServlet-custom,创建一个LoginServlet类,继承GenericServlet,然后代码如下:
然后我们在WebContent下创建一个index.html,内容如下:
最后我们在web.xml中的内容如下:
然后我们启动服务器,地址栏直接输入localhost:8080/09-httpServlet-custom,即可访问index.html页面
然后我们可以直接点击登录,页面会跳转到LoginServlet,控制台上会输出。一切看似都很不错,但是我们如果尝试直接在地址栏中输入localhost:8080/09-httpServlet-custom/LoginServlet,竟然也可以访问并在控制台输出,这就很危险了;尽管我们设置了,但是好像没有派上用场。
我们可以对LoginServlet进行修改
通过对req的强制下转型为ServletRequest的子接口HttpServletRequest,使request具有getMethod方法,从而可以获得post或get并对其进行操作。我们此时重新用两种方式提交一些请求,可以看到控制台分别输出了和。
接下来我们可以通过对获得的两种提交方式进行设置,修改后的代码如下:
这样就可以区分出两种不同的提交方式,然后对它们分别进行不同的操作。
这里有一个小技巧,用equals方法时,将常量“POST”放在前面,好处是不会因为没有method变量的值而报空指针异常。
自定义HttpServlet
由于我们用Http协议进行操作的情况很普遍,因此我们可以再次定义一个类HttpServlet继承GenericServlet,并将之前写的LoginServlet里的内容全部放到HttpServlet中,然后让LoginServlet继承Httpservlet,代码如下:
Servlet规范中的HttpServlet
和GenericServlet一样,HttpServlet也不需要我们去手动编写,Servlet规范已经为我们定义好了,带包全名是。
我们复制上一个项目,更名为10-httpServlet,将其中的HttpServlet删除掉,导入Servlet规范中的HttpServlet
我们只保留一个doPost方法,然后分别用两种不同的方式进行提交,发现POST提交方式(即通过表单进入)可以正常输出结果,而GET提交方式(即在地址栏中输入最终的地址)会报错,如下图:
如果想要两种提交方式都可以的话,可以如下:
在eclipse中快速定义Servlet
我们可以利用eclipse的功能更快捷的创建出Servlet:
首先,新建一个项目11-commonDefineServlet
然后,在项目上右键NewOther查找Servlet
接着,填写包名和类名,点击Next
现在,可以修改名称、描述、url等,这些都是web.xml里的
然后,再次点击Next,可以实现接口、覆盖方法等
最后、点击Finish,进行代码的修改与编写
注意:不需要再格外配置web.xml了,因为已经配好了
领取专属 10元无门槛券
私享最新 技术干货