Servlet规范
作用:
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接口的实现类。
二、Servlet接口实现类开发步骤:
1、创建一个java类,继承HttpServlet父类,使之成为一个Servlet接口实现类。
/** Servlet接口中有5个抽象方法:init、getServletConfig、getServletInfo、destroy (这四个方法对于实现类没用)
service() 这个方法有用
/** HelloServlet ————> HttpServlet(abstract) ————> GenericServlet(abstract) ————> Servlet(interface) */
/** 这里继承HttpServlet抽象类,是为了降低直接实现Servlet接口的难度 */
2、重写HttpServlet父类的两个方法。doGet,doPost(浏览器两种不同的请求方式对应不同的方法)
/** 怎样判断调用doGet还是doPost?
* 只需调用service()方法,父类HttpServlet中的service()方法会判断浏览器的请求方法
* HttpServlet : service() {
* if (请求方法 == GET){
* this.doGet;
* }else if (请求方法 == Post) {
* this.doPost;
* }
* };
* */
@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请求方法处理");
}
3、将Servlet接口实现类信息 注册 到Tomcat服务器
<?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接口实现类路径交给Tomcat -->
<servlet>
<servlet-name> helloServlet </servlet-name>
<servlet-class>com.example.wzweb.HelloServlet</servlet-class>
</servlet>
<!-- 为servlet接口实现类提供简短别名 -->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hs</url-pattern>
</servlet-mapping>
</web-app>
三、Servlet对象生命周期
1、所有Servlet接口实现类的对象,只能由Http服务器(tomcat)负责创建。
2、Servlet对象创建时机:
1)大多数正常情况下,只有当第一个用户向Tomcat讨要某个Servlet时候,此时Tomcat才会负责创建这个Servlet的对象
2)在人工干预情况下,要求Tomcat在启动时,自动创建某个Servlet类的对象
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<load-on-startup>8888</load-on-startup> //只要写入一个大于0的整数
</servlet>
3、一个Servlet接口实现类,在Tomcat运行期间,只能被创建一个实例对象
4、在Tomcat关闭时,由Tomcat负责销毁所有的Servlet对象
四、HttpServletResponse接口(将数据写入服务器响应包)
1、介绍:
1)HttpServletResponse接口来自Servlet规范中,在Tomcat中存在servlet-api.jar
2)HttpServletResponse接口实现类由Http服务器负责提供
3)HttpServletResponse接口负责将doGet/doPost方法执行结果【写入到 响应包 交给浏览器】
4)开发人员习惯于将HttpServletResponse接口修饰的对象称为 【响应对象】
2、主要功能:
1)将执行结果以二进制的形式写入 响应体
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/** 当执行结果为数字时,浏览器接受到的数据会被转换为ASCII码 */
/** 解决:实际开发中,都是通过out.print()将真实数据写入响应体 */
String str = "Servlet is running ....";
System.out.println(str);
/** 通过响应对象,向Tomcat索要输出流 */
PrintWriter out = resp.getWriter();
/** 通过输出流,将执行结果以二进制的形式写入响应体中 */
out.print(str);
}
}
2)设置响应头中【content-type】属性值
从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字、图片、视频、命令】
public class HelloServlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/** 将执行结果中的html标签当做命令展示出来
* 浏览器在就收到响应包之后,会根据【响应头中的content-type】属性的值
* 来采用对应的编译器对响应体中的二进制数据进行编译
* 默认情况下content-type的值为text【文本】
* 要想执行html标签,需要在的到输出流之间更改响应头中的content-type的值
* */
String str = "Java<br>Html<br>mysql<br>Spring<br>";
String str1 = "杜兰特<br>哈登<br>欧文<hr>";
/** 设置响应头中的content-type值
* "text/html" 表示:告知浏览器使用文本编译器和html命令编译器编译响应体内容
* 响应体包含中文,需要加上charset=utf-8
**/
response.setContentType("text/html;charset=utf-8");
/** 通过响应对象,向Tomcat索要输出流 */
PrintWriter out = response.getWriter();
out.print(str);
out.print(str1);
}
}