在http协议当中,规定了请求和响应双方, 客户端和服务器端。与web相关的资源。
有两种分类 –> 静态资源 + 动态资源
Servlet – 伺服器
运行在web服务器上的java程序.
用于接收和响应 客户端的http请求.
更多的是配合动态资源来做.
当然静态资源也需要使用到servlet,只是Tomcat里面已经定义DefaultServlet
Servlet细节说明
1.由于客户端是通过URL地址访问web服务器的资源,若servlet被外界访问,必须将servlet程序映射到URL地址上,这个工作在web.xml文件中使用元素和完成.
2.元素用于注册使用servlet,它包含有两个主要的元素
和分别用于设置servlet的注册名称和servlet的完整类名
3.一个元素用于映射一个已注册的servlet的一个对外访问路径,它包含有2个元素,和,分别用于指定的servlet注册名和对外访问路径
4.同一个servlet可以映射到多个URL上,多个元素的子元素的设置值可以是同一个servlet的注册名.(多个URL均可以访问servlet)
5.servlet映射到URL中可以使用通配符,固定写法:.扩展名 和 /*
Servlet配置方式
a. 全路径匹配
以 / 开始 /a /aa/bb
localhost:8080/项目名称/aa/bb
a. 路径匹配 , 前半段匹配
以 / 开始 , 但是以 * 结束 /a/* /*
其实是一个通配符,匹配任意文字
localhost:8080/项目名称/aa/bb
a. 以扩展名匹配
写法: 没有/ 以 * 开始 .扩展名 .aa *.bb
6.servlet是供其他java程序(servlet引擎)调用的java类,它不能独立执行,运行完全由servlet引擎控制和调度
7.针对客户端的多次servlet请求,通常情况下,服务器只创建一个servlet实例对象
实例对象一旦创建,就会驻留内存,为后续其他请求服务,直至web容器退出,servlet才销毁 –生命周期
8.如果某个servlet的映射路径为/,此为缺省路径,处理其他servlet都不处理的请求
9.多个客户端并发访问servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用servlet方法,此时有可能引起并发访问问题
–> 若某个servlet实现singleThreadModel接口,那么servlet引擎将以单线程方式调用其方法(此方法在servlet2.4中,被标记为过时)
–> 该接口为定义任何方法,只要servlet类的;定义中增加实现SingleThreadModel接口声明即可
–> 对于实现singleThreadModel接口的servlet,servlet引擎仍然支持对该servlet的多线程并发访问,其采用方式是产生多个servlet实例对象,并发每个线程分表调用一个独立的servlet实例对象
–> 实现singleThreadmodel并不能真正解决servlet线程安全问题,因为servlet引擎会多创建servlet实例对象,而真正意义上的解决多线程安全问题是指一个指servlet实例对象被多个线程同时调用的问题.
让Servlet创建实例的时机提前。
默认情况下,只有在初次访问servlet的时候,才会执行init方法。 有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。
在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。
一般不写负数, 从2开始即可。
HelloServlet04
com.itheima.servlet.HelloServlet04
2
Servlet生命周期
什么是生命周期
一个对象从创建到消亡的过程,就是生命周期
servlet生命周期相关的方法
void destroy() 销毁servlet的方法
void init(ServletConfig config) 初始化servlet的方法
● 生命周期
从创建到销毁的一段时间
● 生命周期方法
从创建到销毁,所调用的那些方法。
● init方法
首次访问的时候,服务器会以反射的方式,完成servlet对象的创建
在创建该servlet的实例时,就执行该方法。
一个servlet只会初始化一次, init方法只会执行一次
默认情况下是 : 初次访问该servlet,才会创建实例。
● service方法
只要客户端来了一个请求,那么就执行这个方法了。
每次访问请求,servlet均创建一个新的httpservletrequest请求对象和一个response相应对象,将此2对象作为参数传递给service()方法,在根据请求方式调用doXxx方法
该方法可以被执行很多次
一次请求,对应一次service方法的调用
● destroy方法
servlet销毁的时候,就会执行该方法
1. 该项目从tomcat的里面移除。
2. 正常关闭tomcat就会执行 (shutdown.bat)
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//初始化
}
@Override
public ServletConfig getServletConfig() {
//获取servletConfig域对象
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//处理的操作,只要访问了该servlet,就会执行该方法
}
@Override
public String getServletInfo() {
//关于servlet的一些信息
return null;
}
@Override
public void destroy() {
//销毁
}
servlet的使用
1.编写java程序,实现servlet或继承genericServlet/HttpServlet
–> 重写service/doPost.doGet方法
2.配置Servlet
用意: 告诉服务器,我们的应用有这么些个servlet。
在webContent/WEB-INF/web.xml里面写上以下内容。
HelloServlet
com.itheima.servlet.HelloServlet
HelloServlet
/a
3.发布至tomcat上
4.在地址栏上输入 http://localhost:8080/项目名称/a
Servlet的运行原理
通过上述流程图我们重点需要掌握如下几个点:
只要浏览器给服务器发送请求,那么服务器在处理请求之前,先把请求操作封装成request对象,与之对象,response对象
- Servlet对象是由服务器创建
- request与response对象也是由tomcat服务器创建
- request对象封装了浏览器过来的所有请求信息,response对象代表了服务器的响应信息。
乱码问题
请求中处理乱码
get 请求,t8内部解决了
post request.setCharaterEncoding(“utf-8”);
响应中处理乱码
response.setContentType(“text/html;chatset=UTF-8”);
代码实例
分析
1.处理请求对象request中的请求参数,获取用户名和密码
2.去数据库中查询 用户名和密码 判断是否匹配
需要: mysql驱动 JDBCTemplate C3P0连接池
3.返回user对象,null 失败 响应用户
不为null 成功 响应用户
需要: 响应对象Response
步骤
1.准备数据,mysql中的用户名库的准备
2.工程环境搭建–导入前端页面(或自定义)–login.html
导入jar包,配置文件,jdbcutils