Servlet

Servlet

JavaEE规范之一

是运行在服务端上的一个java小程序,它可以接收客户端发过来的数据请求,并且响应数据给客户端

部署tomcat的时候记得部署工程

 

Servlet的生命周期

1.浏览器根据地址来发起调用,tomcat容器在接收到请求之后会根据地址栏上的地址进行一个数据的解析

会找到具体的工程,然后再定位到工程下面具体的资源

2.定位到资源以后,首先会创建当前servlet类的实例,所以调用的是无参构造方法

3.会执行初始化init方法,初始化servlet上下文配置对象ServletConfig

4.会去执行service方法,service方法以后我们会用来执行请求的分发处理

5.当容器关闭的时候,会执行销毁方法destroy

 

使用浏览器去访问项目资源时候,记得在xml文件下注册资源路径,例如将HelloServlet注册路径设置为/hello

servlet的实例是由容器所创建的

 

HttpServlet

HttpServlet中的service方法为我们提供了请求分发的处理

创建一个HelloServlet类,继承HttpServlet

先由service方法接收到request对象,与response对象

再根据客户端提交的方式调用不同的方法

//前端资源

ServletConfig

通过ServletConfig的对象来获取上下文配置信息(即xml文件内配置的信息)

配置文件

servlet配置对象和servlet域对象都是单例的(从工程启动时,这两个实例就创建成功了,使用的都是同一个对象)

单例模式(提高了系统资源,提高了程序的执行效率)

servlet域对象

ServletConfig 是servlet核心配置对象,而且该对象的生命周期是随着容器的创建而创建, 容器的销毁而销毁,在工程的任意位置去获取该实例的时候,指向的都是同一份内存地址 作用:在servlet实例加载的时候去获取局部的初始化信息

 

servletContext 是servlet中的一个上下文本对象,而且该对象的生命周期是随着容器的创建而创建, 容器的销毁而销毁,在工程的任意位置去获取该实例的时候,指向的都是同一份内存地址 作用:可以像map一样存放数据,取出数据,而且是在工程的任意位置取出数据,范围是整个web工程,可以去读取全局的初始化信息,可以在工程的任何位置读取

 

后面会接触到的域对象:

request(也是一个域对象,也可以去存放数据,只不过该对象的取值范围比较小),session(会话对象,会对客户端和服务端进行一个绑定)

 

 

 

取出全局的初始化数据

 

配置文件(需要写在根标签web-app内部)

 

标签内的数据用servletConfig对象取出

标签内的数据用servletContext对象取出

 

HTTP协议

所谓HTTP协议,客户端和服务器之间通信时,发送的数据,需要遵循的规则,叫HTTP协议

请求分为GET和POST两种

 

响应HTTP协议格式

1.响应行

2.响应头key :value不同的请求头,有不同的含义

3.响应体 ===>>>就是回传给客户端的数据

 

常用响应码说明

 

GET请求

请求行

1.请求的方式GET

2.请求的资源路径[+?+请求参数]

3.请求的协议的版本号HTTP/1.1

 

请求头

key : value 组成 不同的键值对,表示不同的含义

 

无论客户端给服务器传数据,还是服务端给客户端传数据,都是基于http协议来完成数据的互传

客户端

客户端如何访问服务端,如何给服务区发送数据?

1.要知道访问服务端具体的地址

http://localhost:8080/servlet/hello

格式:http://本地IP地址:端口号/工程路径/资源路径

2.如何去传递数据

看一下浏览器端的提交方式是什么,如果是get,则把数据封装在地址后面:资源路径?key1=value1&key2=value2

 

如果是post提交方式,则数据是被封装在请求体中的

 

服务端

服务端给客户端响应数据,直接是在当前页面上完成,没有地址的跳转,响应的数据则直接被封装在响应体中

以后在前端框架中,我们会根据后端的响应数据,来完成前端逻辑的判断(比如AJA异步技术)

 

HttpServletRequest类

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息

 

HttpServletRequest类的常用方法

 

配置资源路径的方式(基于注解)

在类名上注释@WebServlet("/hello05")

GET方法处理:

 

Post方法处理:

接收数据的方法:

request.getParameter("key的值")

处理中文乱码的方法:

前端布局:

 

接收具有多个value值的key的方法

 

HttpServletResponse类

HttpServletResponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置

 

往客户端回传数据

字节流getOutputStream()

效率高

常用于下载(传递二进制数据)

 

字符流getWriter()

效率低

常用于回传字符串(常用)

 

响应中文乱码解决方法,以及设置浏览器可读取文本类型

setContentType("text/html;charset=UTF-8")

 

 

案例:(通过前端访问,后端响应数据库数据给前端)

User用户类

JdbcUtils工具类

 

请求的转发

请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫做请求转发。(地址不会改变,即浏览器路径不会跳转)

 

getRequestDispatcher() 获取请求转发对象

request除了可以作为请求对象之外,还可以作为域对象,但是该域对象的取值范围,是一次请求范围之内

request通过setAttribute(key,value)方法存放数据

通过getAttribute(key)方法获取数据

请求转发:内部资源的跳转,通过浏览器发起访问,工程中的资源会从一个地址跳转到另外一个地址,浏览器的地址不会发生改变

 

请求转发集合对象 (使用request域存放数据,要使用请求转发)

渲染后端数据 (使用jsp)

jsp的底层是java

不使用html,html作为一个静态文件,是不能读取动态数据的,需要用jsp去操作

el表达式:

用于替换jsp中的取值脚本

作用:取出后端域中的数据,完成数据的校验和判断 ${后端域中的key}

使用servletContext域存放数据(可以使用请求重定向)

请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端去新地址访问,叫做请求重定向

请求重定向:也可以完成内部资源的跳转,而且浏览器的地址是会发生改变的,这种情况下是不能取到request域中的数据的

 

注意的点:

重定向和转发使用的域对象有哪些

 

 

JSP

什么是jsp?

 

jsp九大内置对象

 

jsp四大域对象

 

它们从小到大的顺序分别是:pageContext 、Request、Session 、application

 

jsp的运行原理

jsp的本质,其实是一个Servlet程序

 

可以在<%...%>内写java代码

<%!...%>jsp声明脚本,只能声明变量,不能写业务逻辑

通过脚本表达式<%=...%>取到值

也可以通过el表达式${...}取到域对象中的值

 

el表达式可以取到后端中的数据,而且取值的方式比较简单${域的key}

jsp脚本表达式<%=request.getAttribute("key")%>

 

el表达式其实在底层封装的就是对应的jsp脚本表达式,它出现目的就是为了替换脚本表达式,使得我们在开发的时候更高效

 

el表达式的用法:相关的逻辑判断,判断一个容器是否为空,el表达式取到的数据只能是域中的数据

 

在前端进行请求转发

 

 

判断一个对象是否为空(指的是对象是否存在,不是说容器长度为0)

 

引入jstl标签库

 

ForEach标签

items表示遍历集合, var表示遍历集合中每一个对象

 

If标签