servlet是javaEE规范之一,其实就是一个接口Servlet是javaweb三大组件之一,三大组件分别是Servlet程序,Filter过滤器,Listen监听器Servlet是运行在服务器上的java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端 (2)写一个Servlet程序
1、编写一个类实现Servlet接口
2、实现service方法,处理请求,并响应数据
3、到web.xml中去配置servlet程序访问地址
创建项目
编写类实现接口
配置web.xml
结果
首先我们写了自己的web项目,就是有了一个helloServlet的程序,它就做为整个项目,然后它会发布到Tomcat作为服务器,然后你就可以访问了。
1、首先执行Servlet构造器方法2、执行init初始化方法3、执行service方法【每次访问都会调用】4、执行destroy销毁方法
方法1,2是在第一次访问的时候访问。
(5)理解doGet和doPost方法
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class hello implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws
ServletException, IOException {
System.out.println("3 service === Hello Servlet 被访问了");
// 类型转换(因为它有 getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
if ("GET".equals(method)) {
doGet();
} else if ("POST".equals(method)) {
doPost();
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
public void doGet(){
System.out.println("get 请求");
System.out.println("get 请求");
}
public void doPost(){
System.out.println("post 请求");
System.out.println("post 请求");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
(6)通过继承HTTPServlet实现Servlet
看一下继承关系
public class HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
System.out.println("doGet方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
System.out.println("doPost 方法");
}
}
同样的配置web.xml文件 (7)通过idea创建servlet
是Servlet的配置类Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用Servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig (1)ServletConfig类的三大作用
获取Servlet程序的别名servlet-name的值获取初始化参数init-param获取ServletContext对象
HelloServlet cn.mldn.servlet2.servlet3.HelloServlet2 username root url jdbc:mysql://localhost:3306/test HelloServlet /hello
servlet标签给Tomcat配置Servlet程序servlet-mapping是配置访问的路径servlet-name是标签servlet程序起一个别名(一般是类名)
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init 初始化方法");
// 1、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
// 2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
3、ServletContext类
(1)什么是ServletContext类
ServletContext 是一个接口,它表示 Servlet 上下文对象一个web工程,只是一个servletContex对象的实例servletContext对象时一个域对象servletContext是在web工程部署启动的时候创建,在web工程时候销毁 (2)什么是域对象
什么是域对象?域对象,是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个 web 工程。存数据就用put()方法,setAttribute(),而取对象则是get(),getAttribute()实现,然后可以删除数据remove(),removeAttribute()
其实这个很好理解,比如说我们把前端项目看成一个域对象,我后端给你一个cookie,然后你保存下来,存起来,全局整个前端都是共享这部分数据的。 (3)ServletContext类的作用
获取web.xml中配置的上下文参数context-param获取当前的工程路径,格式:/工程路径获取工程部署后再服务器硬盘上的绝对路径想Map一样存数据
public class HelloServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// 1、获取 web.xml 中配置的上下文参数 context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param 参数 username 的值是:" + username);
System.out.println("context-param 参数 password 的值是:" +
context.getInitParameter("password"));
// 2、获取当前的工程路径,格式: /工程路径
System.out.println( "当前工程路径:" + context.getContextPath() );
// 3、获取工程部署后在服务器硬盘上的绝对路径
System.out.println("工程部署的路径是:" + context.getRealPath("/"));
System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
System.out.println("doPost 方法");
}
}
这个比较重要,到时候在开发中用比较多,到时候我们可以存在Redis里面,方便存取。
username context password root
public class ContextServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// 获取 ServletContext 对象
ServletContext context = getServletContext();
System.out.println(context);
System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
context.setAttribute("key1", "value1");
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
}
4、HTTP协议
http协议就是客户端和服务器之间通信时,发送数据需要遵守的规则。
(1)请求HTTP协议格式http://localhost:8083/helloservlet_war_exploded/hello
客户端发送消息叫请求
服务器回应消息叫回应
HTTP拥有如下请求:GET POST HEAD PUT DELETE ConNECT TRACE OPTIONS
常用的请求如下请求:GET,POST请求
Get请求:请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用base64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
例子就是我们自己编写的表单。
因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
(3)常见的请求头Accept:表示客户端可以接受的数据类型Accept-Languege:表示客户端可以接受的语言类型User-Agent:表示客户端浏览器的信息Host:表示请求时的服务器ip地址
响应行
(1) 响应的协议和版本号
(2) 响应状态码
(3) 响应状态描述符响应头
(1) key : value 不同的响应头,有其不同含义
空行响应体 ---->>> 就是回传给客户端的数
常见的响应码
200:请求成功302:表示请求重定向404:表示请求服务器已经收到了,但是你要的数据不存在500:表示服务器已经收到请求,但是服务器内容错误。 (5)MIME类型说明
MIME:是HTTP协议中数据类型
MIMEden英文全称是Multipurpose Internet Mail Extension多功能Internet邮件扩充服务,MIME类型的格式是“大类型/类型”,并与某一种文件的扩展名相对应。
用浏览器查看一下
响应头
三、HttpServletRequest和HttpServletResponse
1、HTTPServletRequest
(1)HTTPServletRequest的作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
信息
getRequestURI():获取请求的资源路径
getRequestURL():获取请求的统一资源定位符
getRemoteHost():获取客户端的ip地址
getHeader():获取请求头
getParameter():获取请求的参数
getParameterValues()获取请求的参数,多个值的时候用
getMethods():获取请求的方法get或者post
setAttribute(key,value):设置域数据
getAttribute(key):获取域数据
getRequestDispatcher():或者请求转发对象
案例分析
什么是请求转发?
请求就是请求,转发就是服务器接受到请求之后,从一次资源跳转到另一个资源的操作叫做请求转发。
在web中/是一种绝对路径/如果被浏览器解析,得到的地址是会是:http://ip:端口号/工程路径/如果被服务器解析,得到的是:http://ip:duankouhao/工程路径 2、HTTPServletResponse (1)HTTPServletResponse作用
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
(2)返回的方式字符流:getOutputStream(),常用于下载(传递二进制数据)字符流:getWriter(),常用于回传字符串
上面两同时只能用一个。
(3)如果给客户端返回数据
而且这个是java的里面的数据流的操作格式,最后要关闭流的传输。
// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding(“UTF-8”);
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader(“Content-Type”, “text/html; charset=UTF-8”
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType(“text/html; charset=UTF-8”); (5)请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
视频学习地址:哔哩哔哩尚硅谷课程



