第一步改进,GenericServlet:

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

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

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

 package com.bjpowernode.javaweb.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; /*
* GenericSerrvlet是一个适配器,这个适配器是一个Servlet
* 以后javaweb程序员无需直接实现Servlet接口,去继承这个适配器即可,重写service方法。
*
* @author Administrator
*/ public abstract class GenericServlet implements Servlet { ServletConfig config; //该方法不能被覆盖,因为被覆盖之后,config就获取不到了,所以方法前面加了final
public final void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
} /*
* 若在初始化时刻需要执行一段特殊的代码,建议重写无参数的init方法,注意动态绑定,会让上面的init方法调用子类重写的init方法
*/
public void init(){ } public abstract void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException; public void destroy() { } public ServletConfig getServletConfig() {
return config;
} public String getServletInfo() {
return "qjj";
} //---------------------以下所有的方法都是拓展方法,方便子类的使用------------------------------ public ServletContext getServletContext(){
return getServletConfig().getServletContext();
}
}

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

 package com.bjpowernode.javaweb.servlet;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; //public class HelloServlet extends GenericServlet {
public class HelloServlet extends javax.servlet.GenericServlet {
//sun公司已经为我们写了适配器,并且里面有很多其他的方法 private static final long serialVersionUID = 1L; @Override
public void init() {
System.out.println("HelloServlet's init......");
} @Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("hello world!");
out.print("<br>");
out.print(getServletContext());
} }

HTTP协议相关:

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

  <html>
<head>
<title>login page</title>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
</head>
<body> GET方式
<form action="/prj-servlet-09/system/login">
username<input type="text" name="username"><br>
password<input type="password" name="password"><br>
<input type="submit" value="login">
</form>
<hr>
GET方式
<form action="/prj-servlet-09/system/login" method="get">
username<input type="text" name="username"><br>
password<input type="password" name="password"><br>
<input type="submit" value="login">
</form>
<hr>
POST方式
<form action="/prj-servlet-09/system/login" method="post">
username<input type="text" name="username"><br>
password<input type="password" name="password"><br>
<input type="submit" value="login">
</form>
</body> </html>

第二步改进,HTTPServlet:

  具体代码实现:

 package com.bjpowernode.javaweb.servlet;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends GenericServlet { private static final long serialVersionUID = 1L; @Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//将ServletRequest,ServletResponse强制类型转换成带有Http的接口类型
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res; response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter(); //获取浏览器发送的请求方式
String method = request.getMethod();
//LoginServlet是处理登录的,要求前端必须发送POST请求
if("GET".equals(method)){
//前端报错
out.print("405-您应当发送POST请求");
//后端报错
throw new RuntimeException("405-您应当发送POST请求");
} //若程序执行到这里证明用户发送到的请求是POST请求,程序应当正常执行
out.print("正在登录...");
} }

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

 package com.bjpowernode.javaweb.servlet;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HttpServlet extends GenericServlet { private static final long serialVersionUID = 1L; @Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
service(request,response);
} public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getMethod();
if("GET".equals(method)){
doGet(request,response);
}else if("POST".equals(method)){
doPost(request,response);
}
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("405-您应当发送POST请求");
throw new RuntimeException("405-您应当发送POST请求");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("405-您应当发送GET请求");
throw new RuntimeException("405-您应当发送GET请求");
} }

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

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

 package com.bjpowernode.javaweb.servlet;

 import java.io.IOException;

 import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; //public class LoginServlet extends HttpServlet {
public class LoginServlet extends javax.servlet.http.HttpServlet { private static final long serialVersionUID = 1L; @Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().print("login......");
}
}

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

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

  1. Servlet笔记2--模拟Servlet本质、第一个Servlet程序、将响应结果输出到浏览器中

    以下代码均非IDE开发,所以都不规范,仅供参考 模拟Servlet本质: 模拟Servlet接口: /* SUN公司制定的JavaEE规范:Servlet规范 Servlet接口是Servlet规范中 ...

  2. servlet 笔记

    Servlet的作用是接收浏览器传给服务端的请求(request),并将服务端处理完的响应(response)返回给用户的浏览器,浏览器和服务端之间通过http协议进行沟通,其过程是浏览器根据用户的选 ...

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

    实现一个servlet的helloworld小程序(不适用Eclipse) 1. 在tomcat中的webapps下建一个应用程序FirstServlet(C:\tomcat\webapps\Firs ...

  4. JavaWeb学习笔记之Servlet(一)

    1. 引子: 当我们开始进入JavaWeb开发的学习时,我们就必须要和Servlet和HTTP这两个词进行打交道了,尤其是Servlet.即使到了后面使用JSP (我们知道JSP其本身就是一个Serv ...

  5. Servlet 笔记-过滤器

    Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servlet 过滤 ...

  6. Servlet 笔记-servlet实例

    Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类.Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.h ...

  7. Java Servlet 笔记4

    Servlet 客户端 HTTP 请求 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的. 读取 HTTP 头的 ...

  8. Java Servlet 笔记3

    Servlet 表单数据 很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. 1. ...

  9. Java Servlet 笔记1

    1. 什么是Servlet. Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序 ...

随机推荐

  1. Windows下CURL扩展无效之终极解决办法。

    本地开发环境使用WAMP快速搭建,在使用PHP的CURL时可能会存在无法载入情况,这里提供终极解决方法. 1.在php.ini配置文件中启用 php_curll.dll 扩展: (环境已经自动附带 l ...

  2. springMVC 访问静态资源

    问题描述 使用SpringMVC时遇到静态资源无法加载的问题,报404 问题原因 如果SpringMVC的映射模式采用的是后缀名匹配,如[*.do]或者[*.action]则不会出现该问题,因为静态资 ...

  3. Python编写登陆接口

    实现功能: 输入用户名和密码 认证成功后显示欢迎信息 输错三次后锁定 # 提示输入用户名和密码 # 验证用户名和密码 # 如果错误,则输出用户名或密码错误 # 如果成功,则输出 欢迎,XXX! #!/ ...

  4. 用join取代not in

    写了好几个页面,速度都上不去,瓶颈在于SQL查询.太多的表,太多的not in,总是从一大推表和数据中筛选出一点数据.看了很多关于SQL优化的文章,都强烈要求不要太多使用not in查询,最好用表连接 ...

  5. 【刷题】BZOJ 2005 [Noi2010]能量采集

    Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...

  6. 【BZOJ1858】序列操作(线段树)

    [BZOJ1858]序列操作(线段树) 题面 BZOJ 题解 这题思路很简单,细节很烦,很码 维护区间翻转和区间赋值标记 当打到区间赋值标记时直接覆盖掉翻转标记 下放标记的时候先放赋值标记再放翻转标记 ...

  7. Android Emoji兼容包使用详解

    Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以,  ...

  8. WEB入门一 网页设计基础

    本章简介 在当今社会,网页是网络信息共享和发布的主要形式.而HTML (Hyper Text Mark-up Language),即超文本标记语言,是创建网页基础.本章将学习HTML文档的基本结构.组 ...

  9. Android O新特性和行为变更总结zz

    https://mp.weixin.qq.com/s/Ezfm-Xaz3fzsaSm0TU5LMw Android O 行为变更https://developer.android.google.cn/ ...

  10. mysql 优化之查询缓存(mysql8已经废弃这个功能)

    对于缓存,一般人想到的是 redis.memcache 这些内存型的缓存. 但是实际上 mysql 也提供了缓存,mysql 里面的缓存是查询缓存,可以把我们查询过的语句缓存下来,下一次查询的时候有可 ...