什么是Servlet
javaee规范之一,规范就是接口
Servlet是javaweb三大组件之一,分别是:Servlet程序,Filter过滤器,Listener监听器
Servlet是运行在服务器上的一个java小程序,可以接受客户端发送过来的请求,并响应数据给客户端
手动实现Servlet接口
编写一个类去实现Servlet接口
实现service方法,处理请求响应数据
到web.xml中配置servlet程序的访问地址
servlet标签给tomcat配置servlet程序
servlet-name标签:给Servlet标签起个别名
servlet-class:Servlet程序的全类名
servlet-mapping:给servlet程序配置访问地址
servlet-name:告诉服务器当前配置的地址给哪个servlet程序使用,基本就和前面的name相同
url-pattern:配置访问地址
/(斜杠)在服务器解析的时候,表示为http://ip:port/工程路径
/hello表示:http://ip:port/工程路径/hello
service方法是专门同来处理请求和响应的。
常见错误:
url-pattern中路径没有以斜杠打头
url地址如何定位到Servlet程序去访问
Servlet生命周期
执行Servlet构造器方法
执行init初始化方法
第一、二步,是在第一次访问的时候创建servlet程序会调用
执行service方法
第三步,每次访问都会调用
执行destory销毁方法
第四步,在web工程停止的时候调用
GET和POST请求的分发处理
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service被访问了");
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
if (method.equals("GET")) {
doGET();
} else if (method.equals("POST")) {
doPOST();
}
}
通过继承HttpServlet实现Servlet程序
一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序
编写一个类去继承HttpServlet类
根据业务需要重写方法
到web.xml中的配置servlet程序的访问地址
使用IDEA创建Servlet程序
Servelt类的继承体系
ServletConfig类
从类名上来看,就知道是Servlet程序的配置信息类
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig
每个Servlet的ServletConfig都是独立的
三大作用
可以获取Servlet程序的别名servlet-name的值
获取初始化参数init-param
获取ServletContext对象
web.xml配置
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
方法:
System.out.println("HelloServlet的别名是" + servletConfig.getServletName());
System.out.println("初始化参数username的值" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数url的值" + servletConfig.getInitParameter("url"));
System.out.println(servletConfig.getServletContext());
ServletContext类
ServletContext是一个接口,它表示Servlet上下文对象
一个web工程只有一个ServletContext对象实例
ServletContext对象是一个域对象
ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁
什么是域对象?
域对象,是可以像Map一样存取数据的对象,叫做域对象。
这里的域是存取数据的操作范围(整个web工程)。
存数据 | 取数据 | 删除数据 | |
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
ServletContext类的四个作用
获取web.xml配置中的上下文参数context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("contextParam的值是" + username);
System.out.println("password的值是"+context.getInitParameter("password"));
contextparam属于整个web工程
init-param只能是servlet-context对象获取的
获取当前的工程路径,格式:/工程路径
System.out.println("工程路径:" + context.getContextPath());
获取工程部署后在服务器盘上的绝对路径
System.out.println("工程部署的路径:"+context.getRealPath("/"));
为什么是"/"?
因为服务器解析地址是http://ip:port/工程名/
4.像Map一样存储数据
ServletContext context = getServletContext();
context.setAttribute("key1", "value1");
System.out.println("key:" + context.getAttribute("key1"));
什么是HTTP协议?
什么是HTTP协议?
就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议。
HTTP协议中的数据又叫报文。
请求的HTTP协议格式
GET
请求行
请求的方式
请求的资源路径[+?+请求参数]
请求的协议和版本号(HTTP/1.1)
请求头
key:value
常见请求头:
Accept:告诉服务器客户端可以接受的类型
Accept-Language:告诉服务器客户端可以接受的语言类型
zh_CN,en_US
User-Agent:用户代理
Accept-Encoding:客户端可以接受的数据
Host:请求的服务器ip和端口号
Connection:表示当前连接如何处理
Keep-Alive:告诉服务器传回数据不要马上关闭,保持一小段连接
Closed
POST
请求行
同上
请求头
key:value
空行
请求体--->就是发送给服务器的数据
Accept:告诉服务器客户端可以接受的类型
Accept-Language:告诉服务器客户端可以接受的语言类型
zh_CN,en_US
Referer:表示请求发起时,浏览器地址栏中的地址
User-Agent:用户代理
Content-Type:表示发送数据的类型
Content-Length:表示发送的数据的长度
Cache-Control:表示如何控制缓存 no-cache不缓存
哪些时GET哪些是POST
GET请求
from标签 method=get
a标签
link标签引入css
Script标签引入js文件
img标签引入图片
iframe引入html页面
在浏览器地址栏中输入地址然后回车
POST请求
form标签 method=post
响应的HTTP协议格式
响应行
响应的协议和版本号 HTTP/1.1
响应状态码
响应状态描述符
响应头
key:value 不同的响应头有其不同的涵义
<空行>
响应体----->回传给客户端是数据
常见的响应码
200
请求成功
302
表示请求重定向
404
表示请求服务器已经收到了,但是数据不存在(请求地址错误)
500
表示服务器已经收到请求,但是服务器代码错误
MIME类型说明
HTTP中的协议数据类型
HttpServletRequest类
有什么用?
每次只要有请求进入Tomcat服务器,Tomcat就会把请求过来的HTPP协议解析好封装到Request对象中。然后传递到service方法(doGET和doPOST中)。可以通过HttpServletRequest类获取请求的信息。
常用方法
getRequestURI() 获取请求的资源路径
getRequestURL() 统一资源定位符(绝对路径)
getRemoteHost() 客户端ip地址
getHeader() 请求头
getParameter() 请求的参数
getParameterValues() 请求的参数(多个值的时候使用)
getMethod() 请求的方式GET或POST
setAttribute(key,value) 设置域数据
getAttribute(key) 获取域数据
getRequestDispatcher() 获取请求转发对象
请求的转发
请求的转发是指,服务器收到请求后,从一次资源跳转到另一个资源
主要实现:
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
requestDispatcher.forward(request, response);
特点:
浏览器地址栏没有变化
他们是一次请求
他们共享Request中的域数据
可以转发到WEB-INF目录下
不能出工程
Base标签的作用
一般base标签写在title下面
可以设置页面相对路径工作参照的地址
href就是地址
Web中的相对路径和绝对路径
相对路径
绝对路径
http://ip:port/工程名/资源路径
web中/斜杠的不同意义
在web中/斜杠是一种绝对路径
/斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杠</a>
/斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1</url-pattern>
2、servletContext.getRealPath("/")
3、request.getRequestDispatcher("/")
特殊情况:response.sendRediect("/"); 把斜杠发送给浏览器解析。得到http://ip:port/
HttpServletResponse类的作用
和HttpServletRequest类一样,每次请求进来,tomcat都会创建一个Response对象传递给Serlvet去使用。
两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter() ; 常用于回传字符串(常用)
两个流同时只能使用一个。否则会报错
乱码解决
设置服务器编码:response.setCharacterEncoding("utf-8");
设置请求头:response.setHeader("Content-Type","text/html;charset=UTF8");
设置浏览器编码:response.setContentType("text/html; charset=utf-8");
请求重定向
//有义务告诉客户端响应码302
response.setStatus(302);
response.setHeader("Location", "http://localhost:8080/Servlet_07/response2");
特点:
浏览器地址栏会发生变化
两次请求
不共享Request域中数据(因为不是一个请求)
不能访问WEB-INF下的资源
可以访问工程外的资源