Servlet本身在tomcat中是非常被动的,而网络请求和响应不是servlet的主要职责,所谓的request和response是tomcat传给servlet的,用来处理请求和响应的工具,本身不具备。Servlet本身更偏向于业务代码。
- 所谓的Tomcat是Web服务器和Servlet容器的结合体。
- 而Web服务器的作用就是将某个主机上的资源映射为一个url供外界访问
- Servlet容器,顾名思义就是里面存放着Servlet对象
为什么可以通过Web服务器映射的URL访问资源?
答 :接受请求、处理请求、响应请求
起初是由Servlet处理,后来衍生出三层架构,将一部分逻辑从Servlet中抽离出来交给Service和Dao处
之后出现的是SpringMVC,核心组件DispatherServlet,本质还是Servlet。但是在原来的HttpServlet的基础上,又封装了一条逻辑。
JavaWeb开发经典三层架构的优点:代码分层、逻辑清晰、解耦
其实进入Tomcat阶段后,我们就全面面向接口编程,通过导入Mysql的驱动包就可以。
driver.connect(url,username,password)
Tomcat帮助我们解决了很多底层问题,只传入三个对象:ServletConfig、ServletRequest、ServletResponse
ServletConfig
Servlet配置是在web.xml中
<init-param>
<param-name>username</param-name>
<param-value>bravo</param-value>
</init-param>
也就是说,servletConfig对象封装了servlet的一些参数信息,如果需要,我们可以获取。
Request/Response
Http请求到了tomcat后,tomcat通过字符串解析,把各个请求头(Header),请求地址(Url),请求参数(QueryString)都封装进了Request对象中
request.getHeader();
request.getUrl();
request.getQueryString();
...
通过调用以上等方法,都可以得到浏览器当初发送来的请求信息。
至于Response,tomcat传给servlet时,它还是空的对象。经过servlet逻辑处理后得到结果,最终通过response.write()方法,将结果写入response内部的缓冲区。Tomcat会在servlet处理结束后,拿到response,遍历里面的信息,组装成Http响应发送给客户端。
Servlet接口中5个方法
其中init、service、destroy是生命周期方法。init和destroy各自只执行一次,及servlet创建和销毁时。而service会在每次有新请求到来时被调用,也就是说,我们主要的业务代码需要写在service中。
-起初通过如下方法写Get\Post请求
public void service(Request request, Response response){
}
-其次出现了GenericServlet抽象类
public abstract class GenericServlet implement javax.servlet.Servlet, ServletConfig,java.io.Serializable{
}
- 提升了init方法中原本是形参的servletConfig对象的作用域(成员变量),方便其他方法使用
- init方法中还调用了一个init空参方法,如果我们希望在servlet创建时做一些什么初始化操作,可以继承GennericServlet后,覆盖init空参方法
- 由于其他方法内也可以使用servletConfig,于是写了一个getServletContext方法
- service没有实现
-之后发现HttpServlet
public abstract class HttpServlet extends GenericServlet{
}
其中实现了service,不可重写覆盖,但是doGet/doPost需要重写,不然会报405错误
HttpServlet被声明成了抽象类的原因?就是有抽象方法service
一个类声明成抽象方法,一般有两个原因:
- 有抽象方法
- 没有抽象方法,但是不希望被实例化
Filter用到了责任链模式,Listener用到了观察者模式,Servlet也不会翻过使用设计模式的模板方法模式。