servlet
一、http(超文本传输协议)
学习要求(了解):掌握一些头信息(请求和响应)
二、servlet ★
1.简介
动态的web开发技术,本质就是一个类,运行在服务器端的一个java小程序,
接受请求,处理业务逻辑,生成动态web内容
2.编写servlet步骤
(1)编写一个类
a.继承HttpServlet
b.重写doGet()或者doPost()方法
(2)编写配置文件(web-inf/web.xml)
a.注册servlet
<servlet>
<servlet-name>给servlet起个名字 名字唯一</servlet-name>
<servlet-class>servlet的全限定名</servlet-class>
</servlet>
b.绑定路径
<serlvet-mapping>
<servlet-name>给servlet起个名字 名字唯一</servlet-name>
<url-pattern>访问路径 目前都是以"/"开始</url-pattern>
</serlvet-mapping>
(3)访问路径(测试)
格式:http://主机:端口号/项目名/路径
例如:http://localhost/day09/hello
3.接受请求参数和回写数据(了解)
(1)接受参数:
格式:key=value
String value=request.getParameter("key")
例如:http://localhost/day09/hello?username=tom
String value=request.getParameter("username")就可以获取tom值
(2)回写内容:
例如:response.getWriter().print("success");
4.servlet的体系结构(了解)
Servlet:接口
|
GenericServlet:抽象类
|
HttpServlet:抽象类
|
自定义servlet
5.servlet及其子类常用方法
(1)servlet常用方法(了解)
void init(ServletConfig config):初始化
void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑
void destroy():销毁
ServletConfig getServletConfig() :获取当前servlet的配置对象
(2)GenericServlet常用方法(了解)
除了service方法没有实现,其他都实现了
空参的init() 若我们自己想对servlet进行初始化操作,重写这个init()方法即可
(3)HttpServlet常用方法
service(ServletRequest request,ServletResponse response):
在这个方法中 将两个参数强转,调用了重载的service方法
service(HttpServletRequest request,HttpServletResponse response):
获取请求的方式,根据请求方式的不同调用相应doXxx方法
doGet和doPost方法:用来处理我们自己的业务逻辑
doGet() :处理get请求的逻辑
doPost():处理post请求的逻辑 (只有表单提交的时候把method设置成post的时候)
6.servlet的生命周期(常见面试题) ★★★
(1)void init(ServletConfig config):初始化
执行者:服务器
执行次数:一次
执行时机:默认第一次访问的时候
(2)void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑
执行者:服务器
执行次数:请求一次执行一次
执行时机:请求来的时候
(3)void destroy():销毁
执行者:服务器
执行次数:一次
执行时机:当servlet被移除的时候或者服务器正常关闭的时候
熟记以下内容:
serlvet是单实例多线程
默认第一次访问的时候,服务器创建servlet,并调用init实现初始化操作.并调用一次service方法
每当请求来的时候,服务器创建一个线程,调用service方法执行自己的业务逻辑
当serlvet被移除的时候或者服务器正常关闭的时候,服务器调用servlet的destroy方法实现销毁操作.
7.url-pattern的配置 ★
方式1:完全匹配 必须以"/"开始 例如: /hello /a/b/c
方式2:目录匹配 必须以"/"开始,以"*"结束 例如: /a/* /*
方式3:后缀名匹配 以"*"开始,以字符结尾 例如: *.jsp *.do *.action
优先级:完全匹配>目录匹配>后缀名匹配
8.load-on-startup
在servlet标签有一个子标签 load-on-startup
作用:用来修改servlet的初始化时机
取值:正整数 值越大优先级越低
9.defaultservlet
当我们的配置文件里面没有指定配置的话,会查找tomcat的web.xml,
若我们自己的项目处理不了请求,tomcat的默认的servlet会帮我们处理信息
10.路径的写法(了解)
(1)相对路径:
当前路径 ./ 或者 什么都不写
上一级路径 ../
(2)绝对路径(常用)
带主机和协议的绝对路径(访问站外资源)
http://www.itheima.com/xxxx
http://localhost:80/day09/hello
不带主机和协议的绝对路径
格式:/项目名/资源路径
例如:/day09/hello(经常使用)
注:一个路径对应一个servlet;
一个servlet可以对应多个路径
11.ServletConfig(了解)
(1)简介:servlet的配置对象
servletconfig是由服务器创建的,在创建servlet的同时也创建了它,
通过servlet的init(ServletConfig config)将config对象传递给servlet,
由servlet的getServletConfig方法获取
(2)作用
a.获取当前servlet的名称
b.获取当前servlet的初始化参数
c.获取全局管理者
(3)方法
String getServletName():获取当前servlet的名称(web.xml配置的servlet-name)
String getInitParameter(String key):通过名称获取指定的参数值
Enumeration getInitParameterNames():获取所有的参数名称
初始化参数是放在 web.xml文件 servlet标签下子标签 init-param
★getServletContext():获取全局管理者
12.ServletContext(理解) ★★★
(1)简介:上下文(全局管理者)
一个项目的引用,代表了当前项目.
当项目启动的时候,服务器为每一个web项目创建一个servletcontext对象.
当项目被移除的时候或者服务器关闭的时候servletcontext销毁
(2)作用
a.获取全局的初始化参数
b.共享资源(xxxAttribute)
c.获取文件资源
d.其他操作:获取文件的mime类型
(3)获取servletcontext
方式1:(了解)
getServletConfig().getServletContext()
方式2:
ServletContext getServletContext()
(4)常用方法
a.获取全局的初始化参数(了解)
String getInitParameter(String key):通过名称key获取指定的初始化参数
Enumeration getInitParameterNames() :获取所有的参数名称
在根标签下有一个 context-param子标签 用来存放初始化参数
<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
b.共享资源(域对象) xxxAttribute()
setAttribute(String key,Object value);//设置值
Object getAttribute(String key);//获取值
removeAttribute(String key)://移除值
c.获取文件资源
String getRealPath(String 文件路径):获取文件部署到tomcat上的绝对路径(带tomcat路径)
文件路径从项目的根目录往后写
例如:getRealPath("/"):D:\javaTools\apache-tomcat-7.0.52\webapps\day09\
getRealPath("/1.txt");
InputStream getResourceAsStream(String 文件路径):以流的形式返回一个文件
d.获取文件的mime类型 格式:大类型/小类型
String getMimeType(String 文件名称)
13.域对象:★★★
(1)servletcontext 当成map集合
常用方法:xxxAttribute()
(2)servletcontext创建和销毁
创建:当项目(服务器)启动的时候,服务器为每一个web项目创建一个全局管理者,servletcontext就是当前项目的引用
销毁:当项目被移除的时候或者服务器关闭的时候servletcontext销毁
(3)存放:共享的数据
14.获取文件的路径
通过类加载器获取文件的路径:(处于classes目录下的文件)
格式:类.class.getClassLoader().getResource("文件路径").getPath()
类.class.getClassLoader().getReourceAsStream("文件路径")
15.学习要求:会创建一个servlet;会更改web.xml ★★★
三、常见案例
1.案例一-登录
(1)需求:在页面上输入用户名和密码,提交到服务器上,服务器拿着用户名和密码
去数据库中查找有无此用户
若有此用户,则提示登录成功;
若无此用户,则提示用户名密码不匹配
(2)技术分析:html的表单标签 servlet 请求 响应
(3)步骤分析:
a.先有数据库和表(SQLyog软件)
代码如下:
create database day09;
use day09;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
email varchar(20),
name varchar(20),
sex varchar(10),
birthday date,
hobby varchar(50)
);
insert into user values (null,'tom','123','tom@126.com','tom','1','1988-01-01',null);
b.创建工程(eclipse软件)
例如:day0901(web工程)
c.复制页面
复制day01(html)中的案例中的所有内容到WebContent下
修改login.html
给用户名和密码添加name属性
修改表单的action属性
action="http://localhost/day0901/login"
添加method属性:method="post"
d.导入jar包
驱动 dbutils c3p0
e.导入工具类和配置文件
datasourceUtils
c3p0-config.xml(注意修改数据库名称)
f.创建用户类(User)
g.创建servlet(LoginServlet: 路径 /login),自动生成web.xml
接受用户名和密码
调用service层(UserService)完成登录操作
提示信息
h.UserService
login(username,password)
调用UserDao
i.UserDao
通过用户名和密码查询数据库
创建queryrunner
编写sql
执行sql
2.案例二-定时刷新
(1)需求:当我们登录失败,提示"用户名密码不匹配",3秒以后跳转到登录页面
(2)技术分析:定时刷新 响应头(refresh)
(3)步骤分析:
登录失败之后,修改业务逻辑
打印之后添加一个头信息即可
3.案例三-统计登录次数
(1)需求:在一个用户登录成功之后,获取之前登录成功总人次,将次数+1.
在访问另一个servlet的时候,显示登录成功的总人次
(2)技术分析:ServletContext
(3)步骤分析:
a.在项目启动的时候,初始化登录次数
在loginservlet的init()方法中获取全局管理者,将值初始化为0,放入servletcontext上
b.登录成功之后,在loginservlet中获取全局管理者,获取登录成功的总次数
c.然后将次数+1,将值设置回去
d.当访问showServlet的时候,获取全局管理者,获取登录成功的总次数,然后在页面上打印出来即可