1月18-Servlet
Posted 小码哥的进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1月18-Servlet相关的知识,希望对你有一定的参考价值。
今日内容
1.Servlet
2.Request
3.Response
4.案例:
同步请求:实现登录功能(不操作数据库)
异步请求:实现登录功能(不操作数据库)
5.作业: 使用异步请求完成登录功能,并且连接数据库
一.Servlet
1.1 Servlet概述
- 概述
servlet 是运行在 Web 服务器中的小型 Java 程序(动态资源)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端(浏览器)的请求。
Servlet作用:
-
Servlet接收浏览器发送的请求, 接收请求数据
比如: 小明----请求: 提交5元(data)—>超市
-
Servlet对请求处理,然后响应数据给浏览器
比如: 小明<—响应: 一袋精细盐(data)------超市
1.2 Servlet入门
-
Servlet是SUN制定的动态资源程序标准,提供的是一个Servlet接口.
我们程序员开发Servlet,自定义一个类,去实现Servlet接口.重写里面方法
-
Servlet入门程序
-
步骤一: IDEA创建一个web项目 比如: web02
-
步骤二: 项目的src目录, 创建一个包(new packge) 比如: cn.tedu.web
-
步骤三: 在包下面, 自定义一个类, 比如 :Demo1Servlet 实现 Servlet接口,重写接口里面的方法
-
步骤四: 在自定义的类里面配置访问路径. 比如: “/demo1”
-
步骤五: 测试
浏览器地址栏: http://localhost:端口/项目名称/servlet访问路径
-
注意: 动态资源项目.web项目,目录的存放文件的区别
-
问题一: 实现Servlet接口,并且Servlet接口报红色,
不能导入包import javax.servlet.*
分析问题原因: 创建web项目中,出问题,没有绑定tomcat环境
没有绑定tomcat环境,不能导入包,是因为tomcat环境提供了
servlet-api.jar
-
问题一: 解决方案
方案二: 在web项目中, 引入tomcat环境(自带servlet-api.jar),相当于项目中引入了servlet-api.jar
- 方案一: 在web项目中,导入servlet-api.jar
在WEB-INF目录下面,创建一个lib目录(如果有,就不用),把servlet-api.jar放到lib目录里面,同时把servlet-api.jar加载到项目中.
入门代码
package cn.tedu.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
/*
alt+enter 放在接口后面, 点击implements methods
*/
@WebServlet(urlPatterns ="/demo1" )
public class Demo1Servlet implements Servlet
/**
* 服务方法: 作用接收请求,然后响应数据
* @param servletRequest:请求对象,处理请求数据
* @param response:响应对象,处理响应数据的
* @throws ServletException
* @throws IOException
*/
public void service(ServletRequest servletRequest, ServletResponse response) throws ServletException, IOException
//1.打印模拟:接收到请求了
System.out.println("hello request");
//2.响应数据到浏览器: 英文,先不要写中文
PrintWriter writer = response.getWriter();
writer.write("hello response");
@Override
public void init(ServletConfig servletConfig) throws ServletException
@Override
public ServletConfig getServletConfig()
return null;
@Override
public String getServletInfo()
return null;
@Override
public void destroy()
1.3 Servlet访问流程
-
要求: 需要创建一个web项目, 把部署到服务器.通过浏览器去访问servlet资源
-
在浏览器地址栏输入的servlet访问路径:
http://域名:端口/项目名称/servlet访问路径.
-
地址一: 输入: http://域名:端口
作用: 访问到主机安装的tomcat服务器
-
地址二: /项目名称
作用: 访问的tomcat服务器部署的项目
-
地址三: /servlet访问路径.
作用: 访问tomcat服务器部署的项目里面的servlet资源
-
如下图:
-
1.4 Servlet生命周期
-
生命周期: 指的对象从创建到销毁的完整过程,这个过程就是生命周期
在完整的过程中,涉及到方法的执行,那么这些方法,我们称之为生命周期方法
-
代码如下
package cn.tedu.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* 生命周期相关的方法,一共三个
* init(参数): 当servlet对象创建以后,执行该方法
* service(参数):当浏览器发送请求时,执行该方法
* destroy():当销毁servlet对象以后,执行该方法
* 问题一: servlet对象创建好以后,在那里保存?
* servlet是运行在tomcat服务器上面,
* 保存在tomcat服务器的内存中
* 问题二: servlet对象会创建几次呢?
* servlet只创建一次,与创建对象相关的init()方法,执行一次.
* 问题三: 生命周期方法什么时候执行,执行几次?
* init(参数): 只执行一次,当第一次访问时才执行.
* service(参数):执行多次,每次访问都会执行.
* destroy(): 只执行一次. 当服务器正常关闭时才会执行.
*/
@WebServlet(urlPatterns ="/demo2" )//配置访问路径
public class Demo2Servlet implements Servlet
/**
* 生命周期方法: 作用接收浏览器请求,响应数据给浏览器
* @param servletRequest: 请求对象,处理请求数据
* @param servletResponse: 响应对象, 处理响应数据
* @throws ServletException: 异常信息对象
* @throws IOException
*/
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException
System.out.println("service method ----");
/**
* 生命周期方法: 创建servlet对象,执行init()方法
* @param servletConfig
* @throws ServletException
*/
public void init(ServletConfig servletConfig) throws ServletException
System.out.println("init servlet object--1");
/**
* 生命周期方法: 在servlet对象销毁以后,执行该方法
*/
public void destroy()
System.out.println("destroy method--------");
/**
获取servletConfig配置类对象,了解
*/
@Override
public ServletConfig getServletConfig()
return null;
/**
获取servlet的信息,了解
比如: servlet的访问路径,servlet的名称
*/
public String getServletInfo()
return null;
1.5 Servlet的体系结构
-
顶层接口
Servlet 里面都是抽象方法
-
抽象子类,实现Servlet接口
GenericServlet 里面有抽象方法,也有普通方法
-
抽象子类,继承了 GenericServlet
HttpServlet 里面有抽象方法,也有普通方法
为什么设计Servlet体系结构,这样设计?
-
如果开发者定义一个类,实现Servlet接口,这种方式不好.
缺点: 自定义类重写接口的所有方法,即使方法不需要,也要全部全写.
-
如果开发者定义一个类,继承 GenericServlet,这种方式不好
优点: 解决了(实现Servlet接口全部重写方法)的缺点.
缺点: 不能明确指定浏览器发送的是什么请求,
不能很好的处理请求和响应数据
-
如果开发者定义一个类, 继承HttpServlet, 这种方式好,推荐使用
解决上述1, 2中存在的问题了,
明确指定浏览器发送的是http请求,能够很好处理请求数据以及响应数据
http协议: 作用规范请求和响应过程的数据交互格式.
结论: 企业开发中,通过继承HttpServlet来定义我们的类,处理请求和响应数据
1.6 实际开发中,Servlet推荐的书写方式
-
自定义一个类, 继承HttpServlet,重写下面两个方法(重点以及难点)
-
doGet(请求对象request, 响应对象response):
作用: 接收浏览器发送的get请求
-
doPost(请求对象request, 响应对象response):
作用: 接收浏览器发送的post请求
-
代码如下
@WebServlet("/demo5") public class Demo5Servlet extends HttpServlet protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException //处理post数据,不能处理get请求的数据 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException //处理get数据,不能处理post请求的数据
-
-
为什么不重写service方法, 而重写doGet和doPost方法(重点以及难点)
结论就是: service方法内部,不知道浏览器发送的是get请求还是post请求,都会接收, 最终在处理get请求的数据时和处理post请求的数据时,处理方式不一样. 所以不重写service方法
-
HttpServlet中的service方法和doGet方法和doPost方法有关系吗?
答案肯定有.
什么关系,查询HttpServlet的源代码
快捷方式有两种:
方式一: 在代码中,找到HttpServlet, 安装ctrl键, 鼠标点击HttpServlet
方式二: 在当前项目中, ctrl+n快捷键,在它的输入框: HttpServlet
源码分析:
debug源码调试:
浏览器发送的get请求—>HttpServlet中的service方法:
1.获取浏览器的提交请求方式: method
2.if判断(method.equals(“Get”))
//this指代的就是当前HttpServlet
this.doGet(req,response);
else if(method.equals(“Post”))
this.doPost(req,response);
结论1:(请求方式一共7种,常见的有两种)
结论2:浏览器发送请求时---->service方法: 根据请求方式的不同---->去调用doGet或者doPost方法
结论3:
浏览器发送get请求---------------->doGet方法
浏览器发送post请求---------------->doPost方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException String method = req.getMethod(); long lastModified; if (method.equals("GET")) lastModified = this.getLastModified(req); if (lastModified == -1L) this.doGet(req, resp); else long ifModifiedSince; try ifModifiedSince = req.getDateHeader("If-Modified-Since"); catch (IllegalArgumentException var9) ifModifiedSince = -1L; if (ifModifiedSince < lastModified / 1000L * 1000L) this.maybeSetLastModified(resp, lastModified); this.doGet(req, resp); else resp.setStatus(304); else if (method.equals("HEAD")) lastModified = this.getLastModified(req); this.maybeSetLastModified(resp, lastModified); this.doHead(req, resp); else if (method.equals("POST")) this.doPost(req, resp); else if (method.equals("PUT")) this.doPut(req, resp); else if (method.equals("DELETE")) this.doDelete(req, resp); else if (method.equals("OPTIONS")) this.doOptions(req, resp); else if (method.equals("TRACE")) this.doTrace(req, resp); else String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[]method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(501, errMsg);
1.8 总结
-
Servlet概述
它是运行在web服务器的一个java程序(动态资源)
作用: 接收浏览器的请求,响应数据给浏览器
-
自定义servlet类.
方式一: 实现接口Servlet
自定义一个类 实现Servlet接口, 不推荐,重写很多没有用的方法
方式二: 继承GenericServlet
自定义一个类 继承GenericServlet, 不推荐,因为不清楚浏览器发送的http请求
方式三: 继承HttpServlet,重写doGet和doPost方法 推荐使用.
-
源码分析HttpServlet
结论1:(请求方式一共7种,常见的有两种)
结论2:浏览器发送请求时---->service方法: 根据请求方式的不同---->去调用doGet或者doPost方法
结论3:
浏览器发送get请求---------------->doGet方法
浏览器发送post请求---------------->doPost方法
-
常见的问题
-
404 问题: 表示请求路径找不到, 因为路径写错了.
-
500问题: 表示代码出异常了,找代码的问题.
-
405问题: 表示请求方式不支持
浏览器发送get请求------------>只有一个doPost方法
浏览器发送post请求------------>只有一个doGet方法
-
-
以上是关于1月18-Servlet的主要内容,如果未能解决你的问题,请参考以下文章