Servlet的概念
概念:狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了Servlet接口的java类,一般情况下,人们将Servlet理解为后者。(用java语言开发网页动态资源的技术)
servlet的特点
1、servlet就是一个普通的java类,继承HttpServlet类
2、一个普通的java类实现了Servlet接口,也叫Servlet程序。我们通常继承HttpServlet是为了创建一个基于http协议的servlet程序。
3、servlet程序交给tomcat服务器运行。
servlet的使用
1、创建普通的java类并继承HttpServlet
2、覆写service方法
3、在service方法中书写逻辑代码即可
4、在webRoot下的WEB-INF文件夹下的web.xml文件中配置servlet
servlet的运行流程
URL:http://localhost:8080/project/my2
组成:服务器地址:端口号/虚拟项目名(webapps目录下文件夹名称) /servlet的别名
URI:虚拟项目名/servlet的别名
浏览器发送请求到服务器,服务器根据请求URL地址中的URI信息在webapps目录下找到对应的项目文件夹,然后在web.xml中检索对应的servlet,找到后调用并执行Servlet。
Servlet的路径映射
url-pattern: 表示servlet的路径映射,也叫servlet访问名称。
url-patttern 浏览器输入URL
精确匹配 /demo1 http://localhost:8080/day10/demo1
/itcast/demo1 http://localhost:8080/day10/itcast/demo1
模糊匹配 /* http://localhost:8080/day10/任意路径
/itcast/* http://localhost:8080/day10/itcast/任意路径
*.后缀 http://localhost:8080/day10/任意路径.后缀
(*.do、*.action、*.jsf、*.html)
注意:
1)url-pattern要么以/开头,要么以*开头 例如: itcast/demo1错误写法。
2)不能同时使用两种模糊匹配。例如: /itcast/*.html 错误写法
3)当多个url-pattern同时符合匹配规则,那么
3.1 精确匹配的url-pattern会优先被执行。(长的最像的url-pattern优先)
3.2 后缀名结尾的模糊匹配的url-pattern优先级最低!!!
Sevlet的缺省路径
/ : 表示servlet的缺省路径。
在tomcat服务器中配置了一个DefaultServlet,叫默认Servlet,该默认Servlet的url-pattern就是/ 。默认Servlet的作用,用于解析web应用下的静态资源。
问题: 浏览器输入一个资源名称时,查找资源的顺序是如何?
1)首先,在当前web应用下的web.xml文件中查找是否有匹配的url-pattern
2)如果匹配到,执行对应的servlet(动态资源)
3)如果没有匹配到,就交给tomcat服务器的默认Servlet去处理
4)默认Servlet会到当前web应用下读取对应名称的静态资源文件。
5)如果读到对应的静态资源文件,那么就把内容返回给浏览器
6)如果读不到对应的静态资源文件,那么就返回404的错误页面。
结论: 先找动态资源,再找静态资源!!!!
Servlet的四个生命周期
构造方法:在创建servlet对象时调用。只调用1次。(证明servlet对象在tomcat服务器中是单例的。)
init方法:在创建完servlet对象后调用。只调用1次。用于初始化对象。
service方法:在每次请求servlet时调用。调用n次。入口方法,逻辑代码在这里被调用。
destroy方法:servlet对象销毁时调用。只调用1次。tomcat服务器停止或web应用重新部署时调用。
Servlet的生命周期
1、从第一次调用到服务器关闭。
2、如果Servlet在web.xml中配置了load-on-startup,生命周期为:从服务器启动到服务器关闭
<!-- 自动加载机制 -->
<!-- 正整数:数值越大,创建对象的优先级越低 -->
<load-on-startup>1</load-on-startup>
注意:
init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行
destory方法是在servlet被销毁时执行,也就服务器关闭时。
1 public class ServletLife extends HttpServlet {
2 //初始化方法,在servlet第一次加载内容的时候被调用
3 @Override
4 public void init() throws ServletException {
5 System.out.println("servlet初始化完成");
6 }
7
8 //service方法,真正处理请求的方法
9 @Override
10 protected void service(HttpServletRequest req, HttpServletResponse resp)
11 throws ServletException, IOException {
12 resp.getWriter().write("servlet life");
13 System.out.println("servlet life");
14 }
15 @Override
16 public void destroy() {
17 System.out.println("我被销毁了...");
18 }
19 }
web.xml配置:
<!-- 浏览器访问:http://localhost:8080/project/my2 -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet内部名称。可以自定义 -->
<servlet-name>ServletLife</servlet-name>
<!-- servlet类的全名:包名+类名 -->
<servlet-class>com.bjsxt.servlet.ServletLife</servlet-class>
<!-- 正整数:数值越大,创建对象的优先级越低 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- sevlet内部名称。和servlet配置的内部名称保持一致!! -->
<servlet-name>ServletLife</servlet-name>
<!-- servlet的路径映射。访问servlet的名称 -->
<url-pattern>/life</url-pattern>
</servlet-mapping>
Service方法和doGet方法和doPost方法的区别
Service方法:
可以处理get/post方式的请求,如果servlet中有Service方法,会优先调用service方法对请求进行处理。
doGet方法:
处理get方式的请求
doPost方法:
处理post方式的请求
注意:
如果在覆写的service方法中调用了父类的service方法(super.service(arg0, arg1)),则service方法处理完后,会再次根据请求方式响应的doGet和doPost方法执行。所以,一般情况下我们是不在覆写的service中调用父类的service方法的,避免出现405错误。
Servlet的常见错误
404错误:资源未找到
原因一:在请求地址中的servlet的别名书写错误。
原因二:虚拟项目名称拼写错误
500错误:内部服务器错误
错误一:
java.lang.ClassNotFoundException: com.bjsxt.servlet.ServletMothod
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:
因为service方法体的代码执行错误导致
解决:根据错误提示对service方法体中的代码进行错误更改。
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service方法进行请求处理,并且不要再service方法中调用父类的service。
Servlet1-Servlet介绍
原文:https://www.cnblogs.com/sunny-sml/p/12513345.html