首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Servlet编程之核心篇(一)

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了,因为已经配好了

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206G1A0IU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券