一. 基本概念

1.1 C/S架构

·C/S架构(Client/Server,客户端/服务器模式)
一种比较早的软件体系结构,也是生活中很常见的结构。这种结构将需要处理的业务合理地分配到客户端和服务器端,客户端通常负责完成与用户的交互任务,服务器通常负责数据的管理
如: Navicat 和 MySQL, Navicat为客户端 MySQL为服务器端
·特点
客户端的界面和功能可以很丰富, 用户需要安装客户端软件, 维护和升级的成本高,软件一旦更新, 所有的客户端都需要更新版本

1.2 B/S架构

·B/S架构(Browser/Server,浏览器/服务器模式)
互联网兴起后的软件体系结构,该结构将系统功能实现的主要业务逻辑集中到服务器端,极少数业务逻辑在浏览器实现,浏览器通常负责完成与用户的交互任务,服务器通常负责数据的管理
·特点
无需安装客户端,只要有浏览器即可, 维护和升级的成本低,无需更新所有客户端版本, 浏览器的界面和功能想要达到客户端的丰富程度需要花费大量的成本

1.3 B/S架构的概念

·Web本意为网页的含义,这里表示互联网上供外界访问的资源
·互联网上供外界访问的资源主要分为以下两种:
静态资源:主要指Web页面中供人们浏览的数据始终是不变
动态资源:主要指Web页面中供人们浏览的数据由程序产生,不同时间点访问页面看 到的内容各不相同
·JavaWeb主要指使用Java语言进行动态Web资源开发技术的统称,是解决相关Web互联网领域的技术总和
Servlet_01 - 图5·早期的B/S架构

Servlet_01 - 图6·后来的B/S架构
**

二. Tomcat服务器

2.1 概念

Tomcat本意为公猫的含义,最初是由Sun公司的软件架构师詹姆斯·邓肯·戴维森开发的,后来他帮助将其变为开源项目并由Sun公司贡献给Apache软件基金会
Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选

2.2 下载

·下载地址: http://tomcat.apache.org/
Servlet_01 - 图7

2.3 安装

·将apache-tomcat-9.0.37-windows-x64.zip 压缩包, 解压即可
·环境变量
不配置环境变量可能导致tomcat启动不成功, 推荐配置环境变量, 例如:
CATALINA_HOME: E:\apache-tomcat-9.0.37

2.4 目录结构

bin 主要存放二进制可执行文件和脚本
conf 主要存放各种配置文件
lib 主要用来存放Tomcat运行需要加载的jar包
logs 主要存放Tomcat在运行过程中产生的日志文件
temp 主要存放Tomcat在运行过程中产生的临时文件
webapps 主要存放应用程序,当Tomcat启动时会去加载该目录下的应用程序
work 主要存放tomcat在运行时的编译后文件,例如JSP编译后的文件

2.5 启动和关闭

·启动方式
使用bin目录下的启动脚本文件startup.bat来启动Tomcat服务器
·关闭方式
1) 使用bin目录下的关闭脚本文件shutdown.bat来关闭Tomcat服务器
2) 直接关闭黑窗口
·注意事项
启动Tomcat出现黑窗口闪退, 必须配置环境变量

2.6 访问

·访问Tomcat的URL格式: http://ip:port
Servlet_01 - 图8·访问本机安装的Tomcat: http://localhost:8080

2.7 常见配置文件

·server.xml
server.xml文件是服务器的主配置文件,可以设置端口号、设置域名或IP、默认加载的项目、请求编码等
1) 修改Tomcat端口号 :
Tomcat默认监听端口为8080, 可通过修改conf/server.xml配置文件来改变Tomcat监听的端口

Servlet_01 - 图9

Servlet_01 - 图10

·logging.properties
Tomcat服务器的日志文件的配置, 查看Tomcat启动的信息, 运行的信息, 后续程序开发过程中的错误信息都是通过日志信息来查看
控制台产生乱码的原因是在Tomcat在输出日志中使用的是UTF-8编码,而我们中文的Windows操作系统使用的是GBK编码。由于编码格式不统一,所以出现了乱码
1) 解决Tomcat启动日志信息乱码 :
修改conf目录中的logging.properties文件
重新指定为GBK的编码方式
将指定编码格式的设置行注释或删除
Servlet_01 - 图11
Servlet_01 - 图12

2.8 体会部署web项目到服务器并访问

Servlet_01 - 图13
Servlet_01 - 图14
Servlet_01 - 图15

2.9 Tomcat处理请求过程 [拓展]

Servlet_01 - 图16

1) 用户访问localhost:8080/test/index.jsp,请求被发送到Tomcat,被监听8080端口并处理 HTTP/1.1 协议的Connector获得
2) Connector把请求交给它所在Service的Engine来处理,并等待Engine的回应
3) Engine获得请求localhost:8080/test/index.jsp,匹配所有的Host 虚拟主机 (Engine下可以配置多个虚拟主机)
4) Engine匹配到名为localhost的Host虚拟主机来处理/test/index.jsp请求(如果匹配不到, 会请求交给默认的Host处理),Host会根据/test匹配它所拥有的所有的Context (Context 最重要的功能就是管理它里面的 Servlet 实例)
5) 匹配到的Context获得请求/index.jsp (.jsp底层就是Servlet)
6) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost()方法, 执行业务逻辑, 数据存储等程序
7) Context把执行完之后的结果通过HttpServletResponse对象返回给Host
8) Host把HttpServletResponse返回给Engine
9) Engine把HttpServletResponse对象返回Connector
10) Connector把HttpServletResponse对象返回给客户Browser。

三. Idea集成Tomact服务器

· 程序的开发都会使用开发软件, 如: Idea
如果开发软件不集成Tomcat服务器, 需要每次将开发的项目手动的放到webapps文件夹中, 开发的过程中, 代码需要频繁的更改, 所以就需要频繁的将项目放到webapps文件夹中, 十分的繁琐
· Idea集成Tomact服务器之后, 就可以在Idea中完成项目的部署, 相关的设置以及服务器的启动, 关闭等操作

Servlet_01 - 图173.1 创建一个模块(项目)

3.2 选择JavaWeb类型的项目

Servlet_01 - 图18
Servlet_01 - 图19
Servlet_01 - 图20

Servlet_01 - 图213.3 指定模块的名字, 模块的路径

Servlet_01 - 图223.4 创建完成


四. Servlet的概念和使用

4.1 基本概念

· Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是Java语言编写的服务器端程序,换句话说Servlet就是运行在服务器上的Java类
· Servlet用来完成B/S架构下客户端请求的响应处理,也就是交互式的生成数据,生成动态 Web内容

4.2 Servlet的编程步骤

1) 建立一个Java Web Application项目并配置Tomcat服务器
Servlet_01 - 图232) 自定义一个类, 继承HttpServlet类, 重写父类的service方法
Servlet_01 - 图243) 配置自定的servlet访问的路径
Servlet_01 - 图254) 将web项目部署到Tomcat服务器
Servlet_01 - 图26

Servlet_01 - 图27
5) 启动服务器
Servlet_01 - 图28
6) 访问测试
·访问方式
http://ip:port/项目名/servlet访问路径
·访问测试
http://localhost:8080/servlet_demo1_war_exploded/myServlet
Servlet_01 - 图29

4.3 web.xml配置详细说明

4.3.1 web.xml的作用

配置Servlet的访问路径,核心是url-pattern—>servlet-class,也就是,路径=包名+类名因为浏览器发起的请求中的url地址中,携带了要访问的Servlet的路径,tomcat服务器接收到浏览器发起的请求后,从此次请求的url地址中截取出请求的Servlet的路径,然后根据web.xml的配置信息,找到该Servlet的包名和类名,然后反射调用,进行请求的处理

4.3.1 web.xml解析以及解析的时机

时机:
Tomcat服务器启动的时候即完成项目的web.xml文件的解析
解析:
由Tomcat服务器来解析运行, 将web.xml文件解析完成, 存在内存中
注意:
当Tomcat接收到浏览器的请求后,和从内存中取出的解析好的配置进行比对,获取要调用的Servlet的全限定路径,然后调用。
如果web.xml文件中的配置发生了变更后,需要重新启动Tomcat服务器,重新完成web.xml文件的解析
4.3.1 web.xml配置Servlet的方式

<!—
Servlet的访问路径配置的几种方式 方式一: 直接方式 /路径
注意:必须以”/“开头,否则不对
方式二: 以指定字符结尾 示例 *.do 方式三:指定的父路径 示例:/one/xxx 方式四: 拦截所有的请求 示例:/
注意: ① 如果精准路径和其他模糊路径同时存储,请求先匹配精准路径,匹配不到则匹配模糊路径。
② 一个url-pattern只能对应一个Servlet,但是一个Servlet可以有多个url-pattern—>_
path
com.bjsxt.controller.PathServlet


/myServlet

<!—
.do—>
/*
_

五. GET和POST请求

5.1 GET请求

·发送GET请求的方式

  1. 在浏览器输入URL发送请求
  2. 超链接标签发送请求
  3. 提交form表单,

·GET请求的特点

  1. 会将请求数据拼接在地址栏的后边, 不安全
  2. 数据的大小有限制, 只能提交少量数据

    5.2 POST请求

    ·发送POST请求的方式
    1) 提交form表单,
    ·POST请求的特点
    1) 请求的数据存放在HTTP协议的请求体中, 安全性好
    2) 可以提交大量的数据

    六. 案例用户登录

    6.1 案例实现

    需求:

  3. 用户访问登录的页面, 填写用户名, 密码, 点击提交按钮, 访问servlet

  4. servlet中判断用户名或者密码是否正确
  5. 正确: 向页面响应 先完成显示success 然后完成 欢迎’xx ’登录成功
  6. 错误: 向页面响应 先完成显示error 然后完成 账号或密码有误

代码实现:
login.html

登录页面



用户名:

密码:


LoginServlet

public class LoginServlet extends HttpServlet {
__
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp_) _throws ServletException, IOException {
__
//1.接受请求参数 username passwrod
_String username = req.getParameter**
(“username”);
String password = req.getParameter
(“password”);
System.
_out
.println(username+“—-“+password);
_//2.模拟数据库查询判断
_PrintWriter writer = resp.getWriter
(); //获取响应流
if(“zs”.equals(username) && “111”.equals(password)){
__
_//3.响应
_writer.println
(“success”);
}_else{
**//3.响应
writer.println**(“error”);
}
}
_}**

web.xml

<_servlet>
_ <_servlet-name>_
servlet2</_servlet-name>_
<_servlet-class>_com.bjsxt.servlet.LoginServlet</_servlet-class>

<_servlet-mapping_>
_ <_servlet-name>_
servlet2</_servlet-name>_
<_url-pattern>_/loginServlet</_url-pattern>
_</_servlet-mapping>_

6.1问题分析

1) get请求和post请求接受含有中文的参数出现乱码
2) 响应到页面的内容含有中文出现乱码

6.2请求中文乱码

浏览器在提交表单时,会对中文参数值进行自动编码。当Tomcat服务器接收到浏览器请求后自动解码,当编码与解码方式不一致时,就会导致乱码
1. 解决GET请求乱码(两种方式)

方式1:
代码中设置
//设置请求的编码格式为utf-8
req.setCharacterEncoding(“utf-8”);
方式2:
修改Tomcat server.xml配置文件
Servlet_01 - 图30

2. 解决POST请求乱码(一种方式)

方式1:
代码中设置
//设置请求的编码格式为utf-8
req.setCharacterEncoding(“utf-8”);

6.3 响应中文乱码

·解决响应乱码

代码中设置 //设置响应对象 resp 响应数据的编码为UTF-8_resp.setCharacterEncoding*(“UTF-8”)**;//设置Content-Type响应 头 告知浏览器以UTF-8解析信息resp.setContentType**(“text/html;charset=UTF-8”)_**;

七. Servlet的生命周期

7.1 Servlet对象创建的时机

·Servlet对象是由Tomcat来创建
·Servlet在被第一次访问的时候由Tomcat 来初始化创建,而且只创建一次,创建成功后,Servlet对象直接存在于Tomcat的运行内存中。其他的请求如果再访问则不再创建,直接调用完成请求处理
·在web.xml中配置了load-on-startup, 则该Servlet在服务器启动的时候就会被创建以及初始化, 创建方法: 无参构造 初始化方法: init()

7.2 Servlet对象创建的时机

·在Tomcat服务器关闭的时候, 销毁方法: destory()

7.2 Servlet 生命周期代码实现

public class LifeServlet extends HttpServlet {
_
_public
LifeServlet() {
__
System.out.println(“Servlet被创建”);
}
__
@Override
public void init_() _throws ServletException {
__
System.out.println(“Servlet被初始化”);
}
__
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp_) _throws ServletException, IOException {
__
System.out.println(“Servlet被执行”);
}
__
@Override
public void destroy() {
__
System.out.println(“Servlet被销毁”);
}
__}
<_servlet>
_ <_servlet-name>_
servlet3</_servlet-name>
_ <_servlet-class>_
com.bjsxt.servlet.LifeServlet</_servlet-class>
_

<_load-on-startup>_1</_load-on-startup>

<_servlet-mapping_>
_ <_servlet-name>_
servlet3</_servlet-name>
_ <_url-pattern>_
/lifeServlet</_url-pattern>
_</_servlet-mapping>_

Servlet_01 - 图317.3生命周期的总结

1) 构造方法只被调用一次,当第一次请求Servlet时调用构造方法来创建Servlet的实例
2) init方法只被调用一次,当创建好Servlet实例后立即调用该方法实现Servlet的初始化
3) service方法被多次调用,每当有请求时都会调用service方法来用于请求的响应
4) destroy方法只被调用一次,当该Servlet实例所在的Web应用被卸载前调用该方法来释放当前占用的资源

八. Servlet继承结构

Servlet_01 - 图32

8.1 Servlet接口

·init(ServletConfig config) 方法:
创建Servlet对象后立即调用该方法完成其他初始化工作
·service(ServletReuquest req,ServletResponse resp)方法:
处理客户端请求,执行业务操作,利用响应对象响应客户端请求
·destroy() 方法:
在销毁Servlet对象之前调用该方法,释放资源
·getServletConfig() 方法:
ServletConfig是容器向servlet传递参数的载体
·getServletInfo() 方法:
获取servlet相关信息

8.2 GenericServlet抽象类

  • 定义了一个通用的,不依赖于具体协议的Servlet,给出了除service()方法外的其余四个方法的实现

·public void init(ServletConfig config) 方法:
实现了Servlet接口中的init方法
·protected void init() 方法:
GenericServlet类中自己的方法
·第一个是Servlet接口的init方法, 第二个是GenericServlet自己的init方法

public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();}public void init() throws ServletException {
}

8.3 HttpServlet抽象类

  • 继承自 GenericServlet. 针对于处理 HTTP 协议的请求所定制

·public void service(ServletRequest req, ServletResponse res) 方法:
实现的父类中的Service方法
·protected void service(HttpServletRequest req, HttpServletResponse res) 方法:
HttpServlet类中自己的service方法 get | post请求都可以处理
·protected void doGet(request,response) 方法:
HttpServlet类中自己的doGet方法 只处理get请求
·protected void doPost(request,response) 方法:
HttpServlet类中自己的doPost方法 只处理post请求

8.3 继承结构的总结

·我们自己编写的servlet应该继承HttpServlet
·可以覆盖doPost
·可以覆盖doGet方法
·可以覆盖service方法
Servlet_01 - 图33