第一步改进,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. app流畅度测试--使用手机自带功能

    1.进入开发者选项,在“监控”选项卡找到“GPU呈现模式分析”的选项 2.开启后,即可以条形图和线形图的方式显示系统的界面相应速度 3.那么要如何根据曲线判断系统是否流畅呢?实际上这个曲线表达的是GP ...

  2. 腾讯下载的视频qlv格式转化为MP4格式

    最近在看腾讯视频的时候发现下载下来的视频格式都是qlv格式,且不能用其他播放器播放,甚是恼怒,网上找了很多方法都很繁琐,于是自己写了一个小程序来处理这个问题.把下载下来的qlv格式转化为MP4格式 首 ...

  3. python使用SMTP发送qq/sina邮件

    python使用qq邮箱(个人邮箱)发送邮件需开启qq邮箱的SMTP服务 在设置中开启pop3/SMTP服务,返回的密码就是之后代码中登录使用账户密码(在完整代码中标识了出来) 之后出现如下错误 sm ...

  4. python的/和//运算

    #谁能告诉我这个框框怎么去掉!!! python中"/"操作为除法操作,"//"操作为整数除操作,具体差异如下 " / "表示 浮点数除法, ...

  5. opencv图片转幻灯片视频

    /*g++ *.cpp `pkg-config --cflags --libs opencv` -std=c++11*/ #include <opencv2/opencv.hpp> usi ...

  6. 【刷题】BZOJ 2693 jzptab

    Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sa ...

  7. Container With Most Water - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Container With Most Water - LeetCode 注意点 没什么好注意的... 解法 解法一:暴力求解,假设任意两个端点会是最佳答 ...

  8. LGP4518[JSOI2018]绝地反击

    题解: 只要确定了每艘飞船的就位位置,就可以用二分+网络流求得答案: 定义偏转角度$a$为离$x$正半轴逆时针最近的边的弧度,$a \in [0,\frac{2\pi}{n})$ 二分一个值,对于一个 ...

  9. bzoj3463【COCI2012】 Inspector

    题目描述 在一个小国家中,一个新的小镇终于建成了!如往常一样,Mirko获得了“首席税务巡查员”的职位.他的任务是保证正确地计算各公司的收入情况.一共有N家办公室坐落在主干道上,从左到右被编号为1~N ...

  10. MySQL 第四篇:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...