Servlet规范
文章目录
一、Servlet规范介绍:
1.servlet规范来自于JAVAEE规范中的一种
2.作用:
1)在Servlet规范中,指定【动态资源文件】开发步骤
2)在Servlet规范中,指定Http服务器调用动态资源文件规则
3)在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则
二、Servlet接口实现类:
- 1.Servlet接口来自于Servlet规范下一个接口,这个接口存在Http服务器
提供jar包 - 2.Tomcat服务器下lib文件有一个servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)
- 3.Servlet规范中任务,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类
例子:
class Student{
//不是动态资源文件,Tomcat无权调用
}
class Teacher implements Servlet{
//合法动态资源文件,Tomcat有权利调用
Servlet obj = new Teacher();
obj.doGet()
}
三、Servlet接口实现类开发步骤
第一步:创建一个Java类继承与HttpServlet父类,使之成为一个Servlet接口实现类
public class OneServlet extends HttpServlet {
}
第二步:重写HttpServlet父类两个方法。doGet或则doPost
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneServlet类针对浏览器发送GET请求方式处理");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneServlet类针对浏览器发送POST请求方式处理");
}
}
get
浏览器------》oneServlet.doGet()
post
浏览器------》oneServlet.doPost()
/**
* 子类----》父类----》A接口 此时 子类也是A接口实现类
* <p>
* 袁绍 PK 曹操 曹操宦官之后
* <p>
* 曹操----爹【正常人】---->宦官【接口】
* <p>
* 抽象类作用:降低接口实现类对接口实现过程难度 将接口中不需要使用抽象方法教给抽象类进行完成 这样接口实现类只需要对接口需要方法进行重写 servlet接口: init getServletConfig getServletInfo
* destory-----------四个方法对于Servlet接口实现类没用
* <p>
* service()----有用
* <p>
* Tomcat根据Servlet规范调用Servlet接口实现类规则: 1.Tomcat有权创建Servlet接口实现类实例对象 Servlet oneServlet = new OneServlet();
* 2.Tomcat根据实例对象调用service方法处理当前请求 oneServlet.service(),此时service方法中 this=====oneServlet extends extends implements
* oneServlet---------->(abstract)HttpServlet----->(abstract)GenericServlet- ---------> servlet接口 init destory
* getServletInfo getServletConfig
* <p>
* 通过父类决定在何种情况下调用子类中方法-------【设计模式】---模板设计模式
* <p>
* HttpServlet: service(){
* <p>
* if(请求方式 == GET){ this.doGet }else if(请求方式 == POST){ this.doPost }
* <p>
* } doGet doPost
* <p>
* OneServlet: doGet doPost
* <p>
* Servlet oneServlet = new OneServlet(); oneServlet.service()
* <p>
* 复习: 重写规则 * 抽象类作用 * 子类实现接口规则 * this指向 * 继承规则
第三步:将Servlet接口实现类信息【注册】到Tomcat服务器
【网站】--->【web】---》【WEB-INF】--->web.xml
<!--将Servlet接口实现类类路径地址交给Tomcat-->
<servlet>
<servlet-name>mm</servlet-name>
<!--声明一个变量存储servlet接口实现类类路径-->
<servlet-class>com.demo01.controller.OneServlet</servlet-class>
<!--声明servlet接口实现类类路径-->
</servlet>
Tomcat String mm = "com.demo01.controller.OneServlet"
<!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
<servlet-name>mm</servlet-name>
<url-pattern>/one</url-pattern>
<!--设置简短请求别名,别名在书写时必须以"/"为开头-->
</servlet-mapping>
如果现在浏览器向Tomcat索要OneServlet时地址
http://localhost:8080/myWeb/one
三、Servlet对象生命周期:
1.网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责额创建。
开发人员不能手动创建Servlet接口实现类的实例对象
2.在默认的情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时
自动创建这个Servlet接口实现类的实例对象
在手动配置情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类
的实例对象
<servlet>
<servlet-name>mm</servlet-name>
<!--声明一个变量存储servlet接口实现类类路径-->
<servlet-class>com.bjpowernode.controller.OneServlet</servlet-class>
<load-on-startup>30<load-on-startup><!--填写一个大于0的整数即可-->
</servlet>
3.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
4.在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁
演示
OneServlet
package com.demo01.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OneServlet extends HttpServlet {
public OneServlet() {
System.out.println("OneServlet已经被创建!");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("OneServlet类针对浏览器发送GET请求方式处理");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
System.out.println("OneServlet类针对浏览器发送POST请求方式处理");
}
}
TwoServlet
package com.demo01.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TwoServlet extends HttpServlet {
public TwoServlet() {
System.out.println("TwoServlet已经被创建!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("TwoServlet的Post方法");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("TwoServlet的Get方法");
}
}
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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.demo01.controller.OneServlet</servlet-class>
</servlet>
<!--为servlet接口提供一个简单的别名-->
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>com.demo01.controller.TwoServlet</servlet-class>
<load-on-startup>2</load-on-startup><!--填写一个大于0的整数-->
<!--可以让这个servlet对象在一开始就进行创建-->
<!--如果为0或者不写的话,就是在被用户访问的时候在创建在一开始就进行创建-->
</servlet>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
</web-app>
步骤
1.运行程序,会发现在服务器启动的时候,TwoServlet对象已经被创建,OneServer没有创建
2.当在导航栏里访问oneServer的get方法时,OneServer才被服务器创建出来
3.关闭服务器后,两个对象被销毁。
四、HttpServletResponse接口(响应对象)
1.介绍:
-
HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
-
HttpServletResponse接口实现类由Http服务器负责提供
-
HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器
-
开发人员习惯于将HttpServletResponse接口修饰的对象称为**【响应对象】**
2.主要功能:
-
将执行结果以二进制形式写入到【响应体】
-
设置响应头中[content-type]属性值,从而控制浏览器使用
对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】 -
设置响应头中【location】属性,将一个请求地址赋值给location.
从而控制浏览器向指定服务器发送请求
3.HttpServletResponse接口中的方法
//输出方式
PrintWriter out = response.getWriter();
out.println("红烧猪蹄");
//设置响应头content-type,解析方式与编码方式
response.setContentType("text/html;charset=utf-8");
// 通过响应对象,将地址赋值给响应头中location属性
response.sendRedirect(url);
五、HttpServletRequest接口(请求对象)
1.介绍:
- HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletRequest接口实现类由Http服务器负责提供
- HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
- 开发人员习惯于将HttpServletRequest接口修饰的对象称为**【请求对象】**
2.作用:
1)可以读取Http请求协议包中【请求行】信息
2)可以读取保存在Http请求协议包中【请求头】或则【请求体】中请求参数信息
3)可以代替浏览器向Http服务器申请资源文件调用
3.HttpServletRequest接口中的方法
// 通过请求对象,读取【请求行】中 url 信息
String url = request.getRequestURL().toString();
// 通过请求对象,读取【请求行】中 method 信息
String method = request.getMethod();
// 通过请求对象,读取【请求行】中 uri信息
String uri = request.getRequestURI();
//取出请求头中所有 【参数名称】 与 【值】 request.getParameter(paramName)
Enumeration paramNames = request.getParameterNames();
//将所有请求参数名称保存到一个枚举对象中进行返回
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
//2.通过请求对象读取指定的请求参数的值
String value = request.getParameter(paramName);
System.out.println("请求参数名 " + paramName + " = " + value);
}
//通知请求对象,使用utf-8的字符集
request.setCharacterEncoding("utf-8");
//读取对应属性的值,属性名传入
request.getParameter(paramName)