Servlet1-Servlet介绍
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类并继承HttpServlet2、覆写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)
/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优先级最低!!!
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的错误页面。
结论: 先找动态资源,再找静态资源!!!!
init方法:在创建完servlet对象后调用。只调用1次。用于初始化对象。
service方法:在每次请求servlet时调用。调用n次。入口方法,逻辑代码在这里被调用。
destroy方法:servlet对象销毁时调用。只调用1次。tomcat服务器停止或web应用重新部署时调用。
2、如果Servlet在web.xml中配置了load-on-startup,生命周期为:从服务器启动到服务器关闭
<!-- 自动加载机制 -->
<!-- 正整数:数值越大,创建对象的优先级越低 -->
<load-on-startup>1</load-on-startup>
可以处理get/post方式的请求,如果servlet中有Service方法,会优先调用service方法对请求进行处理。
doGet方法:
处理get方式的请求
doPost方法:
处理post方式的请求
注意:
原因一:在请求地址中的servlet的别名书写错误。
原因二:虚拟项目名称拼写错误
500错误:内部服务器错误
错误一:
java.lang.ClassNotFoundException: com.su.servlet.ServletMothod
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:
因为service方法体的代码执行错误导致
解决:根据错误提示对service方法体中的代码进行错误更改。
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service方法进行请求处理,并且不要再service方法中调用父类的service。
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被销毁时执行,也就服务器关闭时。
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.su.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.su.servlet.ServletMothod
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:
因为service方法体的代码执行错误导致
解决:根据错误提示对service方法体中的代码进行错误更改。
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service方法进行请求处理,并且不要再service方法中调用父类的service。