一、Servlet技术
1、何为Servlet
- servlet本身就是一个接口,是javaEE的规范之一
- servlet是javaWeb三大组件之一。三大组件分别是:Servlet程序,Filter过滤器,Listener监听器
- servlet是运行在服务器上的一个Java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端
#案例:演示实现Servlet的简单程序
需求:
1、编写一个类去实现Servlet接口
2、实现service方法,处理请求,并响应数据
3、到web.xml中配置servlet程序的访问地址
#Servlet程序的实例代码
public class HelloServlet implements Servlet{ @Override //service方法是专门用来处理请求和响应的 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet 被访问了"); } } //实现Servlet接口,会重写其接口内的方法
#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_3_1.xsd" version="3.1"> <!--servlet标签给Tomcat配置servlet程序--> <servlet> <!--servlet-name标签 是servlet程序起的一个别名(一般是类名)--> <servlet-name>HelloServlet</servlet-name> <!--servlet-class 是servlet程序的全类名--> <servlet-class>com.wufq.servlet.HelloServlet</servlet-class> </servlet> <!--servlet-mapping标签的作用是告诉服务器,我当前配置的地址是给哪个Servlet程序使用--> <servlet-mapping> <!--servlet-name 标签是告诉服务器,我当前配置的地址给那个Servlet程序使用--> <servlet-name>HelloServlet</servlet-name> <!--url-pattern 标签配置访问地址: / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径/ /hello 表示地址为:http://ip:port/工程路径/hello --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
配置好以后,默认访问http://localhost:8080/,会直接访问web工程下的index.jsp文件,如果加上/hello,则会访问实现Servlet接口的service方法
2、servlet的生命周期
- 第一步执行Servlet构造器方法
- 第二步执行init初始化方法 (前面两步在第一次访问的时候创建Servlet程序会调用)
- 第三步执行service方法(备注:这一步每次访问都会被调用)
- 第四步执行destroy销毁方法(在web工程停止的时候调用)
3、serVlet的get和post请求的分发处理 (即:service方法,在前端执行get请求时可以执行get的服务,执行post请求执行post的服务)
#案例验证:
1)新建一个a.html文件设置一个表单,请求方式为:post
<body > <form action="http://localhost:8080/hello" method="post"> <input type="submit"/> </form> </body>
2)get、post请求分发
@Override //service方法是专门用来处理请求和响应的 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { /* * service方法主要是处理请求和响应的方法,如何区分处理get和post请求呢?主要是用getNethod()方法,但是ServletRequest * 类没有此方法,但是ServletRequest的子类httpServletRequest有 * */ //类型转换 HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; //获取请求方式 String method = httpServletRequest.getMethod(); if("GET".equals(method)){ doGet(); //get请求操作的方法 }else if("POST".equals(method)){ doPost(); //post请求操作的方法 } }
4、通过继承HttpServlet实现Servlet程序
一般在实际项目开发中,都是使用 继承HttpServlet类的方式实现Servlet程序
#案例演示:
步骤:
- 编写一个类去继承HttpServlet类
- 根据业务需要重写doGet或doPost方法
- 到web.xml中配置Servlet程序的访问地址
继承HttpServlet的类
public class HelloServlet2 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HttpSerVlet的get方法"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HttpSerVlet的post方法"); } } //其实这就是服务端的代码
配置的web.xml文件
<servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>com.wufq.servlet.HelloServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet2</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping>
客户端的代码
<body > <form action="http://localhost:8080/hello2" method="post"> <input type="submit"/> </form> </body>
5、为了便捷,可以直接在idea里面new Servlet
包-->右键-->new -->Servlet
6、Servlet类的继承体系
二、ServletConfig类
它主要是Servlet程序的配置信息类
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象。并且两者都是由Tomcat负责创建
1、ServletConfig三大作用
cweb.xml中的配置:
<servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>com.wufq.servlet.HelloServlet2</servlet-class> <!--init-param初始化的参数,可以设置多个--> <init-param> <!--参数名--> <param-name>username</param-name> <!--参数值--> <param-value>root</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/test</param-value> </init-param> </servlet>
Servlet中的代码
@Override public void init(ServletConfig config) throws ServletException { super.init(config); //注意:重写init方法里面一定要调用父类的init(ServletConfig)操作 // 1、可以获取Servlet程序的别名servlet-name的值 System.out.println("HelloServlet2程序的别名:"+config.getServletName()); // 2、获取初始化参数init-param System.out.println("初始化参数username的值:"+config.getInitParameter("username")); System.out.println("初始化参数url的值:"+config.getInitParameter("url")); // 3、获取ServletContext对象 System.out.println("ServletContext对象:"+config.getServletContext()); }
三、ServletContext类
1、什么是ServletContext?
- 是一个接口,表示Servlet上下文对象
- 一个web工程,只有一个ServletContext对象实例
- ServletContext对象是一个域对象
- ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁
什么是域对象?
域对象,是可以像Map一样存取数据的对象,叫域对象
这里的域指的是存取数据的操作范围,整个web工程
存数据 | 取数据 | 删除数据 | |
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
2、ServletContext类的四个作用
- 获取web.xml中的配置的上下文参数context-param
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map一样存取数据
public class ContextServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取ServletAContext对象 ServletContext context = getServletContext(); System.out.println(context); //存数据 context.setAttribute("key1","value1"); //取数据 System.out.println("保存之后;context1获取key1的值是:"+context.getAttribute("key1")); } }
四、HTTP协议
1、http请求分为2种:get请求和post请求
2、GET请求
1、请求行
1)请求的方式:GET
2)请求的资源路径[+?+请求参数]
3)请求的协议的版本号 HTTP/1.1
2、请求头
key:value 组成 不同的键值对,表示不同的含义
3、POST请求
1)请求行
1)请求的方式:POST
2)请求的资源路径[+?+请求参数]
3)请求的协议的版本号 HTTP/1.1
2)请求头
key:value 组成 不同的键值对,表示不同的含义
----请求头和请求体之间有一个空行
3)请求体 ==>就是发送给服务器的数据
4、常用请求头的说明
- Accept:表示客户端可以接收的数据类型
- Accept-Languege:表示客户端可以接收的语言类型
- User-Agent:表示客户端浏览器的信息
- Host:表示请求时的服务器的ip和端口号
5、那些是get请求,那些是post请求
GET请求有哪些:
- form标签 method=get
- a标签
- link标签引入css
- script标签引入js文件
- img标签引入图片
- iframe引入html页面
- 在浏览器地址栏中输入地址后敲回车
POST请求有哪些
form标签 method=post
4、响应的HTTP协议格式
1)响应行
- 响应的协议和版本号
- 响应的状态码
- 响应状态描述符
2)响应头
- key:value 不同的响应头,有其不同含义
- 空行
3)响应体 --> 就是回传给客户端的数据
5、常用的响应码说明
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
6、MIME类型说明
MIME是HTTP协议中的数据类型,多功能Interrnet邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应
常见的集中MIME类型