前言
本文为JavaWeb基础Servlet相关知识,Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
一、什么是Servlet
Servlet是sun公司开发动态web的一门技术
Sun在这些API中提供一个接口叫做:Servlet,如果想开发一个Servlet程序,只需要完成两个小步骤:(1)编写好一个类;(2)把开发好的Java类部署到web服务器中
把实现了Servlet接口的Java程序叫做:Servlet
Servlet的作用:
接收用户端发来的请求
调用其他java程序来处理请求
将处理结果,返回到服务器中
二、HelloServlet
Servlet接口Sun公司有两个默认的实现类:HttpServlet,GenericServlet
编写一个Servlet程序的步骤:
(1)构建一个普通的Maven项目,删掉里面的src目录,在这个项目里面建立Module;这个空的工程就是Maven的主工程;
(2)关于Maven父子工程的理解: 父项目中的jar包子项目可以直接使用
父项目web.xml中会有:
<modules> <module>servlet-01</module> </modules>
(3)Maven环境优化:(1)修改web.xml为最新的;(2)将Maven的结构搭建完整
(4)编写一个Servlet程序:(1)编写一个普通类;(2)实现一个Servlet接口,这里直接继承HttpServlet
public class HelloServlet extends HttpServlet { //由于get和post只是请求实现的不同方式,可以相互调用,因为业务逻辑都一样; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter();//响应流 writer.print("Hello,Servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
(5)编写Servlet的映射
为什么需要映射?我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径。
web.xml:
<!-- 注册servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.yingjian.servlet.HelloServlet</servlet-class> </servlet> <!-- servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
(6)配置Tomcat
(7)启动测试
三、Servlet原理
(1)创建servlet对象:servlet在load-on-startup配置项大于0,context容器启动就会被实例化;否则,调用时实例化
(2)初始化servlet:调用servlet的init()方法
(3)tomcat接受到请求,根据url从mapper(mapper类保存了container容器中所有子容器信息)中选择正确的servlet容器,并在请求到达最终的servlet之前还要完成必要的一些步骤,必须要执行的Filter链,以及通知在web.xml中定义的listener
(4)执行servlet的service()方法
(5)当servlet从servlet容器中移除,servlet生命周期结束,调用servlet的destroy方法,销毁
四、Mapping问题
1.一个Servlet指定一个映射路径
web.xml:
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
2.一个Servlet指定多个映射路径
web.xml:
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping>
3.一个Servlet指定通用映射路径
web.xml:
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
4.默认请求路径
web.xml:
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
5.指定一些后缀或者前缀等
web.xml:
<!--可以自定义后缀实现请求映射,如只能映射到以jsp为后缀的路径 注意点:*前面不能加项目映射的路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping>
6.优先级问题
指定了Mapping的映射路径优先级最高,如果找不到就会走默认请求
web.xml:
<!-- 设置默认映射路径为Error404页面--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.yingjian.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>