博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSP的Servlet编程
阅读量:3957 次
发布时间:2019-05-24

本文共 7963 字,大约阅读时间需要 26 分钟。

文章目录

一. 认识Servlet

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

1. Servlet和JSP的区别

2. Servlet 运行机制

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

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

二. Servlet的概述

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

在这里插入图片描述

1. Servlet的本质

Servlet是一个Java,但不是所有的java都是servlet

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

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

(1). doGet():

接受并处理所有get提交方式的请求

(2). doPost()

接受并处理所有post提交方式的请求

(3). 使用Servlet的条件

要想使用Servlet,必须配置:

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(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"%>
Insert title here WelcomeServlet
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{
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet..."); } @Override protected 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文件
Servlet25Project
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
WelcomeServlet
servlet.WelcomeServlet
WelcomeServlet
/WelcomeServlet

在这里插入图片描述

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

1. 编写一个类,继承HttpServlet

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

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

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

1. 操作过程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 总结

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

在这里插入图片描述

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:

并且请求...,则寻找范围:即会在src根目录中寻找,也会在WebContent根目录中寻找

在这里插入图片描述

如果:index.jsp中请求:

...,寻找范围:先在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 都可以访问 	
参数名
参数值
设置局部参数,该参数只有相应的 Servlet 才能访问
Servlet 名称
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 对象来使用

三. 使用过滤器

(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映射

/MyServlet
只拦截访问MyServlet的请求
/*
拦截一切请求,每一次访问都会被拦截

在这里插入图片描述

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); } //监听session public void sessionCreated(HttpSessionEvent se) {
System.out.println("监听HttpSession,创建HttpSession对象..."+se); } public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("监听HttpSession,销毁HttpSession对象.."+se); } //监听request public 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

转载地址:http://vqxzi.baihongyu.com/

你可能感兴趣的文章
POJ 1251 Jungle Roads(最小生成树简单题)
查看>>
HDU 1690---Bus System(Floyd模板题+合理定义INF)
查看>>
POJ 2240---Arbitrage(Floyd的dp思想)
查看>>
Dijkstra算法---模板
查看>>
POJ 3680(费用流)
查看>>
校oj10532: 生成字符串(dp,最优状态转移)
查看>>
平衡二叉树(AVL树)
查看>>
POJ1521---哈夫曼编码,求最优WPL
查看>>
POJ---2010(Moo University - Financial Aid,优先队列)
查看>>
POJ---3662(Telephone Lines,最短路+二分*好题)
查看>>
L2-007. 家庭房产(并查集)
查看>>
L2-016. 愿天下有情人都是失散多年的兄妹(搜索)
查看>>
L2-019. 悄悄关注
查看>>
POJ 3468 A Simple Problemwith Integers(SplayTree入门题)
查看>>
营业额统计 HYSBZ - 1588 (伸展树简单应用)
查看>>
HDU 1890 Robotic Sort(伸展树---反转应用)
查看>>
POJ 3580 SuperMemo(伸展树的几个基本操作)
查看>>
(十) Web与企业应用中的连接管理
查看>>
(八) 正则表达式
查看>>
一.JavaScript 基础
查看>>