day11-Servlet01
Servlet01
官方api文档:https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html
Servlet和Tomcat的关系:一句话,Tomcat支持Servlet
Servlet是跟Tomcat关联在一起的,换而言之,Tomcat是哪个版本,就对应哪个版本的Servlet
1.为什么需要Servlet?
需求:请用你现有的html,css,javascript,开发网站,比如可以让用户留言/购物/支付,你能搞定吗?
这就需要引入我们的动态网页(能和用户交互)技术===>Servlet
我们对之前的JavaWeb技术体系图进一步地细化:
Tomcat的web服务拿到一个请求后:
如果web服务发现是该请求是和java相关的,或者说是一个Servlet(动态请求,比如说可能会去操作数据库),那么Tomcat会去寻找Servlet,Servlet又去调用java程序,进行数据库操作
如果Tomcat的web服务发现请求的是一个静态资源,比如html,图片等,就直接拿到该资源,然后返回,不会和java程序或者数据库发生关系
因此我们说Tomcat其实是有两个功能的:一是充当Servlet的容器;二是充当普通的web服务
只支撑静态资源返回的还有apache,如果是一个静态资源的网站,不需要和数据库进行交互,其实完全可以使用Apache来作为web服务,或者只使用一个Nginx就可以了
2.什么是Servlet?
什么是Servlet
Servlet在开发动态WEB工程中得到了广泛地应用,掌握好Servlet非常重要,Servlet是SpringMVC的基础
Servlet(java服务器小程序),它的特点有:
它是由服务器调用和执行的
即由tomcat解析和执行的
它是用java语言编写的,本质就是Java类
它是按照Servlet规范开发的(接口),Servlet本质就是一套接口规范
除了Tomcat可以去解析Servlet,weblogic也可以支持 Servlet,即只要按照规范去开发接口,就可以支持Servlet,类似于jdbc的接口规范
功能强大,几乎完成所有的网站功能
3.Servlet基本使用
3.1Servlet开发方式说明
- Servlet3.0前使用web.xml,Servlet3.0版本以后(包括3.0)支持注解,同时支持web.xml配置
- 如何查看Servlet版本
- Servlet的讲解只是为了知道Servlet的使用原理(原生的Servlet在项目中使用很少)
- 不管使用哪种方式,本质都一样
3.2快速入门-手动开发Servlet
例子
需求说明:
- 开发一个HelloServlet
- 当浏览器访问
http://localhost:8080/web应用名/helloServlet
时,后台输出“hi HelloServlet”
思路:
编写类HelloServlet去实现Servlet接口
实现service方法,处理请求,并响应数据
在web.xml中去配置Servlet程序的访问地址
首先创建web工程,配置好Tomcat
添加servlet-api.jar(在你安装的tomcat/lib下)到工程,因为servlet.jar不是jdk自带的,要引入才可以使用
在idea项目的web/WEB-INF下创建一个lib目录,将servlet-api.jar拷贝进去,然后右击jar包,点击add as library,在弹出的窗口中点击ok即可
在src包下面创建HelloServlet.java,并实现Servlet接口
package com.li.servlet; import javax.servlet.*;
import java.io.IOException; /**
* 1.开发一个servlet,需要实现Servlet接口
* 2.实现Servlet接口的方法:一共有5个
*/
public class HelloServlet implements Servlet { /**
* 1.初始化 Servlet
* 2.当创建HelloServlet实例时,会调用init方法
* 3.该方法只会被调用一次
*
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init() 被调用");
} /**
* 返回ServletConfig对象 也就是返回Servlet的配置
*
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
} /**
* 1.service方法处理浏览器的请求(包括get/post)
* 2.当浏览器每次请求Servlet时,就会调用一次server方法
* 3.当Tomcat调用该方法时,会把http请求的数据封装成 实现了ServletRequest接口 的request对象
* 4.通过servletRequest对象,就可以得到用户提交的数据
* 5.servletResponse对象可以用于返回数据给Tomcat-->浏览器
*
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hi HelloServlet~");
} /**
* 返回servlet的信息,使用较少
*
* @return
*/
@Override
public String getServletInfo() {
return null;
} /**
* 1.该方法是在servlet被销毁时,被tomcat调用
* 2.只会调用一次
*/
@Override
public void destroy() { }
}
实现了接口之后,在web.xml配置HelloServlet,即给HelloServlet提供对外的访问地址
目的是为了告诉Tomcat服务器,HelloServlet在哪里
<?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">
<!--web.xml文件主要用来配置该web应用使用到的Servlet-->
<!--配置HelloServlet-->
<!--解读:
1.servlet-name:给Servlet取名(任意),该名字唯一
2.servlet-class:Servlet的类的全路径,Tomcat在反射生成该Servlet类实例时需要使用
3.servlet-mapping里的servlet-name要和上面的servlet-name保持一致
4.url-pattern:这个就是该Servlet访问的url的配置(路径)
5.这时我们应该这样访问Servlet:http://localhost:8080/web应用名/helloServlet
5.url-pattern的取名也是随意的(注意加上斜杠)
-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.li.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
</web-app>
设置 快捷键ctrl+/ 可以在当前位置注释,而不是在行
访问HelloServlet(记得要reploy或者restart)
可以自己配置快捷键启动
浏览器访问:
后台输出:可以看到init方法只调用了一次,而每次访问都会调用server方法
4.浏览器调用Servlet流程分析
最新文章
- 仿陌陌的ios客户端+服务端源码项目
- 【leetcode】Remove Duplicates from Sorted List
- HttpClient post json,可以是数组
- jQuery 选择器 (基础恶补)
- SpringMVC接收参数的注解笔记
- HTML5开发注意事项及BUG解决
- 【BZOJ-4407】于神之怒加强版 莫比乌斯反演 + 线性筛
- Z.XML第二次迭代分数分配
- Bitnami Redmine安装和插件配置
- FineReport中以jws方式调用WebService数据源方案
- webstrom 编码
- js中替换字符串(replace方法最简单的应用)
- 请问:关于织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表的问题
- Django 在Django项目里单独运行某个py文件
- SQLServer之创建INSTEAD OF INSERT,UPDATE,DELETE触发器
- 安装oracle数据库的操作步骤
- SDOI2014 R1做题笔记
- Gym - 101617F :Move Away (圆的交点)
- FPGA的发展史及FPGA 的基础架构
- 关于Segmentation fault (core dumped)