Servlet笔记6--Servlet程序改进

第一步改进,GenericServlet:

  我们目前所有放入Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写service。直接实现Servlet接口代码丑陋,有必要在中间添加一个适配器,以后所有的Servlet类不再直接实现Servlet接口,应该去继承适配器类。

  适配器除了可以让代码优雅之外,我们还可以在适配器中提供大量的方法,子类继承之后,可以在子类中直接使用,方便编程。

  自己使用缺省适配器设计模式实现的GenericServlet类:

 1 package com.bjpowernode.javaweb.servlet;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.Servlet;
 6 import javax.servlet.ServletConfig;
 7 import javax.servlet.ServletContext;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11
12 /*
13  * GenericSerrvlet是一个适配器,这个适配器是一个Servlet
14  * 以后javaweb程序员无需直接实现Servlet接口,去继承这个适配器即可,重写service方法。
15  *
16  * @author Administrator
17  */
18
19 public abstract class GenericServlet implements Servlet {
20
21     ServletConfig config;
22
23     //该方法不能被覆盖,因为被覆盖之后,config就获取不到了,所以方法前面加了final
24     public final void init(ServletConfig config) throws ServletException {
25         this.config = config;
26         this.init();
27     }
28
29     /*
30      * 若在初始化时刻需要执行一段特殊的代码,建议重写无参数的init方法,注意动态绑定,会让上面的init方法调用子类重写的init方法
31      */
32     public void init(){
33
34     }
35
36     public abstract void service(ServletRequest request, ServletResponse response)
37             throws ServletException, IOException;
38
39     public void destroy() {
40
41     }
42
43     public ServletConfig getServletConfig() {
44         return config;
45     }
46
47     public String getServletInfo() {
48         return "qjj";
49     }
50
51     //---------------------以下所有的方法都是拓展方法,方便子类的使用------------------------------
52
53     public ServletContext getServletContext(){
54         return getServletConfig().getServletContext();
55     }
56 }

  其实sun公司已经为我们实现了这个适配器类,可以直接调用:

 1 package com.bjpowernode.javaweb.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5
 6 import javax.servlet.ServletException;
 7 import javax.servlet.ServletRequest;
 8 import javax.servlet.ServletResponse;
 9
10 //public class HelloServlet extends GenericServlet {
11 public class HelloServlet extends javax.servlet.GenericServlet {
12     //sun公司已经为我们写了适配器,并且里面有很多其他的方法
13
14     private static final long serialVersionUID = 1L;
15
16     @Override
17     public void init() {
18         System.out.println("HelloServlet‘s init......");
19     }
20
21     @Override
22     public void service(ServletRequest request, ServletResponse response)
23             throws ServletException, IOException {
24         response.setContentType("text/html;charset=UTF-8");
25         PrintWriter out = response.getWriter();
26         out.print("hello world!");
27         out.print("<br>");
28         out.print(getServletContext());
29     }
30
31 }

HTTP协议相关:

  前端页面中的GET请求和POST请求代码:

 1  <html>
 2      <head>
 3          <title>login page</title>
 4          <meta name="keywords" content="keyword1,keyword2,keyword3">
 5         <meta name="description" content="this is my page">
 6         <meta name="content-type" content="text/html; charset=UTF-8">
 7      </head>
 8      <body>
 9
10          GET方式
11          <form action="/prj-servlet-09/system/login">
12              username<input type="text" name="username"><br>
13              password<input type="password" name="password"><br>
14              <input type="submit" value="login">
15          </form>
16          <hr>
17          GET方式
18          <form action="/prj-servlet-09/system/login" method="get">
19              username<input type="text" name="username"><br>
20              password<input type="password" name="password"><br>
21              <input type="submit" value="login">
22          </form>
23          <hr>
24          POST方式
25          <form action="/prj-servlet-09/system/login" method="post">
26              username<input type="text" name="username"><br>
27              password<input type="password" name="password"><br>
28              <input type="submit" value="login">
29          </form>
30      </body>
31
32  </html>

第二步改进,HTTPServlet:

  具体代码实现:

 1 package com.bjpowernode.javaweb.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5
 6 import javax.servlet.GenericServlet;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.ServletRequest;
 9 import javax.servlet.ServletResponse;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 public class LoginServlet extends GenericServlet {
14
15     private static final long serialVersionUID = 1L;
16
17     @Override
18     public void service(ServletRequest req, ServletResponse res)
19             throws ServletException, IOException {
20         //将ServletRequest,ServletResponse强制类型转换成带有Http的接口类型
21         HttpServletRequest request = (HttpServletRequest)req;
22         HttpServletResponse response = (HttpServletResponse)res;
23
24         response.setContentType("text/html;charset=UTF-8");
25         PrintWriter out = response.getWriter();
26
27         //获取浏览器发送的请求方式
28         String method = request.getMethod();
29         //LoginServlet是处理登录的,要求前端必须发送POST请求
30         if("GET".equals(method)){
31             //前端报错
32             out.print("405-您应当发送POST请求");
33             //后端报错
34             throw new RuntimeException("405-您应当发送POST请求");
35         }
36
37         //若程序执行到这里证明用户发送到的请求是POST请求,程序应当正常执行
38         out.print("正在登录...");
39     }
40
41 }

  解决方法:自己用模板方法设计模式设计HTTPServlet:

 1 package com.bjpowernode.javaweb.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5
 6 import javax.servlet.GenericServlet;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.ServletRequest;
 9 import javax.servlet.ServletResponse;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 public class HttpServlet extends GenericServlet {
14
15     private static final long serialVersionUID = 1L;
16
17     @Override
18     public void service(ServletRequest req, ServletResponse res)
19             throws ServletException, IOException {
20         HttpServletRequest request = (HttpServletRequest)req;
21         HttpServletResponse response = (HttpServletResponse)res;
22         service(request,response);
23     }
24
25     public void service(HttpServletRequest request, HttpServletResponse response)
26             throws ServletException, IOException {
27         String method = request.getMethod();
28         if("GET".equals(method)){
29             doGet(request,response);
30         }else if("POST".equals(method)){
31             doPost(request,response);
32         }
33     }
34
35     public void doGet(HttpServletRequest request, HttpServletResponse response)
36             throws ServletException, IOException {
37         response.setContentType("text/html;charset=UTF-8");
38         PrintWriter out = response.getWriter();
39         out.print("405-您应当发送POST请求");
40         throw new RuntimeException("405-您应当发送POST请求");
41     }
42
43     public void doPost(HttpServletRequest request, HttpServletResponse response)
44             throws ServletException, IOException {
45         response.setContentType("text/html;charset=UTF-8");
46         PrintWriter out = response.getWriter();
47         out.print("405-您应当发送GET请求");
48         throw new RuntimeException("405-您应当发送GET请求");
49     }
50
51 }

  接下写自己的Servlet时,要继承自HttpServlet,为get请求则重写doGet方法,为post请求则重写doPost方法。

  其实sun公司已经为我们实现了这个HttpServlet类,可以直接调用:

 1 package com.bjpowernode.javaweb.servlet;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8
 9 //public class LoginServlet extends HttpServlet {
10 public class LoginServlet extends javax.servlet.http.HttpServlet {
11
12     private static final long serialVersionUID = 1L;
13
14     @Override
15     public void doPost(HttpServletRequest request, HttpServletResponse response)
16             throws ServletException, IOException {
17         response.getWriter().print("login......");
18     }
19 }

  至此,以后写自己的Servlet时,都要继承自HttpServlet,并且使用doPost或者doGet方法。

时间: 2024-11-01 23:12:08

Servlet笔记6--Servlet程序改进的相关文章

JavaWeb学习笔记之Servlet(一)

1. 引子: 当我们开始进入JavaWeb开发的学习时,我们就必须要和Servlet和HTTP这两个词进行打交道了,尤其是Servlet.即使到了后面使用JSP (我们知道JSP其本身就是一个Servlet)来进行开发我们的应用. 下图就是 Servlet API中相应的UML图,在学习JavaWeb 开发时,我们最好对下面的各个Servlet中的方法做一定的了解及其相应的图中的关系,尤其是HttpServletRequest和HttpServletResponse 中的方法. 2. 部署服务器

《Servlet学习笔记》Servlet 简介

Servlet 简介:Servlet是sun公司提供的一门用于开发动态web资源的技术.Sun公司在其API中提供了一个servlet接口,用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下两步:1.编写一个Java类,实现servlet接口:2.把开发好的Java类部署到web服务器中. jsp就是servletjavase.javaee,servlet不属于javase而属于javaeeservlet专门文档APITomcat可以运行servlet,lib

新手学习JSP+Servlet笔记一

作为一个新手,初次接触jsp,servlet,习惯了后台的开发,前台的知识一窍不通,利用闲暇时间,给自己补补,从MyEclipse开始. 安装好MyEclipse之后,没有安装程序的可以下载 http://yunpan.cn/cAXWu3zjE5Ssj  提取码 7aaa 新建一个Web Project,MyEclipse很多都是定义好的模板,新建一个Servlet,简单的工程就建好了 Web.xml中 <?xml version="1.0" encoding="UTF

实现一个servlet的helloworld小程序(不适用Eclipse)

1. 在tomcat中的webapps下建一个应用程序FirstServlet(C:\tomcat\webapps\FirstServletweb) 2. 在应用程序下建立目录 C:\tomcat\webapps\FirstServletweb\WEB-INF\classes 3. 在class目录下建立一个文件 FirstServlet.java 4. 实现内容 package cn.school; import java.io.*; import javax.servlet.*; publi

《Servlet学习笔记》Servlet开发细节

Servlet开发细节1.由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成.2.<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Serv

servlet笔记1

Myeclipse关于Servlet项目文件的组织方面,如下: WEB-INF:这个目录名称和位置是固定的,放置在该目录下的文件或目录,对外界来说的封闭的,也就是客户端无法用http的任何方式访问到其中的文件.如有这类需求,则必须通过Servlet/jsp的请求转发(Forward).可用于保存资源. web.xml:这是web应用程序部署描述文件,位置和名称固定. lib:放置JAR文件,位置和名称固定. classes:放置编译后的类文件 Servlet部署方面: URL模式的设置,一个请求

Java Servlet:服务器小程序

servlet:服务器小程序 servlet是一个接口,接口是一种规范,因此servlet是一种规范 一个类声明为抽象类的原因: 不包含抽象方法,不想被实例化 包含抽象方法,子类有对抽象方法的不同实现 什么是Servlet容器? Servlet容器,顾名思义里面存放着Servlet对象.我们为什么能通过Web服务器映射的URL访问资源?肯定需要写程序处理请求,主要3个过程: 接收请求:web服务器 处理请求: servlet 响应请求:web服务器 servlet容器: tomcat Jetty

【JavaWeb笔记】Servlet的生命周期

1.加载和实例 Servlet不能独立运行,它必须被部署到Servlet容器中,由容器实例化和调用Servlet的方法.当Servlet容器启动或者当客户端发送一个请求时,Servlet容器会查找内存中是否在Servlet实例,如果不存在,就创建一个Servlet实例.如果存在该Servlet的实例,就直接从内存中取出实例相应请求. 注:Servlet容器根据Servlet类的位置加载Servlet类,加载成功后,由容器创建Servlet实例 2.初始化 在实例化完成后,Servlet容器将调用

servlet学习笔记02 servlet类、对象

1.servlet主要类和接口的结构如下图所示: servlet常用类和接口javax.servlet.Servlet接口:规定了必须由servlet类实现由servlet引擎识别和管理的方法集,基本目标是提供生命周期方法init().service()和destroy()方法.Servlet接口中方法:void init(ServletConfig config)throws ServletException:在servlet被载入后和实施服务前由servlet引擎进行1次调用,如果产生Una