1. 学习Servlet。
1.1 如何开发一个Servlet程序
1.编写Java类,继承HttpServlet类
2.重写doGet和doPost方法
3.Servlet程序交给tomcat服务器运行
3,1 .class放入classes文件夹
3.2 配置web.xml配置文件
1.2 tomcat如何找到servlet程序
Tomcat启动时。首先加载webapps中的配置文件,通过xml配置文件,浏览器根据url-pattern找到servlet-name,再根据servlet-name找到servlet-class,根据servlet-class获得.class字节码,通过反射即可调用相关函数。
1.2.1 url-pattern(映射路径)
精确匹配:http://localhost:8080/url <url-pattern> /url </url-pattern>
模糊匹配:
http://localhost:8080/(任意路径) <url-pattern> /*</url-pattern>(/*和/是一个意思)
http://localhost:8080/url_first/(任意路径) <url-pattern> /url_first/*</url-pattern>
http://localhost:8080/(任意路径).(do/action/html) <url-pattern> *.(do/action/html)</url-pattern>
注意:
1.要么/开头,要么以*开头,/url_first/*.do不可以
2.精确匹配优先,长得最像优先被匹配
3.以后缀名结尾的模糊匹配优先级最低
1.3 Servlet的缺省路径
Servlet的缺省路径是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web引用的静态资源文件。
问题:URL输入http://localhost:8080/index.html时,tomcat如何读取文件。
1.到web文件夹下的web.xml中查找是否有匹配的url-pattern。
2.如果没有匹配的url-pattern,那么就交给DefaultSeevlet。
3.那么就去conf/web.xml中查找,如果找到该文件,则读取该文件内容。
4.如果找不到,则返回404
结论:先找动态资源,再找静态资源、
1.4 Servlet的生命周期
Servlet类对象什么时候创建,调用什么方法,什么时候销毁。
Servlet程序的生命周期是有tomcat服务器控制的。
1.先调用静态代码块(类加载过程中的的准备,解析,初始化,<cinit>环节中初始化。)
2.再调用构造函数(构造函数和init在创建对象时调用,即第一次访问servlet的时候创建servlet对象)
3.在调用init函数(创建完servlet对象时)
4.调用service函数(每次发出请求时都会调用)
5.destroy(停止服务器或者重新部署web应用时调用,销毁servlet对象。)
1.5 伪代码延时Servlet的生命周期
1.通过映射找到servlet-class的内容,即类全名的字符串 Try.Demo01
2.通过反射构造Demo01对象
2.1 得到字节码对象
Class clazz = Class.forName(“Try.Demo01”);
2.2 调用无参数的构造方法来构造对象
Object obj = Clazz.newInstance();
2.3 创建Demo01对象,并通过反射调用init(ServletConfig);(先无参再有参)
2.3.1得到方法对象
Method m = clazz.getDeclareMethod(“init”,ServletConfig.class);
2.3.2 调用方法
m.invoke(obj,config);
2.4 调用service方法
2.4.1 得到方法对象
Method m = clazz.getDeclareMethod(“service”,HttpServletRequest.class,HttpServletResponse.class);
2.4.2 调用该方法
m.invoke(obj,request,response);
2.5 调用destroy方法
2.5.1 得到方法对象
Method m = clazz.getDeclaredMethod(“destroy”,null);//arg1:函数名 arg2:参数类
2.5.2 调用方法
m.invoke(obj,destroy)//arg1:调用对象 arg2:参数
1.6 Servlet的自动加载
默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问servlet的时候比较慢。
改变Servlet创建对象的时机,提前到加载web引用的时候。
解决方法:在servlet的配置信息中,加一个<load-on-startup>即可。按道理来说实在web.xml里面配置,在IDEA中可以用注解解决。<servlet><load-on-startup> n </load-on-startup></servlet>。数值越大,优先级越低。
1.7 两种init(),有参与无参。
有参的init方法一定会被Tomcat服务器调用。
无参的init方法是给开发者用来覆盖的。
默认情况下,有参会调用无参的方法。一旦覆盖了父类的有参init且不用super,会导致无参的不会被调用。
1.8 servlet在Tomcat中是单例多线程的。
1.9 Servlet对象学习
HttpServletRequest 请求对象:获取请求信息
HttpServletResponse 响应对象:设置响应对象
ServletConfig servlet配置对象
创建时机:在创建完servlet之后,在调用init之前创建ServletConfig对象。
得到对象:直接从有参的init方法中来 (this.config = config)
ServletConfig config = this.getServletConfig();String value = config.getInitParameter(name);
ServletContext servlet的上下文对象(代表了整个web.xml)
创建市级:加载web应用时创建对象,且早于ServletConfig
得到对象:从ServletConfig对象中的getServletContext方法中得到
核心API:
java.lang.String getContextPath() --得到当前web应用的路径
java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
void removeAttribute(java.lang.String name)
RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
java.lang.String getRealPath(java.lang.String path) --得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path)
作用:
1.java.lang.String getContextPath()
response.sendRedirect(contextpath+"/testimgs.html");
获得当前webapp的名字,比如http://localhost:9090/test/demo01 /test就是context,因此可以作为重定向的url
2.java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
context中的数据相当于是web.xml。相当于是一个全局的,所有/test下的servlet应用(classes文件夹中的class)共享一个web.xml,因此说是全局的。
<context-param>无法通过注解实现,必须在web.xml中手动添加。
3.void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
void removeAttribute(java.lang.String name)
域对象:作用是用于保存数据,获取数据。可以再不同的动态资源之间共享数据。
举例而言:在不同servlet之间共享不同类型的数据。
域对象就是一个容器/中介。ServletContext就是一个域对象,本质是因为ServletContext是全局的,一个应用仅有一个,所有Servlet公用一个,因此可以实现这个效果。
保存数据:setAttribute 获取数据:getAttribute 删除数据:removeAttribute
预告:
HttpServletRequest ServletContext HttpSession PageContext 域对象
4.RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
转发的效果类似重定向,但是转发不会改变地址栏的url
1)转发
a)地址栏不会改变
b)转发只能转发到当前web应用内的资源
解释:(1:http://localhost:9090/test/demo01 2:http://localhost:9090/test_2/demo01_2)
test中不能通过转发到2,但是重定向可以。
c)可以在转发过程中,可以把数据保存到request域对象中
解释:本质上转发用的forward(request,reponse)的request和servlet里面的request是同一个,因此request所承载的数据是可以传递的。但是对于重定向而言,是响应一个302+location,直接跳转到另一个页面,request根本就是两个东西。
2)重定向
a)地址栏会改变,变成重定向到地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能再重定向的过程,把数据保存到request中。