一、什么是servlet
servlet是基于Jakarta技术的 Web组件,由容器管理,可生成动态内容。与其他基于Jakarta 技术的组件一样,servlet是独立于平台的Java类,它们被编译为与平台无关的字节码,这些字节码可以动态加载到支持Jakarta 技术的Web服务器中并由其运行。容器,有时晓称为servlet引擎,是提供servlet功能的 Web服务器扩展。Servlet通过servlet容器实现的请求/响应范式与Web客户端交互。
概念:
- Servlet : server Apple 的简称,是服务器端的程序(代码、功能实现),可交互式的处理客户端发送到服务端的请求,并完成操作响应
- 动态网页技术
- javaWeb程序开发的基础,JavaEE规范(一套java接口)的一个组成部分
作用:
- 接受客服端请求,完成操作
- 动态生成网页(页面数据可变)
- 将包含操作结果的动态网页响应给客户
开发一个自己的Servlet
之前也写了一些教程,但是根据自己的摸索,发现了一个边界的创建方法,没有那么麻烦,但是对idea版本有要求,有些版本的操作不一样,这里说说我的idea进行Servlet 的操作
new -> file -> project 然后进行下面的选择
只需要这一步,就可以把servlet 90%的配置都完成,然后就是一些小配置
完成这两步,恭喜你,Servlet配置就完成啦!下面式运行结果
idea安装与绿化
好像有些版本的idea不能这样子操作,如果需要该版本的idea,请私聊我,免费分享+ 永久绿化jar包!这里就不挂连接了!
二、什么是servlet 容器
servlet容器是Web服务器或应用程序服务器的一部分,它提供发送请求和响应的网络服务、解码基于MIME的请求以及格式化基于MIME的响应。servlet容器还通过其生命周期包含和管理servlet。
三、什么是http协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状态的、应用层的协议,运行于TCP协议(三次握手,四次挥手)基础之上。
http协议的特点
支持客户端(浏览器)/服务器模式。 简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应数据,因而通信速度很快。请求方法常用的有GET、POST等。 灵活:HTTP允许传输任意类型的数据,传输的数据类型由content-Type标识。 无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器处理完客户的请求后,即断开连接。采用这种方式可以节省传输时间。
- HTTP1.0版本是一个请求响应之后,直接就断开了。称为短连接。
- HTTP1.1版本不是响应后直接就断开了,而是等几秒钟,这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,就会断开连接。称为长连接。无状态:HTTP协议是无状态协议。
- 无状态是指协议对于事务处理没有记忆能力。l
http协议通信流程
客户与服务器建立连接(三次握手)。
客户向服务器发送请求。
服务器接受请求,并根据请求返回相应的文件作为应答。客户与服务器关闭连接(四次挥手)。
http请求报文:
当浏览器向web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息(请求报文),HTTP请求信息由4部分组成: 1、请求行 请求方法/地址URL协议/版本
2、请求头(Request Header) 3、空行 4、请求正文
http响应报文
HTTP响应报文与HTTP请求报文相似,HTTP响应也由4个部分组成:
1、状态行 2、响应头(Response Header)3、空行 4、响应正文
响应报文常见的状态码
| 状态代码 | 状态描述 | 说明 |
|---|---|---|
| 200 | OK | 客户端请求成功 |
| 302 | Found | 临时重定向 |
| 403 | Forbidden | 服务器接受请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 |
| 404 | Not Found | 请求的资源不存在,例如URL错误 |
| 500 | Internal Server Error | 服务器发生不可预期的错误,导致无法完成客服端的请求 |
(熟悉:http特点、请求报文和响应报文、状态码)
四、 Servlet 细解
Servlet 除了实现Servlet接口,还可以通过继承GenericServlet或者 HttpServlet类,完成编写
-
实现Servlet接口必须重写5个方法
1.init(ServletConfig config) 2.ServletConfig getServletConfig0 3.service(ServletRequest req,ServletResponse res)
4.String getServletlnfo() 5.destroy()
-
GenericServlet抽象类
GenericServlet使编写Servlet变得更容易。它提供生命周期方法init和destroy的简单实现,要编写一般的Servlet,只需重写抽象service方法即可。
-
HttpServlet类(推荐使用)
HttpServlet是继承Genericservlet的基础上进一步的扩展(extends GenericServlet)。 提供将要被子类化以创建适用于Web站点的HTTP servlet 的抽象类。HttpServlet的子类至少必须重写一个方法,该方法通常是以下这些方法之—: doGet,如果servlet支持HTTP GET请求
doPost,用于HTTP POST 请求 doPut,用于HTTP PUT请求 doDelete,用于HTTP DELETE请求\
请求原理: 客户端响应过来的请求由HttpServlet进行判断是get还是post请求,再进入doPost或者doGet
常见的一些错误:
HTTP Status404 资源找不到
第一种:地址书写错误
第二种:地址没有问题,把idea项目中的out目录删除,然后重新运行
- Servlet地址配置重复: both mapped to the url-pattern [/helloservlet] which is not permitted
- Servlet地址配置错误,比如: 里面没有写 /
web.xml配置信息说明:
url-pattern定义匹配规则,取值说明。
精确匹配 /具体的名称 只有url路径是具体的名称的时候才会触发Servlet
后缀匹配 *.XXX 只要是以xxx结尾的就匹配触发Servlet
通配符匹配 /* 匹配所有请求,包含服务器的所有资源
通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp
load-on-startup
1、元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。
2、它的值必须是一个整数,表示servlet被加载的先后顺序。
3、如果该元素的值为负数或者没有设置.则容器会当Servlet被请求时再加载。
4、如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
使用注解的方式(Servlet3.0后支持)
name: Serlvet名字(可选) value:配置url路径,可以配置多个 urlPatterns:配置url路径,和value作用一样,不能同时使用 loadonStartup:配置servlet的创建的时机,如果是0或者正数启动程序时创建,如果是负数,则访问时创建。数子越小优先级越高。
package com.zking.study;
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(urlPatterns = {"/bs","/bss"})
@WebServlet(value = {"/bs","/bss"},loadOnStartup = 0)
public class BasicServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是get");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是post");
}
}
五、Servlet重点知识与应用get、post请求方式、转发与重定向
4.1 get与Post区别以及原理图
在Servlet中用来处理客户端请求需要用的doGet或doPost方法的request对象(如图)
get与post 的区别
- get请求:
get提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连
get方式明文传递,数据量小,不安全
效率高,浏览器默认请求方式为GET请求
对应的servlet的方法是doGet
- post请求
post方法是把提交的数据放在HTTP包的Body中
密文传递数据,数据量大,安全
效率相对没有GET高
对应的servlet的方法是doPost
- request主要方法
| 方法名 | 说明 |
|---|---|
| getParameter(String name) | 返回String类型,根据表单组件名称获取提交数据 |
| void setCharacterEncoding(String charset) | 指定每个请求的字符编码 |
// post方式响应回来的数据,一定要修改字符编码,不然会出现乱码
注意虽然我们写的 Servlet地址是/**但是在页面中访问的时候一定是访问你的html后缀的文件,不然就是一篇空白!
- response对象
用于响应客户请求并向客户端输出信息
response主要方法
| 方法名称 | 作用 |
|---|---|
| setHeader(name.value) | 设置响应信息头 |
| setContentType(String) | 设置响应文件类型、响应式的编码格式 |
| setCharacterEnconding(String) | 设置服务端响应内容字符编码格式 |
| getWriter() | 获取字符输出流 |
4.2 转发与重定向(重要)
转发:
作用在服务器端,将请求发给服务器上的其他资源,以共同完成一次请求的处理
语法
request.getREquestDispatcher("/目标url-pattern").forward(request,response);
数据传递:
使用forward跳转时,时再服务器内部跳转,地址栏不发生变化,属于同一次请求(请求次数为1次)
forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据
request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)。
可以将数据存入request后,在一次请求过程中的任何位置进行获取
- 可传递任何数据(基本数据类型、对象、数组、集合等)
- 存数据:request.setAttribute(key,value);
- 以键值对形式存储在request作用域中。key为String类型,value为object类型·取数据:request.getAttribute(key);
- 通过String类型的key访问Object类型的value
转发特点:
转发是服务器行为 转发是浏览器只做了一次访问请求转发浏览器地址不变 转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递、转发只能将请求转发给同一个Web应用中的组件
原理图:
重定向:
重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。
语法:
response.sendRedirct("地址")
数据传递:
sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求。属于两次请求 response没有作用域,两次request请求中的数据无法共享 传递数据:通过URI的拼接进行数据传递("/WebProject/b?username=tom");
获取数据:request.getParameter("username");
特点:
重定向是客户端行为。 重定向是浏览器做了至少两次的访问请求。重定向浏览器地址改变。 重定向两次跳转之间传输的信息会丢失(request范围)。 重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个站点上的其他应用程序中的资源、其他站点的资源。
原理图:
转发与重定向总结
- 当两个Servlet需要传递数据时,选择forward转发。不建议使用sendRedirect进行传递
- 转发与重定向在一个servlet中只能选择一个,不能同时出现