Tomcat服务器是一个免费的开放源代码的Web应用服务器。
1.1 WebWEB,在英语中web即表示网页的意思,它用于表示Internet主机(服务器)上供外界访问的资源
Web资源分类
- 静态资源:web页面中供人们浏览的数据始终是不变 (eg: html,css,js、音视频)
- 动态资源:指web页面中供人们浏览的数据是由程序产生的,不同的用户或者不同时间点访问web页面看到的内容各不相同(eg: servlet,jsp)
web通信
基于http协议的请求响应机制,请求一次响应一次,先有请求后有响应。
1.2 HTTP协议HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。
HTTP作用:用于定义WEB浏览器与WEB服务器之间交换数据的过程和数据本身的内容
交互过程: 浏览器请求, 服务请求响应
-
请求:请求行,请求头,请求体
请求行
- 请求方式
- 请求路径
请求头:它是由键值对构成
请求体:只有post请求才有请求体,用于携带请求参数的
-
响应:响应行,响应头,响应体
响应行:包含响应状态码
- 常见的响应状态码:
- 200 OK
- 302 Redirect 重定向
- 304 Cache 读取缓存
- 400 BAD REQUEST 请求有问题(可能是请求参数等等不符合规定)
- 403 Forbidden 拒绝处理
- 404 NOT FOUND 找不到资源
- 500 SERVER ERROR 服务器异常
响应头: 由多个键值对构成,服务器指示浏览器的操作
- Location: http://www.it315.org/index.jsp指示新的资源的位置,通常和状态,码302一起使用,完成请求重定向
- Content-Type: text/html; charset=UTF-8; 设置服务器发送字符的编码类型
- Refresh: 5;url=http://www.baidu.com 指示客户端刷新频率。
- Content-Disposition: attachment; filename=a.jpg 指示客户端(浏览器)下载文件
响应体:
-
可以用于客户端页面的展示
-
可以用于下载
- 常见的响应状态码:
-
情况一: 已经关联成功的情况(因为我创建项目的时候, 已经选择了tomcat)
-
情况二: 如果之前没有选择tomcat, 现在就需要自己关联发布
Servlet 运行在服务端(tomcat)的Java小程序(对象),是sun公司提供一套规范,就是动态资源
- 用来接收、处理客户端请求、响应给浏览器的动态资源。
- 实质就是java代码,通过java的API动态的向客户端输出内容
Servlet与普通Java程序的区别
-
必须实现servlet接口
-
必须在servlet容器(服务器 tomcat)中运行
-
servlet程序可以接收用户请求参数以及向浏览器输出数据
-
实现Servlet接口
public class ServletDemo02 implements Servlet{ @Override public void init(ServletConfig config) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("ServletDemo02执行了..."); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } } -
继承GenericServlet 类
GenericServlet 已经实现好了一些servlet接口所需的方法,只需要重写service方法即可
public class GenericDemoServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("GenericDemoServlet执行......."); } } -
继承HttpServlet类
HttpServlet继承GenericServlet适配HTTP协议下的开发。,根据Http不同的请求,只需重写doGet、doPost等方法中一个即可
public class ServletDemo02 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("编写很多代码处理这次post请求"); } }
IDEA中可以直接创建继承HttpServlet的类,直接在IDEA里面new Servlet
2.2 映射路径路径配置的方式
-
配置文件配置:web/WEB-INF/web.xml文件
ServletDemo01 com.itheima.web.ServletDemo01 ServletDemo01 /demo01 -
注解方式配置
@WebServlet("/demo02") //添加注解配置映射路径 public class ServletDemo02 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
路径配置的范围
- 完全路径匹配: “/demo01”
- 目录匹配: “
//原则: 如果是将类路径下载文件转换成流使用类加载器的getResourceAsStream()方法
//如果是将web里面的资源转换成流就使用ServletContext的getResourceAsStream()方法
InputStream is = getServletContext().getResourceAsStream("img/timg.jpg");
}
}
2. 案例
2.1 注册提交
@WebServlet("/login") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 获取客户端提交的请求参数: 客户端携带过来的请求数据都在request对象中 String username = request.getParameter("username"); String password = request.getParameter("password"); //2. 校验客户端提交的用户名和密码是否正确 if ("jay".equals(username) && "123456".equals(password)) { //登录成功 //将校验结果响应给客户端 response.getWriter().write("login success!!!"); }else { //登录失败 response.getWriter().write("login failed!!!"); } } }2.2 统计访问次数@WebServlet("/count") public class CountServlet extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { super.init(config); //往ServletContext中存储一个计数器,数值为0 getServletContext().setAttribute("count",0); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //每次有用户访问我们的CountServlet,我们就将ServletContext中存储的访问次数+1 //1. 取出count的值 Integer count = (Integer) getServletContext().getAttribute("count"); //数值++ count++; //将count存入到ServletContext getServletContext().setAttribute("count",count); } }@WebServlet("/show") public class ShowServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //目标:展示用户的访问次数 //1. 从ServletContext中取出count Integer count = (Integer) getServletContext().getAttribute("count"); //2. 使用response将数据展示到页面上 response.getWriter().print(count); } }



