<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>gz.itcast.a_servlet.FirstServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
url-pattern | 浏览器输入 |
---|---|
/first | http://localhost:8080/day10/first |
/itcast/demo1 | http://localhost:8080/day10/itcast/demo1 |
url-pattern | 浏览器输入 |
---|---|
/* | http://localhost:8080/day10/任意路径 |
/itcast/* | http://localhost:8080/day10/itcast/任意路径 |
*.后缀名 | http://localhost:8080/day10/任意路径.do |
servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。
servlet的生命周期:servlet对象什么时候创建,什么时候调用方法,什么时候销毁
Servlet程序的生命周期由tomcat服务器控制的!!!!
servlet的四个生命周期
Tomtcat内部代码运行:
通过映射找到到servlet-class的内容,字符串:gz.csx.a_servlet.FirstServlet
通过反射构造FirstServlet对象
创建ServletConfig对象,通过反射调用init方法
创建request,response对象,通过反射调用service方法
当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或> init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。
改变servlet创建对象的时机: 提前到加载web应用的时候!!! 在servlet的配置信息中,加上一个<load-on-startup>即可!!
在GenericServlet中提供了一个无参数的init方法!!!
有参数的init:该方法是Servlet的四个生命周期方法中的一个,该方法一定会被服务器调用。在该方法中会调用无参数的init方法。
无参数的init:该方法是Sun公司设计出来方便开发者进行重写,在该方法中实现对servlet对象的初始化工作,这个方法会被有参的init方法调用!
因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。
解决办法
Servlet学习:
ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/b.txt</param-value>
</init-param>
</servlet>
注意: servlet的参数只能由当前的这个sevlet获取!!!!
ServletContext对象,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。
我们设计:
创建ServletConfig对象
public void init( ServletConfig config,ServletContext context ){多了一个参数
得到ServletConfig对象
得到ServletContext对象;
}
sun公司设计
创建ServletContext对象ServletContext context = new ServletContext()
创建ServletConfig对象 ServetConfig config = new ServletConfig(); config.setServletContxt(context);
class ServletConfig{
ServletContext context;
public ServletContext getServletContxt(){
return contxt;
}
}
public void init( ServletConfig config ){
得到ServletConfig对象
从ServletConfig对象中得到ServletContext对象
SerlvetContext context = config.getServletContext();
}
ServletContext对象的核心API(作用)
java.lang.String getContextPath()
java.lang.StringgetInitParameter(java.lang.Stringname) java.util.Enumeration getInitParameterNames()
void setAttribute(java.lang.String name, java.lang.Object object) java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
RequestDispatcher getRequestDispatcher(java.lang.String path)
java.lang.String getRealPath(java.lang.String path)
java.io.InputStream getResourceAsStream(java.lang.String path)
得到web应用路径
得到web应用的初始化参数(全局)
java.lang.String getInitParameter(java.lang.String name) java.util.Enumeration getInitParameterNames()
web应用参数可以让当前web应用的所有servlet获取!!!
域对象有关方法
域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。 实例
//ServletFirst
response.getOutputStream().write("nihao".getBytes());
response.sendRedirect(request.getContextPath()+"/Servlet2?name=csx");
//Servlet2
String str=request.getParameter("name");
System.out.println("str:"+str);
response.getOutputStream().write(str.getBytes());
方案1: 可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。
方案2: 可以使用域对象共享数据,好处:可以共享任何类型的数据!!!!!
ServletContext就是一个域对象!!!!
保存数据:void setAttribute(java.lang.String name, java.lang.Object object)
获取数据: java.lang.Object getAttribute(java.lang.String name)
删除数据: void removeAttribute(java.lang.String name)
ServletContext域对象:作用范围在整个web应用中有效!!!
所以域对象
HttpServletRequet 域对象
ServletContext域对象
HttpSession 域对象
PageContext域对象
转发(请求一次,服务器行为,客户感知不到)
重定向(至少两次请求,客户端行为,客户可感知)
结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!