1概念
1.1特点“
1)servlet是一个普通的java类,继承了HttpServlet
2)其实实现了Servlet接口的java类,才是一个Servlet类
3)servlet程序需要交给Tomcat服务器运行!
2.servlet运行过程
浏览器
2.1步骤
前提:Tomcat服务器启动时会把每个网站的web.xml文件加载进内存
1)在浏览器输入http://localhost:8080/day09/hello
2)截取URL的字符串,得到需要访问的资源名称:、/hello
3)在day09网站下的we.xml信息中搜索是否存在/hello匹配的url-pattern
4)匹配对应的url-pattern之后,取出当前映射信息中的servlet-name的名称,然后在web.xml信息
中搜索是否存在一个相同名称的servlet-name的servlet配置信息
5.)找到对应的servlet配置信息之后,取出当前配置信息的servlet-class的内容
字符串 包名+类名 dxq.HelloServlet
6)创建HelloServlet对象,然后调用HelloServlet类中的方法
7)Servlet就把内容返回给浏览呢器用户
3.映射路径
<servlet>
<servlet-name>helloSetvlet</servlet-name>
<servlet-class>dxq.ServletOne.helloSetvlet</servlet-class>
</servlet>
//servlet映射信息
<servlet-mapping>
servlet内部名称和servlet配置内容保持一致
<servlet-name>helloSetvlet</servlet-name>
servlet的映射路径,访问servlet的名称
<url-pattern>/hello</url-pattern>
</servlet-mapping>
精确匹配: /hello http://localhost/day09/hello
模糊匹配 /* http://localhost/day09/任意路径
/dxq/* http://localhost/day09/dxq/任意路径
*.后缀名 http://localhost/day09/任意路径.后缀名
(*.action
*.do
)
注意
1)要以 / 开头或者 * 开头
错误:/dxq/*.html
2)当多个url-pattern同时匹配时的情况下
2.1精确匹配优先(长得像的那个优先级被匹配)
2.2以后缀名结尾的url-pattern的优先级最低的
4.什么是缺省路径
在Tomcat服务器内部配置了一个缺省路径 <url-pattern>/</url-pattern>,这个缺省路径在Tomcat服务器内部
被一个缺省的servlet(DefaultServlet)匹配。缺省的这个servlet的作用是专门用于处理所有网站中的静态网页
浏览器:http://localhost:8080/day09/hello.html
一个路径在Tomcat服务器的执行过程
1)搜索day09下面的web.xml文件信息,搜索是否存在匹配的 <url-pattern>/hello</url-pattern>,
2)匹配到对应的url-pattern,执行对应servlet程序
3)如果没有匹配的url-pattern,就把这个请求交给Tomcat服务器的DefualtServlet处理
4)DefualtServle会在day09的根目录下搜索是否存在一个名字叫hello.html的文件
5)如果找到此文件,那么DefualtServle读取该文件的内容返回给用户
6)如果没有找到此文件,那么就返回给用户一个404状态码+404错误页面
结论:先找动态网页再找静态网页
5.servlet的生命周期*
5.1概念
研究servlet的生命周期。就是研究servlet这个在什么时候创建对象,在什么时候调用什么方法,在什么时候销毁对象
servlet室友Tomcat服务器执行的生命周期
5.2servlet的四个重要的生命周期方法
构造方法:创建servlet对象时调用,只调用一次证明了servlet是单例的
init方法:创建完对象之后调用,只调用1次,该方法用于初始化对象
service。方法,在每次请求时被调用,调用N次,该方法入口方法,我们的逻辑代码在这里被调用
destroy方法:在service对象销毁之后调用,只调用1次,重新部署网站或者停止服务器,service对象
就会销毁。
5.3用伪代码演示Tomcat服务器如何调用四个方法
字符串:dxq.HelloServlet
1)创建HelloServlet的对象
/*万物皆对象*
*前提,加载class文件
*类的相关信息: Class
*构造方法的信息:Contructor
*属性: Filed
*普通方法 Method
通过以上四个类获取类上的信息,甚至构造类的对象,调用类的对象方法,这就是反射
1.1得到HelloServlet的class对象
Class clazz=Class.forName("dxq.HelloServlet");
1.2通过class对象调用构造方法
Object obj=clazz.newInstance();调用无参的构造函数 -1)构造方法被调用
2)通过反射,调用init方法
2.1得到init方法对象
Method m=clazz.getDeclaraeMethod("init",ServletConfig.class);
2.2调用方法
m.invoke(obj.congig); -2)init方法被调用
3)通过反射,调用service方法
3.1得到service方法对象
Method m=;
clazz.getDeclareMethod("service",HttpServletRequset.class,HttpServetResponse.class);
3.2调用方法
m.invoke(obj,request,response); -3)service方法被调用
4)通过反射,调用destroy方法
4.1得到destroy方法对象
Method m=clazz.getDeclareMethod("destroy",null);
4.2调用方法
m.invoke(obj null); -4)destroy方法被调用
6.servlet的线程并发问题
6.1引入:
servlet在Tomcat服务器中,是单实例多线程的
6.2开发线程安全的servlet建议
1)尽量不要去使用成员变量,或者静态成员变量。
2)必须要使用成员变量,那么给使用了成员变量的代码块加锁,加锁的代码块的范围
尽量缩小,因为有可能影响程序并发的效率。
synchronize(类名.class)
7.servlet的自动加载机制
7.1引入
默认情况servlet对象是在第一次访问的时候创建的,如果在这个servlet的构造方法或者init方执行比较多的逻辑,
那么第一次访问servlet的用户体验就不好了
那么能不能改变创建servlet的机制》可以,可以让servlet在服务器启动的时候自动加载
7.2自动加载的配置
<servlet>
<servlet-name>helloSetvlet</servlet-name>
<servlet-class>dxq.ServletOne.helloSetvlet</servlet-class>
<load-on-startup>1</load-on-startup>//这个配置可以让servlet在Tomcat服务器启动的时候自动创建servlet对象
</servlet>
注意:load-on-start中的整数越大,创建的优先级越低。
8 servlet的init方法
8.1俩个init方法的作用
init(ServletConfig)这个有参数的init方法作用就是Servlet的其中一个重要的生命周期方法,这个方法
一定会被Tomcat服务器调用。
init()这个无参的init方法作用就是为了提供给开发者方便去覆盖,覆盖这个方法,可以在此方法编写初始化的逻辑,
这个方法才是真的给开发者做初始逻辑的方法
小结:
servlet对象开发中涉及的对象
HttpservletRequest:对象:请求对象
HttpServletResponse对象:响应对象
ServletConfig对象 servlet配置对象
ServletContext对象:servlet的上下文对象
9. ServletConfig对象
9.1引入:
ServletConfig是配置对象,主要是把servlet的初始化参数封装到这个对象中。
一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息
9.2配置初始化值
<servlet>
<servlet-name>helloSetvlet</servlet-name>
<servlet-class>dxq.ServletOne.helloSetvlet</servlet-class>
<init-param>
<param-name>path</param-name>
<param-value>e:/bbb.txt</param-value>
. </init-param>
</servlet>
读取到servlet的初始化
path=this,getServletConfig().getInitParameter("path");根据参数名获取参数值
this,getServletConfig().getInitParameterNames("path");获取所有参数名称
10.ServletContext对象
10.1引入
ServletContext对象叫servlet的上下文对象,一个网站只会创建一个ServletContext对象,代表的是这整个网站的环境信息
10.2获取ServletContext对象
this.getServletConfig().getServetContext();通过ServletConfig对象获取到ServletContext对象!
ServletContext:对象:启动时候就创建
ServletConfig:对象 调用init方法之前创建的,在ServletContext对象创建之前
10.3ServletContext的5大作用
1)获取web的上下文路径
java.lang.StringgetContextPath();
web上下文路径就是项目在Tomcat服务器运行的路径,注意不是开发目录的项目名称
作用:
请求重定向
response.sendRedirect(context.getContextPath()+"/hello.html");
可以让获取文件的路径更加灵活
2)获取全局参数
java.langString getInitParameter(name);
java.util.Enumeration getInitParameterNames();
写在<servlet>外面
<context-param>
<param-name>AAA</param-name>
<param-value>AAA,value</param-value>
</context-param>
context=this.getServletContext();
context.getInitParameter("AAA");
Enumeration<String> enums=context.getInitParameterNames();
while(enums.hasMoreElements()){
String paramName=enums.nextElements();
parpamValue=context.getInitParameter(paramName);
}
3)和域对象相关的
void setAttribute(String name,Object object);
Object getAttribute(String name);
void removeAttribute(String name);
什么是域对象
域对象在不同来共享数据的,保存数据,获取数据。
ServletContext
HttpServletRequest
HttpSession
4)请求转发
RequestDispatcher getRequestDispatcher(String path);
在servlet跳转页面
请求重定向:(浏览器行为
1)地址栏会发生改变,变成重定向到的地址
2)可以跳转到项目内的资源
3)可以跳转当前的项目的资源,也可以跳转到其他项目的资源
4)浏览器向服务器发出俩次请求,那么就不能使用请求来作为域对象来共享数据
请求转发,(服务器行为
1)地址栏不会改变
2)可以跳转到项目内的资源
3)只能转发到当前项目的一个资源
4)浏览器向服务器发出一次请求,那么可以使用请求作为域对象共享数据
request.getServletContext().getRequestDispatcher().fprward(request,response);
request..getRequestDispatcher().fprward(request,response);//简写
5)读取web项目的资源文件
String getRealPath(Stringpath);//获取资源文件的真是路径
this.getServletContext().getRealPath("/WEB-INF/classes/news.properties");//服务器行为tomcat 运行下不存在src
InputStream getResourceAsStream(Stringpath);获取资源文件的输入流
this.getServletContext().getResourceAsStream("/WEB-INF/classes/news.properties");
URL getResource(String path); 读取资源文件
this.getServletContext().getResource("/WEB-INF/classes/news.properties");
path=url.getPath();
相对路径:
当前路径相对于java命令运行的目录
注意:Myeslipse工具每次运行java程序,都会把java命令运行的目录指向到当前的根目录下。
在web项目中java命令运行的目录就是在Tomcat的bin目录,再web项目里面不能使用相对路径
复习:
如何读取Properties文件?
FileInputStream in=new FileInputStream("./src/new.properties")
Properties prop=new Properties ()//使用Properties对象
prop.load(in);//使用load加载properties文件
prop.getProperty(name);//获取内容
路径问题
服务器行为 / 代表当前项目的根目录开始
浏览器行为 / 代表当前站点的根目录开始(webapps)
有可能会路径的地方
转发
request..getRequestDispatcher("/hello.html").fprward(request,response);
重定向
response.sendRedirect("/day09/heelo.html");
HTML超链接
response.getWruter().write("<a href="/day09/heelo.html"></a>)
HTML页面的表单提交
response.getWruter().write("<form ="/day09/heelo.html"></a>)
总结
servlet编程:
1)servlet编写
2)servlet1的映射路径(精确匹配,模糊匹配,缺省路径)
3)servlet的生命周期(构造方法 init方法 service方法 destory方法)
4)多线程并发问题(单例实例多线程,servlet使用成员变量,同步锁解决)
5)自动加载(load-on-startup)+俩个init方法的区别
6)ServletConfig对象,读取初始化参数
7)ServletContext对象
5大作用
1)读取web上下文路径(1)
2)读取全局数据(2)
3)作为域对象使用(3)
4)可以跳转页面(1)
5)读取web资源文件(3)