1.Servlet技术
1)什么是Servlet:
- 是JaveEE的规范之一,规范就是接口
- 是JavaWeb三大组件之一,三大组件分别是:Servlet程序,Fliter过滤器,Listenter监听器
- 是运行在服务器上的一个java小程序,可以接收客户端发来的请求,并相应数据给客户端
2)实现Servlet程序
1.编写一个类实现Servlet接口,实现service方法
package com.atguigu;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.到web.xml 中去配置servlet程序的访问地址
<servlet>
<!-- servlet-name给Servlet程序起别名-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class Servlet程序的全类名-->
<servlet-class>com.atguigu.HelloServlet01</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet-name告诉服务器再给哪个servlet程序配置地址-->
<servlet-name>HelloServlet</servlet-name>
<!-- url-pattern
/hello 即为:http:localhost:8080/servlet01/hello-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.运行服务器 即调用service方法
3)Servlet 的生命周期
- 执行Servlet构造器方法
- 执行init初始化方法
- 执行service方法
- 执行destory销毁方法
第1,2步只在构造Servlet程序时才会调用
第3步每次访问都会调用
第4步只在结束服务器时调用
4)servlet程序区分get请求和post请求
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service方法");
//类型转换:ServletRequest没有getMethod方法而HttpServletRequest有
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//获取请求的方式
String method = httpServletRequest.getMethod();
if ("GET".equals(method)){
System.out.println("GET请求");
}else if("POST".equals(method)){
System.out.println("POST请求");
}
}
5)通过继承HttpServlet实现Servlet程序
- 编写一个类去继承
- 根据业务重写doPost() 和doGet()
- 到web.xml中去配置Servlet程序的访问地址
public class HelloServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet02的doPost方法");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet02的doGet方法");
}
}
6)使用IDEA创造Servlet程序
7)Servlet类的继承体系
2.ServletConfig类
ServletConfig从名称上看是Servlet程序的配置信息类。
servlet程序和ServletConfig对象都是有Tomcat负责创建,我们负责使用
servlet程序默认是第一次访问的时候创建,ServletConfig对象是每个Servlet程序创建时,创建一个对应的ServletConfig对象
1)ServletConfig类的三大作用
- 可以获取Servlet程序的别名servlet-name的值
- 获得初始化参数init-param(该参数只属于该Servlet程序)
- 获取ServletContext对象
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 初始化方法");
System.out.println("1.Servlet程序别名为:"+servletConfig.getServletName());
System.out.println("2.初始化参数username的值是"+servletConfig.getInitParameter("username"));
System.out.println(servletConfig.getServletContext());
}
<servlet>
<!-- servlet-name给Servlet程序起别名-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class Servlet程序的全类名-->
<servlet-class>com.atguigu.HelloServlet01</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
2)ServletConfig对象在其他方法中的使用
//在init(ServletConfig servletConfig)方法中直接使用
//其他方法中需要先创建对象
ServletConfig servletConfig = getServletConfig();
//如果重写了init()方法,需要调用父类的init()方法保存ServletConfig对象
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("重写init方法");
}
3.ServletContext类
1)什么是ServletContext?
- 是一个接口,表示Servlet上下文对象
- 一个Web工程,只有一个ServletContext对象实例
- ServletContext对象是一个域对象
- 在工程部署时启动,在结束时销毁
域对象:是可以像Map一样存取数据的对象,叫做域对象
存数据 | 取数据 | 删除数据 | |
Map | put() | get() | remove() |
域对象 | setAtribute() | getAtribute() | removeAtribute() |
2)作用
- 获取Web.xml中配置的上下文参数context.param(该参数属于整个工程)
- 获取当前工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map一样存取数据
<context-param>
<param-name>user</param-name>
<param-value>context</param-value>
</context-param>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = getServletConfig().getServletContext();
//作用1
String username = servletContext.getInitParameter("username");
String password = servletContext.getInitParameter("password");
System.out.println(username+":"+password);
//作用2 : 获取 /工程路径
System.out.println("当前工程路径为"+servletContext.getContextPath());
//作用3
System.out.println("工程部署的路径:"+servletContext.getRealPath("/"));
System.out.println("工程下的css目录的绝对路径"+servletContext.getRealPath("/css"));
//作用4
ServletContext servletContext1 = getServletContext();
servletContext1.setAttribute("key1","value1");
System.out.println("ContextServlet的key的值为"+servletContext1.getAttribute("key1"));
}
4.Http协议
1)什么是HTTP协议
客户端和服务器之间通信时,发送的数据,需要遵守的规定叫做HTTP协议,HTTP协议中的数据又叫报文。
2)请求的HTTP协议格式
1.GET请求
1.请求行
- 请求的方式
- 请求的资源路径
- 请求的协议的版本号
2.请求头
key:value 组成
get请求http协议的内容:
2.POST请求
1.请求行
2.请求头
3.请求体 =====> 发送给服务器的数据
3.常用请求头说明
- Accept: 表示客户端可以接收的数据类型
- Accept-Language: 表示客户端可以接收的语言类型
- User-Agent: 表示客户端浏览器的信息
- Host: 表示请求时的服务器的ip和端口号
4.哪些是get哪些是post请求
GET请求:
- form 标签 method=get
- a标签
- link标签引入css
- Script标签引入js文件
- img标签引入图片
- iframe引入html页面
- 在浏览器地址栏中输入地址后回敲回车
POST请求:
form标签method= post
3).响应的HTTP协议格式
1.响应行
- 响应的协议和版本号
- 响应状态码
- 响应状态描述符
2.响应头
key:value
3.响应体 ------->>>>回传给客户端的数据
4)常用的响应码说明
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已经收到了,但是你要的数据不存在
500 表示服务器已经收到请求,但服务器内错误(代码错误)
5)MIME类型说明
MIME是HTTP协议中的数据类型
谷歌浏览器查看内容:
5.HttpServletRequest类
a)作用:
每次有请求进入到Tomcat服务器中,Tomcat服务器就会把请求过来的HTTP协议信息解析号封装到Request对象中,然后传递到service()(doGet() 和doPost())中给我们使用。通过HttpServletRequest对象,我们可以获取到所有请求的信息
b)常用方法:
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的IP地址
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues()获取请求的参数(多个参数时)
- getMethod() 获取请求的方式
- getAttribute() 获取域数据
- setAttribute(key,value)设置域数据
- getRequestDispatcher() 获取请求转发 对象
public class HttpservletRequest01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getRequestURI()获取请求的资源路径
System.out.println("URI ===>" +req.getRequestURI());
// getRequestURL()获取请求的统一资源定位符(绝对路径)
System.out.println("URL ===>" +req.getRequestURL());
// getRemoteHost() 获取客户端的IP地址
System.out.println("客户端IP地址 ===>"+req.getRemoteHost());
// getHeader() 获取请求头
System.out.println("请求头 ===>" + req.getHeader("User-Agent"));
// getMethod()获取请求的方式
System.out.println("请求方式 ===>" + req.getMethod());
}
}
c)获取请求参数
<body>
<form action="http://localhost:8080//servlet02//para" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
兴趣爱好:<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="c++">c++
<input type="checkbox" name="hobby" value="Go">Go<br>
<input type="submit" value="提交">
</form>
</body>
public class ParamServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("用户名:"+req.getParameter("username"));
System.out.println("密码:"+req.getParameter("password"));
System.out.println("爱好:"+ Arrays.asList(req.getParameterValues("hobby")));
}
}
d)解决POST请求中文乱码问题
//设置字符集为UTF-8
//必须在获取请求参数之前调用
req.setCharacterEncoding("UTF-8");
e)请求的转发
服务器接收到请求后,从一个资源跳到另一个资源
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//查看请求
System.out.println("在Servlet1中查看请求username:"+ req.getParameter("username"));
//Servlet1盖章,并在Servlet2中查看
req.setAttribute("key","Servlet1的章");
//得到Servlet2的路径
/**
* 必须以'/' 打头,代表的是 http://ip:port/工程名,映射到IDEA工程的webqpp目录下
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//转向Servlet2
requestDispatcher.forward(req,resp);
}
}
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//查看请求
System.out.println("在Servlet2中查看请求username:"+ req.getParameter("username"));
//查看Servlet1是否盖章
System.out.println("Servlet1的章:"+req.getAttribute("key"));
//处理自己的业务
System.out.println("Servlet2处理业务");
}
}
f)base标签的作用
base标签设置页面相对路径工作时参照的地址
g)Web中的相对路径和绝对路径
相对路径是:
. ===> 表示当前目录
.. ===> 表示上一级目录
资源名 ===> 表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
h)Web中 / 斜杠的不同意义
在web中 / 斜杠是一种绝对路径
1.被浏览器解析:得到的地址是:http:/ip:port/
<a href="/">斜杠<a>
2.被服务器解析:得到的地址是:http://ip:port/工程路径
6.HttpServletResponse类
a)HttpServletResponse类的作用
HttpServletResponse类和HttpServletRequest一样,每次请求过来,Tomcat服务器都会创建一个Response对象传递给Servlet服务器去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse类表示所有响应的信息。
通过对HttpServletResponse对象的设置来设置返回给客户端的信息
b)两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流只能使用一个
c)如何往客户端回传数据
public class ResponseIOStream extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("HelloWorld");
}
}
d)解决响应的中文乱码问题
public class ResponseIOStream extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//方法1
System.out.println(resp.getCharacterEncoding()); //默认字符集为ISO-8859-1
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,可设置浏览器字符集为UTF-8
resp.setHeader("Content-type","text/html;charset=UTF-8");
PrintWriter writer2 = resp.getWriter();
writer2.write("你好世界");
}
}
public class ResponseIOStream extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//方法2
//同时设置浏览器和客户端都使用UTF-8字符集,还设置了响应头
//此方法一定得在获取流对象之前调用才有效
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer2 = resp.getWriter();
writer2.write("你好世界");
}
}
e)请求重定向
请求重定向的第一种方法:
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("this is response1");
//设置响应状态码302,表示重定向。
response.setStatus(302);
//设置响应头说明新的地址在哪里
response.setHeader("Location","http://localhost:8080/servlet02/rep2");
}
}
请求重定向的第二种方法(推荐):
resp.sendRedirect("http://localhost:8080/servlet02/rep2")