Servlet笔记6--Servlet程序改进
第一步改进,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程序改进的更多相关文章
- Servlet笔记2--模拟Servlet本质、第一个Servlet程序、将响应结果输出到浏览器中
以下代码均非IDE开发,所以都不规范,仅供参考 模拟Servlet本质: 模拟Servlet接口: /* SUN公司制定的JavaEE规范:Servlet规范 Servlet接口是Servlet规范中 ...
- servlet 笔记
Servlet的作用是接收浏览器传给服务端的请求(request),并将服务端处理完的响应(response)返回给用户的浏览器,浏览器和服务端之间通过http协议进行沟通,其过程是浏览器根据用户的选 ...
- 实现一个servlet的helloworld小程序(不适用Eclipse)
实现一个servlet的helloworld小程序(不适用Eclipse) 1. 在tomcat中的webapps下建一个应用程序FirstServlet(C:\tomcat\webapps\Firs ...
- JavaWeb学习笔记之Servlet(一)
1. 引子: 当我们开始进入JavaWeb开发的学习时,我们就必须要和Servlet和HTTP这两个词进行打交道了,尤其是Servlet.即使到了后面使用JSP (我们知道JSP其本身就是一个Serv ...
- Servlet 笔记-过滤器
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servlet 过滤 ...
- Servlet 笔记-servlet实例
Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类.Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.h ...
- Java Servlet 笔记4
Servlet 客户端 HTTP 请求 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的. 读取 HTTP 头的 ...
- Java Servlet 笔记3
Servlet 表单数据 很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. 1. ...
- Java Servlet 笔记1
1. 什么是Servlet. Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序 ...
随机推荐
- 9款最佳的Linux文件比较工具
程序员和撰稿人在编写程序文件或平常的文本文件时,有时想知道两个文件或同一文件的两个版本之间的差异.你在Linux上比较两个计算机文件时,文件内容之间的差异就叫diff.这一描述来源于提到diff的输出 ...
- T4扩展程序
T4功能强大,不用简直就是浪费青春.vs是没有自带对T4模板编辑的扩展的,写着很累很累(我很low我承认) 这两个驯兽师能帮你驯服它 Devart T4 Editor T4 Toolbox
- forEach遍历数组对象且去重
forEach遍历数组对象 var obj1 = [{ key: '01', value: '哈哈' }, { key: '02', value: '旺旺' }, { key: '03', value ...
- 【大数据】Kafka学习笔记
第1章 Kafka概述 1.1 消息队列 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息 ...
- Shell脚本创建Nginx的upstream及location配置文件
#!/bin/sh ##################################################### # Name: create_nginx_conf.sh # Versi ...
- 【CF739E】Gosha is hunting(动态规划,凸优化)
[CF739E]Gosha is hunting(动态规划,凸优化) 题面 洛谷 CF 题解 一个\(O(n^3)\)的\(dp\)很容易写出来. 我们设\(f[i][a][b]\)表示前\(i\)个 ...
- 51nod 1471 小S的兴趣 | 分块 链表
51nod 1471 小S的兴趣 题面 小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题 ...
- centos下安装ngnix+php+mysql服务
一.nginx 安装 1.查看yum下nginx版本信息 [root@localhost ~]# yum list | grep nginx 2.手动添加nginx的yum仓库 [root@local ...
- 洛谷 3379 最近公共祖先(LCA 倍增)
洛谷 3379 最近公共祖先(LCA 倍增) 题意分析 裸的板子题,但是注意这题n上限50w,我用的边表,所以要开到100w才能过,一开始re了两发,发现这个问题了. 代码总览 #include &l ...
- UVA.12716 GCD XOR (暴力枚举 数论GCD)
UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...