如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术。那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术。

Servlet技术简介

Servlet技术是SUN提供的一种开发动态网页的核心组件之一。可以方便的开发动态网页。主要用得语言是java,开发者只需要实现相应的接口或者继承相应的类,那么你的java文件就是一个动态的网页。当然好需要一些额外的配置即可。

一个Servlet其实就是一个运行在web server上得一个java程序。

Servlet结构体系

为了方便开发者进行基本的动态网页开发,那么SUN提供了一整套接口和类帮助开发者进行高效的开发。

1  Servlet接口

2  GenericServlet类
GenericServlet实现了Servlet接口的抽象类。

3  HttpServlet类

HttpServlet继承了GenericServlet的抽象类。

Servlet体验

.    建立动态网站的目录结构
. 编写一个动态网页如下HelloServlet.java
package cn.itcast.servlets;
import javax.servlet.*;
import java.io.*;
public class HelloServlet extends GenericServlet
{
public void service(ServletRequest req,ServletResponse res)
throws ServletException,IOException{
// 创建一个需要输出的数据
String data = "hello servlet!";
// 将以上的数据发送给浏览器进行显示
res.getOutputStream().write(data.getBytes());
}
}
.    编译以上的HelloServlet.java
将JavaEE需要的jar包引入到classpath环境变量
set classpath=%tomcat_home%\lib\servlet-api.jar
编译
D:\test>javac -d . HelloServlet.java
.    将编译好的包连同class文件剪切到网站的WEB-INF\classes目录
. 将class文件映射为浏览器需要的URL路径
修改web.xml文件如下
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>helloservlet</servlet-name>
<servlet-class>cn.itcast.servlets.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/helloservlet</url-pattern>
</servlet-mapping>
</web-app>
.    将编写好的网站部署到tomcat的webapps目录
http://localhost:8080/test/helloservlet

运行结果:hello servlet

总结:

  1. 编译servlet比较繁琐。
  2. 配置servlet比较繁琐。

2  IDE体验

  1. 自动编译
  2. 自动配置
  3. 集成发布

Servlet、GenericServlet和HttpServlet

1  Servlet接口

Servlet接口主要用于定义初始化servlet、处理用户请求、从web server中移除servlet等生命周期方法。如果开发者需要实现servlet接口,那么推荐继承GenericServlet或HttpServlet。

. The servlet is constructed, then initialized with the init method.       构造函数、init()
. Any calls from clients to the service method are handled.  service()
. The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.

举例1:体验生命周期方法。

public class Demo2 extends GenericServlet {
// 创建对象
public Demo2(){
System.out.println("构造 函数");
}
// 初始化
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("init方法");
}
// 处理用户的请求
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("service方法");
}
// 移除方法
public void destroy() {
super.destroy();
System.out.println("destroy方法");
}
}

总结:

.    servlet 执行的流程是:创建对象初始化处理用户请求销毁
. 创建对象初始化只是执行一次
. 销毁在服务器关闭的时候进行执行
. 只有用户第一次访问servlet时候如果web server中没有该servlet的对象那么才创建。(懒装载)
. servlet定义的生命周期方法全部由web server自己调用(回调)
. servlet全部是单例
. 一般在实际开发中主要使用的service方法。

2 GenericServlet抽象类

该类是一个通用的servlet类,实现Servlet和ServletConfig接口。如果要实现HTTTP协议,那么请继承HttpServlet类。

该类使得定义servlet变得简单,提供了一些日志、ServletConfig、以及版本的方法。内部声明了一个ServletContext接口类。

该类默认的对Servlet接口的方法进行空实现。但是对于init方法它获取了传递进来的ServletConfig类赋值给了自己定义的ServletConfig成员变量。随后调用了自己的inti()方法。

定义了唯一的一个抽象方法service().

3  HttpServlet抽象类

如果一个网站需要实现HTTP协议的Servlet,那么必须是HttpServlet的子类。那是作为HttpServlet的子类必须重写以下方法中的至少一个:

doGet, if the servlet supports HTTP GET requests      处理用户的GET请求
doPost, for HTTP POST requests  处理用户的POST请求
doPut, for HTTP PUT requests  处理用户的PUT请求
doDelete, for HTTP DELETE requests  处理用户的DELETE请求
init and destroy, to manage resources that are held for the life of the servlet  生命周期方法
getServletInfo, which the servlet uses to provide information about itself  获取servlet信息

我们应该主要的重写doGet和doPost方法。

举例:使用HttpServlet实现处理用户的请求。

public class Demo3 extends HttpServlet {
public Demo3(){
System.out.println("创建对象");
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("初始化");
}
// 处理用户的get请求,地址栏直接回车、a、form默认
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的get请求");
}
// form表单中的method修改为post
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的POST请求");
}
}

思考:HttpServlet继承自GenericServlet实现了Servlet接口,但是自己使用doGet和doPost方法处理用户的请求,那么还需要原来定义的service()?

Tomcat处理用户请求的时候一定执行的Servlet接口中定义的service()

但是用请求的Servlet如果直接继承了HttpServlet那么还是执行Servlet接口的service()方法

该方法中默认调用HttpServlet中自定义的实现了Http协议的service(),该方法中又将请求转发给了相应的doGet或doPost()导致最终处理用户请求的方法是doGet或doPost()。

但是如果开发者手工的重写了Servlet接口的service方法,那么默认不能进行转发。

举例1: 阅读以下程序的运行结果。

public class Demo3 extends HttpServlet {
public Demo3(){
System.out.println("创建对象");
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("初始化");
}
// 处理用户的get请求,地址栏直接回车、a、form默认
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的get请求");
}
// form表单中的method修改为post
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的POST请求");
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
super.service(req, res);
System.out.println("service方法");
}
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
super.service(req, resp);
System.out.println("httpservlet service");
}
}

运行结果如下:

创建对象

初始化

处理用户的POST请求

httpservlet service

service方法

java学习笔记—Servlet技术(11)的更多相关文章

  1. 201521123016 《Java学习笔记》 第11周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...

  2. Java学习笔记之---Servlet

    Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...

  3. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  4. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  5. 20155234 2016-2017-2第十周《Java学习笔记》学习总结

    20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...

  6. Java学习笔记之log4j与commons-logging<转>

    Java学习笔记之log4j与commons-logging<转> (2011-02-16 11:10:46) 转载▼ 标签: 杂谈 分类: 技术学习之其他 Logger来自log4j自己 ...

  7. 20145330第十周《Java学习笔记》

    20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...

  8. 20145330第九周《Java学习笔记》

    20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...

  9. java学习笔记05--字符串 .

    java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...

随机推荐

  1. Eclipse 插件集合

    以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1)    AmaterasUML        介绍:Eclipse的UML插件,支持UML活动图,class图,sequenc ...

  2. 安装wget

    今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装. 可以通 ...

  3. 10G个64bit整数,找出中位数

    [10G个64bit整数,找出中位数] 题目:在一个文件中有10G个64bit整数,乱序排列,要求找出中位数.内存限制为2G. 解法:内存限制为2G表面上是限制,实际上是一种提示,在提示我们如何利用2 ...

  4. Wrapper模式(Decorator模式)

    [Wrapper模式(Decorator模式)] 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 意图: 动态地 ...

  5. PLSQL优化基础和性能优化 (学习总结)

    PLSQL优化基础和性能优化 (学习总结) 网上有一篇关于PLSQL优化的文章,不错,个人根据自己的经验再稍加整理和归纳,总结PLSQL优化和性能调优 适合有一定PLSQL基础,需要进一步提高的学友看 ...

  6. 拒绝用户登录:/bin/false和/usr/sbin/nologin

    要拒绝系统用户登录,可以将其shell设置为/usr/sbin/nologin或者/bin/false 1 # usermod -s | --shell /usr/sbin/nologin usern ...

  7. rabbitmq 和Spring 集成 实现(一)

    1.增加pom.xml依赖 <!--rabbitmq消息队列依赖架包--> <dependency> <groupId>org.springframework.am ...

  8. [Training Video - 2] [Java Introduction] [Operator, Loops, Arrays, Functions]

    Operator : While Loop : For Loop :  Arrays : Code : public class FirstJavaClass { public static void ...

  9. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  10. Android Service 通知Activity更新界面的方法研究

    Android Service 通知Activity更新界面的方法研究   Android的最重要的组件式service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题. ...