Javaweb-servlet

news/2024/11/8 6:00:59/

一、servlet入门

1.Servlet介绍

(1)什么是Servlet

Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

(2)Servlet的使用方法

Servlet技术的核心是Servlet接口,定义了Servlet与Servlet容器之间的契约,Servlet容器将Servlet类载入内存,生成Servlet实例并调用它具体的方法,所以它是所有Servlet类必须直接或者间接实现的一个接口。

(3)Servlet接口的继承结构

  • Servlet接口:只负责定义Servlet程序的访问规范;

  • GenericServlet抽象类:实现了Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用,并提供了一些ServletConfig的使用方法;

  • HttpServlet抽象类:实现了service方法,并实现了请求分发处理;

​ 2.Servlet快速入门

(1)创建javaweb项目

创建maven工程

​ 

添加webapp目录

a.右击项目,选择Add Frameworks Support

​ b.选择Web Application,再点击OK

()c.将web目录拖拽到main目录下,并改名为webapp  

  • webapp:静态资源比如 html css js可以定义在web下面

  • WEB-INF:里面的资源不能直接被外界访问 web.xml 是web项目的核心配置文件

  • index.jsp:web项目的访问首页,在默认情况我们访问的首页就是index.jsp

(2) 添加依赖

  •  在pom.xml中添加依赖
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version>
</dependency>

 (3)创建servlet实例

package com.by.servlet;import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse servletResponse) throws ServletException, IOException {servletResponse.setContentType("text/html;charset=utf-8");servletResponse.getWriter().write("<h1>hello<h1>");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

 (4)配置servlet

  • web.xml中配置

<!--配置Servletservlet-name:servlet的名称servlet-class:servlet的全类名url-pattern: 访问servlet的url-->
<servlet><servlet-name>hello</servlet-name><!--     servlet-name要和servlet-mapping所对应,映射的关系--><servlet-class>com.by.servlet.HelloServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping>

 (5)设置打包方式

  • 修改pom.xml

<!--打包方式-->
<packaging>war</packaging>

(6)部署web项目

1.点击“Edit Configurations”

2.点击"+"

3.点击Tomcat Server中的Local

4.配置Tomcat路径

5.部署web项目

6.启动tomcat

7.查看是否部署成功

(7)测试

 浏览器访问:http://localhost:8080/01_servlet_HelloWorld_war/demo

 二、servlet的生命周期

 1.什么是servlet的生命周期

Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法,什么时候销毁。

对象的生命周期:

Student student = new Student(); //创建对象
student.setName("eric"); // 使用对象
student.show();// 使用对象
student = null; // 销毁对象

也就是说自定义对象的生命周期由我们程序员自己手动控制。但是!!!Servlet它不是一个普通的java类。是一个被tomcat服务器调用的。所以Servlet是生命周期是被tomcat服务器去控制的。

2.servlet生命周期中重要的方法

  • 构造方法:创建servlet的时候调用。默认情况下,第一次访问servlet的时候,会创建servlet对象。此时会有且只会调用1次构造函数,证明了servlet对象是单实例的。

  • init方法:创建完servlet对象之后调用,也只是会调用1次。

  • service方法:提供服务的方法,接收用户的请求,并处理用户的请求,然后响应用户的请求。每次发送请求,都会调用service方法。调用几次,service方法会执行几次。

  • destroy方法:销毁的方法。销毁servlet对象的时候调用。比如我们停止tomcat服务器或者重新部署tomcat服务器,都会销毁servlet对象,只会调用1次。

3.tomcat服务器内部执行代码的原理

1、用户发送请求,tomcat服务器会根据用户发送的请求,解析web.xml配置文件,获取servlet-class的全限定名路径(com.by.servlet.ServletDemo)
2、获取字节码对象,然后通过字节码对象获取对应的实例对象
Class clazz = Class.forName("com.by.servlet.ServletDemo");
Object o = clazz.newInstance();
3、创建ServletConfig对象,然后调用init方法
Method method = clazz.getDeclaredMethod("init",ServletConfig.class);// 获取方法对象
method.invoke(o,config);
4、创建request对象,创建response对象,然后调用service方法
Method m = clazz.getDeclaredMethod("service",ServletRequest.class,ServletResponse.class);
m.invoke(o,request,response);
5、销毁servlet实例对象,也是通过反射的机制实现的
Method m1 = clazz.getDeclaredMethod("destroy",null);
m1.invoke(o,null); 

4.测试servlet的声明周期

public class LifeCycleServlet implements Servlet {public ServletDemo(){System.out.println("LifeCycleServlet has run........");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init method has run........");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method has run........");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("destroy method has run........");}
}

三、创建servlet的三种方式

1.实现Servlet接口的方式

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;@WebServlet("/test1")
public class Servlet1 implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {//s使用ServletConfig对象初始化我们的Servlet//执行了,从这个地方可以说明一个问题 Servlet已经被实例化了System.out.println("init方法执行");}@Overridepublic ServletConfig getServletConfig() {//获取servlet配置信息对象//没有执行System.out.println("getServletConfig方法执行");return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {//核心方法  类似于我们的doGet()方法,和doPost()方法 请求和响应//一定执行的System.out.println("service");}@Overridepublic String getServletInfo() {//获取Servlet的详细信息//没有执行System.out.println("getServletInfo方法执行");return null;}@Overridepublic void destroy() {//当tomcat关闭的时候,执行销毁这个servlet的方法System.out.println("destroy方法执行");//只有当tomcat关闭的时候,才会执行这个方法}
}

2.继承GenericServlet抽象类的方式

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/*
* 第二种方式:继承GenericServlet
*
* */
@WebServlet("/test2")
public class Servlet2 extends GenericServlet {//只有一个方法是必须重写的,抽象方法//为什么?service是核心方法,因为请求和响应就是执行这个方法@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {//解决中文乱码问题servletResponse.setContentType("text/html;charset=utf-8");servletResponse.getWriter().append("我是第二种创建Servlet的方法");}
}

3.继承HttpServlet的方式

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/test3")
public class Servlet3 extends HttpServlet {//因为在前端的时候,有两种请求方式get和post//doGet和doPost方法写在了Service方法中了@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");resp.getWriter().println("我是HttpServlet创建的Servlet");}
}

这三个创建方式选择哪个?

最好的方式是继承HttpServlet

1.可以减少对其他方法的要求 init destroy

2.可以根据前端的要求进行分门别类 doGet doPost


http://www.ppmy.cn/news/1287206.html

相关文章

自动化测试:selenium总结

前言 说到自动化测试&#xff0c;就不得不提大名鼎鼎的Selenium。Selenium 是如今最常用的自动化测试工具之一&#xff0c;支持快速开发自动化测试框架&#xff0c;且支持在多种浏览器上执行测试。 Selenium学习难度小&#xff0c;开发周期短。对测试人员来说&#xff0c;如果…

03 HAL库下UART的使用

引言&#xff1a; 需要使用到的uart调试工具在文章最后的资料里面 题外话&#xff1a;uart和usart的区别 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;和USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;…

原生js浪费性能吗?

首先举一个例子&#xff1a; 我要更新10个DOM节点,浏览器会一个一个的进行更新,但它更新第一个的时候并不知道后面还有9个,所以会一个一个执行,共执行10次。每一次的更新都要去计算&#xff0c;但更新后DOM树变化了&#xff0c;更新第二个的时候&#xff0c;前一次计算的就没法…

《Python百宝箱》专栏目录

序号文章目录直达链接表白系列1无法拒绝的表白界面https://want595.blog.csdn.net/article/details/1352796112满屏飘字表白代码https://want595.blog.csdn.net/article/details/1352794873无限弹窗表白代码https://want595.blog.csdn.net/article/details/1352795754李峋同款可…

linux 网络系统管理 技能大赛 samba配置

SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务 Samba共享服务的匿名访问 yum -y install samba //安装samba服务 c…

一文讲清数据资产化之确权和估值

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…

手拉手Springboot获取yml配置文件信息

环境介绍 技术栈 springboot3 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 配置文件说明&#xff1a;启动配置文件优先级&#xff1a;properties高于yml 配置文件application.yml yml是 JSON 的超集&#xff0c;简洁而强大&#xf…

C语言之整型提升

文章目录 1 有可能出现的问题2 产生以上问题的原因&#xff08;整型提升&#xff09;3 整型提升的过程4 整型提升示例5 总结 1 有可能出现的问题 代码如下 #include <stdio.h>int main () {int a -1;unsigned int b 1;if (a < b) {printf("a < b");}…