文章目录

  • 一. 认识Servlet
    • 1. Servlet 运行机制
  • 二. Servlet的概述
    • 1. Servlet的本质
      • 1.1 编写Servlet程序
      • 1.2 编写Servlet的映射
      • 1.3 配置Tomcat
    • 2. Servlet2.5版本配置:web.xml
      • (1). 项目根目录
      • (2). Servlet流程举例理解
      • (3). 纯手工方式创建第一个Servlet步骤
        • 1. 编写一个类,继承HttpServlet(需要导入servlet-api.jar)
        • 2. 重写doGet()、doPost()方法
        • 3. 编写web.xml中的servlet映射关系
        • 4. 访问servlet:从html页面访问
      • (4). 借助于Eclipse快速生成Servlet
        • 1. 操作过程
        • 2. 总结
      • (5). IDEA创建servlet入门
        • 第一和第二步骤
        • 第三步
        • 第四步
    • 3. Servlet3.0版本配置
      • (1). Servlet3.0与Servlet2.5的区别
      • (2). 匹配流程
      • (3). 根路径理解(/)
    • 4. Servlet生命周期
      • (1). 5个阶段
      • (2). 初始化
      • (3). 服务
      • (4). 销毁
    • 5. Servlet API
      • (1). Servlet继承关系
        • 1. ServletConfig:接口
        • 2. Servlet容器
        • 3. Servlet使用层面
    • 6. Servlet 与 JSP 内置对象
      • (1). 获得 out 对象
      • (2). 获得 request 和 response 对象
      • (3). 获得 session 对象
      • (4). 获得 application 对象
    • 7. servlet整合jdbc
  • 三. 使用过滤器
    • (1). 为什么需要使用过滤器
    • (2). 过滤器和拦截器
      • 1. 过滤器
      • 2. 过滤器链
  • 四、监听器
    • 1. 监听对象的创建和销毁
    • 2. 监听对象中属性的变更
    • 3. 监听器的开发步骤

一. 认识Servlet

Servlet 是一种运行在服务器端(一般指的是 Web 服务器)的 Java 应用程序,可以生成动态的Web页面,它是属于客户与服务器响应的中间层。因此,可以说,JSP就是Servlet。两者可以实现同样的页面效果,不过,编写 JSP 和编写 Servlet 相比,前者成本低得多

  • Servlet对象是tomcat服务器提供的一个后台服务器端对象,作用是用来接收客户端发起的请求以及返回服务器端的响应。
    (tomcat解压后的目录lib里面的servlet-api.jar提供的servlet)
  • Servlet广义上来说就是所有实现servlet接口的实现类,狭义上就是指servlet接口对象。

1. Servlet 运行机制

初次运行,系统会实例化 Servlet

Servlet 采用的是多线程机制,每一次请求,系统就分配一个线程来运行 doGet 函数。但是这样也会带来安全问题,一般说来,不要在 Servlet 内定义成员变量,除非这些成员变量是所有的用户共用的

二. Servlet的概述

JSP ——>Java(Servlet)——>JSP

1. Servlet的本质

Servlet就是sun公司开发动态web的一门技术
Sun在这些API提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需完成两个小步骤:

  • 编写一个类,实现Servlet接口
  • 把开发好的Java类部署到web服务器中

把实现了Servlet接口的Java程序叫做:Servlet

Java类必须符合一定的规范:

  • 必须继承javax.servlet.http.HttpServlet
  • 必须重写其中的doGet()或doPost()方法

1.1 编写Servlet程序

package com.pudding.servlet;public class HelloServlet extends HttpServlet {//由于get和post只是请求实现的不同方式,可以相互调用,业务逻辑都一样@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("进入doGet()方法");PrintWriter writer = resp.getWriter(); //响应流writer.println("Hello Servlet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}//doGet():接受并处理所有get提交方式的请求
//doPost():接受并处理所有post提交方式的请求

1.2 编写Servlet的映射

  • 为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"metadata-complete="true"><!--注册Servlet--><servlet><servlet-name>hello</servlet-name><servlet-class>com.pudding.servlet.HelloServlet</servlet-class></servlet><!--servlet的请求路径--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>
</web-app>

1.3 配置Tomcat

servlet的本质是什么?

2. Servlet2.5版本配置:web.xml

使用Servlet的条件
要想使用Servlet,必须配置:

  • Servlet2.5版本配置:web.xml
  • Servlet3.0版本需要写注解:@WebServlet



(1). 项目根目录

WebContent
src

(2). Servlet流程举例理解

请求——>被web.xml里面的servlet-mapping中的"url-pattern"所拦截,"url-pattern"根据自己的"servlet-name"去匹配——>servlet里面的servlet-name
然后寻找到servlet-class,最后将请求交于该servlet-class的文件

index.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><a href="WelcomeServlet">WelcomeServlet</a><br><form action="WelcomeServlet" method="post"><input type="submit" value="提交"></form></body>
</html>
WelcomeServlet.javapackage servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class WelcomeServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost...");//所有的请求都会落到doGet()或者doPost()方法里面/** 如果是get请求就跳到doGet()方法里面* 如果是post请求就跳到doPost()方法里面* 一般写项目的时候不管是get还是post我们处理方式应该是一样的* 所以我们的一般写法如下:* 不管是get还是post都放到一个里面去处理(get或post)* */this.doGet(req, resp);}
}
web.xml文件<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>Servlet25Project</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>WelcomeServlet</servlet-name><servlet-class>servlet.WelcomeServlet</servlet-class></servlet><servlet-mapping><servlet-name>WelcomeServlet</servlet-name><url-pattern>/WelcomeServlet</url-pattern></servlet-mapping></web-app>

(3). 纯手工方式创建第一个Servlet步骤

1. 编写一个类,继承HttpServlet(需要导入servlet-api.jar)

注意事项:必须将jar包放在web目录下面的WEB-INF下面的lib目录下

2. 重写doGet()、doPost()方法

重写servlet中service方法:处理请求和响应

3. 编写web.xml中的servlet映射关系

4. 访问servlet:从html页面访问

(4). 借助于Eclipse快速生成Servlet

1. 操作过程






2. 总结

直接新建Servlet即可!(继承、重写、web.xml 可以借助Eclipse自动生成)

(5). IDEA创建servlet入门

第一和第二步骤

第三步

第四步



servlet执行流程:

  1. 页面发起一个请求,访问后台servlet:访问index路径
  2. 根据href属性值去查找web.xml中的标签
  3. 根据web.xml中标签查找到具体的servlet路径
  4. 调用servlet类中的service方法,执行逻辑代码

3. Servlet3.0版本配置



(1). Servlet3.0与Servlet2.5的区别

Servlet3.0不需要在web.xml中配置,但需要在Servlet类的定义处之上编写注解(也就是url-pattern的参数值)

(2). 匹配流程

请求地址与@WebServlet中的值进行匹配,如果匹配成功,则说明请求的就是该注解所对应的类

(3). 根路径理解(/)


项目根目录:WebContent、src(代表所有的构建路径)都是根目录

构建目录:

新建abc一个文件夹,但此时abc文件夹不是一个构建目录

将abc变为构建目录


或者直接新建java的源文件会自动添加到构建路径

项目一般默认一个构建路径src

举例理解:

src构建路径中有一个Servlet.java文件
WebContent目录中直接有一个文件index.jsp:

并且请求<a href="abc">...</a>,则寻找范围:即会在src根目录中寻找,
也会在WebContent根目录中寻找


如果:index.jsp中请求:

<a href="a/abc">...</a>,寻找范围:
先在src或webcontent中找a目录,
然后再在a目录中找abc

重点:/到底代表什么东西

web.xml中的/表示:代表项目根路径
http://localhost:8080/Servlet25Project/WelcomeServlet2

拼接之后为:http://localhost:8080/Servlet25Project/WelcomeServlet2/a/WelcomeServlet2成为请求路径

jsp中的/:代表的是服务器根路径
表示http://localhost:8080/

4. Servlet生命周期

(1). 5个阶段


(2). 初始化

init()
该方法会在Servlet被加载并实例化的以后 执行


init():默认第一次访问Servlet时会被执行(只执行这一次)

可以修改为tomcat启动时自动执行

Servlet2.5版本:

1:表示web.xml文件里面启动时第一个执行的servlet


Servlet3.0版本:在注解里面加loadOnStartup=1



destroy销毁的时候

(3). 服务

service()——>doGet()、doPost()
调用几次,则执行几次

当客户端向 Web 服务器提出第一次 Servlet 请求时,Web 服务器会实例化一个 Servlet,并且调用 init()方法

如果 Web 服务器中已经存在了一个 Servlet 实例,将直接使用此实例;然后调用 service()方法,service()方法将根据客户端的请求方式来决定调用对应的 doXXX()方法

(4). 销毁

destroy()
该方法被系统回收时执行

关闭tomcat服务时,执行一次

5. Servlet API

由两个软件包组成:对应于HTTP协议的软件包,对应于除了HTTP协议以外的其他软件包

即Servlet API 可以适用于任何通信协议
我们学习的Servlet‘是位于javax.servlet.http包中的类和接口,是基于HTTP协议

(1). Servlet继承关系

1. ServletConfig:接口


web.xml文件有两种类型的参数设置:

设置全局参数,该参数所有的Servlet都可以访问设置局部参数,只有相应的Servlet才能访问
设置全局参数,该参数所有的 Servlet 都可以访问<context-param> <param-name>参数名</param-name> <param-value>参数值</param-value> </context-param> 设置局部参数,该参数只有相应的 Servlet 才能访问<servlet> <servlet-name>Servlet 名称</servlet-name> <servlet-class>Servlet 类路径</servlet-class> <init-param> <param-name>参数名</param-name> <param-value>参数值</param-value> </init-param>
</servlet> 


获取参数的方法:

获取全局参数的方法是:ServletContext application = this.getServletContext(); application.getInitParameter("参数名称"); 获取局部参数的方法是:this.getInitParameter("参数名称");



Servlet3.0方式 给当前Servlet设置初始值:
@WebServlet(…, initParams={@WebInitParam(name=“servletparaname30”,value=“servletparavalue30”)})

注意,此注解只是隶属于一个具体的Servlet,因此无法为整个web容器设置初始化参数(如果要通过3.0方式设置web容器的初始化参数,仍然需要web.xml中设置)

2. Servlet容器

3. Servlet使用层面

6. Servlet 与 JSP 内置对象

(1). 获得 out 对象

在doget()方法里面写:

response.setContentType("text/html;charset=gb2312");//设置编码,使得可以打印输出中文字符
PrintWriter out = response.getWriter();

(2). 获得 request 和 response 对象

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{ //将 request 参数当成 request 对象使用 //将 response 参数当成 response 对象使用
}

(3). 获得 session 对象

HttpSession session = request.getSession();
//将session当成session对象来使用

(4). 获得 application 对象

ServletContext application = this.get ServletContext();
//将 application 当成 application 对象来使用

7. servlet整合jdbc

需求:
使用servlet+dbutil实现员工数据的查询操作。

步骤:

  1. 创建web项目,导入相应的jar
  2. 编写c3p0配置文件
  3. 使用jdbc实现数据库查询




三. 使用过滤器

(1). 为什么需要使用过滤器

情况一: 为了解决中文乱码问题,我们经常看到一段代码:request.setCharacterEncoding(“gb2312”); response.setContentType(“text/html;charset=gb2312”); 这是 Servlet 用来设置编码用的,如果 Servlet 的处理方法最前面没有加入这一段代码, 就很可能会出现乱码问题。如果是一个大工程的话,会有很多很多的 Servlet,于是很多人发现在这么多代码中重复设置编码,非常麻烦。而且,一旦需求变了,需要换成另外的编码,对程序员来说将是一件很繁琐的事情

情况二:很多的门户网站都会有登录页面,这是为了业务需求,同时也是为了使用户控制更加的安全。如果客户没有登录就访问网站的某一页面,在很多情况下会引发安全问题。应该如何避免这种情况?传统情况下,可以使用 session 检查来完成,但是在很多页面上都添加 session检查代码,也会比较繁琐

情况三:许多的网站都存在着各种不同的权限,比如,只有管理员才可以对网站的某些数据进行维护和修改,一般的普通用户是无法完成该功能的。登录过后,网页如何区分普通用户与管理员?如果是每一个页面写一个判断用户类型的代码,似乎也非常繁琐

(2). 过滤器和拦截器

  • 原理相同
  • 底层实现技术和应用场景不同

    注意:要想将一个普通的class变成一个具有特定功能的类(过滤器、拦截器…)要么继承父类、要么实现一个接口、要么增加一个注解

1. 过滤器

实现一个Filter接口
重写方法:init()、destroy() 他们原理、执行时机和Servlet一样

配置过滤器,类似servlet(配置xml)
通过doFilter()处理拦截,并且通过chain.doFilter(request, response); //进行放行请求和响应

filter映射

<url-pattern>/MyServlet</url-pattern> 只拦截访问MyServlet的请求<url-pattern>/*</url-pattern>拦截一切请求,每一次访问都会被拦截


dispatcher请求方式:

  • REQUEST:拦截HTTP请求(get、post)
  • FORWARD:只拦截通过请求转发方式的请求
  • INCLUDE:只拦截通过request.getRequestDispatcher("").include()、通过<jsp:include page="…"
  • ERROR:只拦截<error-page发出的请求

过滤器中doFilter方法参数:ServletRequest
在Servlet中方法参数:HttpServletRequest





2. 过滤器链


可以配置多个过滤器,过滤器的先后顺序是由<filter-mapping》的位置决定的

四、监听器

四个范围对象:PageContext、request、session、application
主要监听对象:request、session、application

1. 监听对象的创建和销毁

监听以下对象分别对应的类

  • request:ServletRequestListener
  • session:HttpSessionListener
  • application:ServletContextListener
package listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;//实现监听器接口
public class ContextSessionRequestListener implements ServletRequestListener, HttpSessionListener, ServletContextListener{//监听application(ServletContext)public void contextInitialized(ServletContextEvent sce) {System.out.println("监听ServletContext,创建ServletContext对象" +sce);}public void contextDestroyed(ServletContextEvent sce) {System.out.println("监听ServletContext,销毁ServletContext对象.."+sce);}//监听sessionpublic void sessionCreated(HttpSessionEvent se) {System.out.println("监听HttpSession,创建HttpSession对象..."+se);}public void sessionDestroyed(HttpSessionEvent se) {System.out.println("监听HttpSession,销毁HttpSession对象.."+se);}//监听requestpublic void requestInitialized(ServletRequestEvent sre) {System.out.println("监听ServletRequest,创建ServletRequest对象..."+sre);}public void requestDestroyed(ServletRequestEvent sre) {System.out.println("监听ServletRequest,销毁ServletRequest对象.."+sre);}}

每个监听器各自提供了两个方法:监听开始、监听结束的方法

ServletContext在Servlet容器启动时自动创建

2. 监听对象中属性的变更

  • request:ServletRequestAttributeListener
  • session:HttpSessionAttributeListener
  • application:ServletContextAttributeListener

每个监听器各自提供了三个方法:增加属性、替换属性、删除属性的方法

3. 监听器的开发步骤

  • 编写监听器,实现接口
  • 配置web.xml

JSP的Servlet编程相关推荐

  1. (Servlet+Jsp)Web编程笔记(一套就够了)

    文章目录 Web编程技术笔记 1. BS架构与CS架构 2. idea安装及使用 3. Servlet介绍 1. 新建一个Servlet 2. 配置web服务器 Servlet有两种配置方式 1. 注 ...

  2. java servlet jsp (服务器端编程)

    注:自动添加protected void service(HttpServletRequest request,HttpServletResponse response)throws ServletE ...

  3. JSP和Servlet的六种中文乱码处理方法

    一.表单提交时出现乱码: 在进行表单提交的时候,经常提交一些中文,自然就避免不了出现中文乱码的情况,对于表单来说有两种提交方式:get和post提交方式.所以请求的时候便有get请求和post请求.每 ...

  4. 【渝粤题库】陕西师范大学164111 Java及JSP动态网页编程与应用 作业 (高起专)

    <JAVA与JSP动态网页编程与应用>作业 一.单选题 1.以下哪项都是关键字( ) A.package privati protect throw B. false final fina ...

  5. Servlet编程API

    一.基本的servlet APIJavaEE关于Servlet的API主要有两个包:javax.servlet和javax.servlet.http.前者主要提供了Web容器能够使用的servlet基 ...

  6. 【Servlet】JSP与Servlet的关系

    Servlet Servlet是基于Java语言的Web服务器端编程技术,按照Java EE规范定义,Servlet是运行在Servlet容器中的Java类,它能处理Web客户的HTTP请求,并产生H ...

  7. servlet向ajax传递数据库,一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)...

    背景: 目前业界很流行的MVC(model-view-control)开发模式,理解为 模型是Bean, 视图是 Html/Jsp, 控制是Servlet, 关联数据库的Dao web的运行机制: 数 ...

  8. java和jsp交互 structs_Struts与jsp+javabean+servlet区别

    采用Struts框架技术和直接使用jsp+javabean技术开发各有什么优势?各自的缺点又是什么? 在Javaweb开发领域存在2种开发模式, 模式一,jsp+javabean 模式二,jsp+ja ...

  9. JSP程序设计实训(十一)——JSP与Servlet技术(一)

    JSP与Servlet技术 一.Servlet 基础知识 Servlet 是 Java Web 应用程序中的组件技术,是运行在服务器端的 Java 应用程序,实现与 JSP 类似的功能.Servlet ...

最新文章

  1. C++ 复数类加减法运算重载为成员函数形式
  2. 上传图片-服务端-Api接口定义
  3. 使用sharepreferce记录数组数据
  4. Java学习、简单代码编译
  5. Pytorch cifar10离线加载二进制文件
  6. _技巧_Chrome_Vimium插件_纯键盘控制浏览器
  7. Unity Application Block 1.0系列文章
  8. 正态分布某一点的概率怎么算_笔记|复习金融计量中概率随笔1(样本推整体)
  9. ANDROID 高性能图形处理 之 OPENGL ES
  10. 少编码多思考:代码越多 问题越多
  11. UDP网络程序,客户端和服务端交互原理
  12. 软件multisim的安装教程
  13. 数字电路基础知识——组合逻辑电路(数据选择器MUX、多路复用器)
  14. android 空气质量代码,Android-Json数据解析之空气质量检测
  15. Oracle 11g客户端网络服务名配置
  16. 【DeepLearning笔记】python规范书写
  17. java小程序-画一幅海底世界的图
  18. 使用时间序列分解模型预测商品销量
  19. Python爬懂车帝的图片-代码
  20. Win11系统白名单列表如何添加软件

热门文章

  1. kali2020识别不到网卡_kali无法识别BCM43XX系列无线网卡
  2. ftok函数 php,php坑:ftok
  3. 属于计算机主机性能的指标是,内存的性能指标有哪些 主要参数是什么
  4. JSJQuery之Validform验证 框架详解
  5. 关于Mac应用连接sql server的问题
  6. RHEL 6 修改网卡名称
  7. Linux常用命令——startx命令
  8. 屏幕分辨率和屏幕尺寸之间的关系
  9. 计算机网络(3)——速率相关的性能指标
  10. 法瑞意游记+攻略 八(罗马 一月二日) 未完