javaSE学习笔记—Servlet技术(11)

如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术。那么在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体验

1.    建立动态网站的目录结构
2.    编写一个动态网页如下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());
    }
}
3.    编译以上的HelloServlet.java
将JavaEE需要的jar包引入到classpath环境变量
set classpath=%tomcat_home%\lib\servlet-api.jar
编译
D:\test>javac -d . HelloServlet.java
4.    将编译好的包连同class文件剪切到网站的WEB-INF\classes目录
5.    将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>
6.    将编写好的网站部署到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。

1. The servlet is constructed, then initialized with the init method.      ? 构造函数、init()
2. Any calls from clients to the service method are handled.         ? service()
3. 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方法");
    }
}

总结:

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

时间: 2024-10-10 19:45:34

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

学习笔记--Servlet技术

------------------------------------------------------------------------------------------------------------------------------------- //Servlet概述 一个servlet就是一个java类,并提供基于请求-响应模式的web服务. //创建Servlet 新建继承HttpServlet的类,覆盖init(), destroy(), service(HttpSe

javaSE学习笔记—Servlet配置(12)

问题1: 用户是否可以即使用get又使用post发送请求? 对于开发人员而言不知道用户到底要使用什么请求方式,因此需要将doGet或doPost都要重写.但是响应的数据时一样,因此可以在实现一个方法的基础上在另一个方法中直接调用即可. public class Template extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws Servle

javasE学习笔记:关键字super的使用

/* super 的作用: 1 . super可以在子类中引用父类的成员,通过 .的方式和属性.this相对应. 2. 在子类的构造方法中可以可使用super(参数列表)语句调用父类的构造方法 3. 注意: 子类的构造方法中一定要调用父类的构造方法.... */ javasE学习笔记:关键字super的使用,布布扣,bubuko.com

多IDC数据分布--MySQL多机房部署 - 学习笔记 - 51CTO技术博客

多IDC数据分布--MySQL多机房部署 - 学习笔记 - 51CTO技术博客 多IDC数据分布--MySQL多机房部署

web学习笔记-servlet

web学习笔记-servlet 概念 servlet是一个小应用程序,用于处理从客户端发送的请求及服务端的响应. 详情参见: 百度百科的定义 在idea创建servlet 在src右键新建servlet,如图所示: 然后会报异常可以下载包,也可以添加tomcat中的包,添加tomcat->lib-->servlet-api.jar作为libraries. 然后再打开web.xml此时会发现多出一个servlet标签 ServletDemo1 servelt.ServletDemo1 "

javaSE学习笔记Xpath简介与web服务器(8)

Xpath是一个独立的一个路径语言,主要的目的是为了查找路径中的元素. 那么DOM4J默认支持Xpath的路径查找. 常用的方法有以下的两种: selectNodes(“xpath”) ? 查询指定路径的所有的元素 selectSingleNode(“xpath”) ? 查询指定路径的第一个元素 ? 常用的Xpath路径写法 /AAA 指定从XML文档的根开始写路径 //BBB 指定从整个XML中搜索满足的元素名 /AAA/CCC/DDD/* 指定路径下所有的元素 //* 指定获取所有的元素 /

javaSE学习笔记XML解析技术(5)

JAXP技术 JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术.大家可以参见SUN的以下两个包: javax.xml.parsers.*                                   à主要存储的是解析器 org.w3c.dom.*或org.w3c.sax.*     à主要存储的是DOM解析或SAX解析需要的API DOM解析主要采用DOM树的方式进行XML的数据

JavaSE 学习笔记之反射技术(二十四)

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

javaSE学习笔记—HTTP协议(10)

客户端浏览器和服务器Tomcat要进行基本的请求和响应的处理. 其实浏览器和服务器通信的数据的格式已经使用协议进行固定好了,只要双方发送固定格式的数据,那么就可以完成基本的通信. 如果开发者需要查看这样的数据格式,那么就需要安装一个浏览器的HTTP协议相关的插件. 如果要深入的学习浏览器和服务器通信的数据,那么需要详细的掌握他们之间发送的数据内容. 1  请求信息 GET / HTTP/1.1 ? 请求行 Accept: */* Accept-Language: zh-cn,en-US;q=0.