servlet原理详解+案例练习

servlet基础原理

什么是servlet

Servlet是Server Applet的简称,翻译过来就是服务程序。是由sun公司提供的一门用于开发动态Web资源的技术。

简单地讲,Servlet就是运行在服务器上的一个小程序,用来处理服务器接收到的请求。

比如一般的网页程序,是由我们通过浏览器来访问实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收到请求,并对浏览器的请求做出相应的处理。而Servlet就是对请求做出处理的组件,运行于支持java的应用服务器中。

用idea创建web项目

  1. 新建Java项目

在这里插入图片描述

  1. 添加web框架

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

  1. 配置tomcat

在这里插入图片描述

servlet的生命周期

生命周期是什么

简单来说,就是从servlet出现到消亡(销毁)的全过程。

服务器启动时或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init,该servlet对象去处理所有客户端请求,在service方法中执行,最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。

生命周期示意图

在这里插入图片描述

1.实例化阶段

①通过配置文件web.xml进行实例化

<?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/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--配置servlet生命周期的servlet-->
    <servlet>
        <servlet-name>testServlet</servlet-name>
        <servlet-class>org.softeem.controller.ActionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testServlet</servlet-name>
        <url-pattern>/friend_demo/action</url-pattern>
    </servlet-mapping>
</web-app>

② 通过注解进行实例化

@WebServlet("/friend_demo/action")
public class ActionServlet extends HttpServlet {
	//1、构造器
    public ActionServlet(){
        System.out.println("servlet对象实例化中.....");
    }
}
2.初始化阶段

Servlet 初始化阶段分为 2 步:

  1. 加载和实例化 Servlet
  2. 调用 init() 方法进行初始化

servlet实例化后就会调用init方法,被设计为只能调用一次,且是在进行第一次实例化servlet对象时调用。当用户在调用servlet时,就会创建一个servlet实例,每一次在客户端发送的请求servlet就会产生一个新的线程,从而调用对应的doGet 或 doPost 方法。init方法的作用在于初始化一些配置参数(比如编码设置),这些参数将被贯穿整个servlet生命周期。

3.请求响应阶段

调用service()方法是执行实际任务的主要方法,Web服务器将调用service方法处理客户端(浏览器)的请求,然后将格式化的数据响应给浏览器客户端。

service方法将会检测客户端发送给服务端的HTTP请求协议的类型,从而调用service方法中的 doGet、doPost、doPut、doDelete 等方法进行实际任务的逻辑处理。当发送对应的servlet请求时,会调用service()方法,此时不会重新创建servlet实例,也不会调用init()方法。

4.服务终止阶段

servlet生命周期结束时将会调用destroy()方法,并且只会调用一次。destroy方法可以让我们的servlet关闭数据库连接,把后台线程关闭,清楚Cookie数据等。当调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除

servlet接口

通过继承HttpServlet事件servlet接口最为方便

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;
 
    ServletConfig getServletConfig();
 
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
 
    String getServletInfo();
 
    void destroy();
}
常用方法

1.被创建:执行init方法,只执行一次。一般用于申请资源

​ Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。

​ 多个用户同时访问时,可能存在线程安全问题。

​ 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值

2.提供服务:执行service方法,执行多次(可以业务逻辑代码)

​ 每次访问Servlet时,Service方法都会被调用一次。

3.被销毁:执行destroy方法,只执行一次。一般用于释放资源

​ Servlet被销毁时执行。服务器关闭时,Servlet被销毁

​ 只有服务器正常关闭时,才会执行destroy方法。

​ destroy方法在Servlet被销毁之前执行,一般用于释放资源

ServletRequest接口

@WebServlet("/demo")
public class ServletDemo extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp){
		//方法体是Get请求方式的处理
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp){
		//方法体是Post请求方式的处理
	}
}
servlet获取参数的方法

Servlet获取get和post参数的方式,主要有三种:

  1. 使用getParameter()获取参数方法,单个获取。
  2. 使用getParameterMap()获取Map键值对参数的方法。
  3. get特有的查询字符串的方法以及post以流的形式查询字符串的方法。

HttpServlet

使用步骤
  1. 自定义Servlet不实现Servlet接口,而是extends HttpServlet类
  2. 重写doGet()doPost()方法,这两个方法是对Get和Post操作的处理逻辑
  3. 获取HTTP请求信息。通过HttpServlet的Request对象来检索HTML表单所提交的数据或URL上的查询字符串
  4. 生成HTTP响应结果。通过HttpServlet的Response对象生成响应结果。
重写doPost()

HttpServlet与Http进行了绑定,因此如果我们要使用它就需要重写doGet、doPost等方法

在这里插入图片描述

转发与重定向

在实际的网站开发中,页面的跳转是最常见的。Servlet中的页面跳转可以通过转发或者重定向来实现。转发使用RequestDispatcher,重定向使用HttpServletResponse。

public interface RequestDispatcher {
	void forward(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}
public interface HttpServletResponse extends ServletResponse {
	void sendRedirect(String var1) throws IOException;
}

二者区别:

1.请求次数

重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;

2.地址栏不同

重定向地址栏会发生变化,转发地址栏不会发生变化;

3.共享数据

重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);

4.跳转限制

重定向可以跳转到任意URL,转发只能跳转本站点资源;

5.发生行为不同

重定向是客户端行为,转发是服务器端行为;

访问路径

读取路径
  • getContextPath()
  • getServletPath()
  • getPathInfo()
匹配方式
  1. 精确匹配(常用)

例如:http://localhost:8080/user

  1. 目录匹配

“/user/*” 表示user目录之下

  1. 扩展名匹配

“*.do”表示后缀名do结尾

转发路径和重定向路径

在Servlet中使用绝对路径进行转发和重定向,他们的路径起算点是不相同的,转发时以项目名称作为起算点,重定向时以端口号作为起算点。而如果使用相对路径进行重定向或转发,他们都是以当前所在路径作为起算点

登录案例实现

jsp+jdbc+servlet实现,基于mvc设计模式

项目结构

在这里插入图片描述

创建数据库

在这里插入图片描述

登陆主页index.jsp

在这里插入图片描述

登录成功页

在这里插入图片描述

登陆失败页

在这里插入图片描述

JDBC连接类和工具类

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

在entity层编写用户实体

在这里插入图片描述

编写dao层接口以及实现类

在这里插入图片描述

在这里插入图片描述

编写service接口以及实现类

在这里插入图片描述

编写servlet

在这里插入图片描述

运行演示

登陆页面

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

登陆成功页面

在这里插入图片描述

登陆失败页面

在这里插入图片描述

项目总结

本次案例,主要是根据MVC开发模式,做了一个简单的登录案例,里面还有很多缺陷,并没有做到完全的面向对象开发,开发过程主要使用了jsp的一些知识,主要设计jsp的九大内置对象的使用,还有部分servlet的使用。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeff_Xxxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值