Servlet运行过程:
1、配置Preferences/MyEclipse Enterprise Workbench/Servers/Tomcat
/Tomcat6.x,注意勾选Enable
2、deploy MyEclipse J2ee project to Service
3、Start Tomcat 6.x
4、在网页中输入http://localhost/项目名/url-pattern(web.xml配置的引用名)
如:http://localhost/day4/servlet/Demo1
Web.xml配置
1、参数
<context-param>
<param-name>data0</param-name>
<param-value>aaaaaaa</param-value>
</context-param>
<servlet>
2、初始化参数
<init-param>
<param-name>data1</param-name>
<param-value>累啊</param-value>
</init-param>
<init-param>
<param-name>data2</param-name>
<param-value>好累啊</param-value>
</init-param>
<init-param>
<param-name>data3</param-name>
<param-value>非常累啊</param-value>
</init-param>
<load-on-startup>1</load-on-startup>//设置服务器启动时该Servlet第几个加载
</servlet>
Demo1.java
在doGet方法中加入代码
1、关于ServletConfig
ServletConfig config = this.getServletConfig();
String data0 = config.getInitParameter("data0");
System.out.println(data0);
Enumeration en = config.getInitParameterNames();
while(en.hasMoreElements()){
String str = (String)en.nextElement();
System.out.println(str+config.getInitParameter(str));
}
运行Servlet后,控制台输出
null
data2好累啊
data3非常累啊
data1累啊
说明config不能获取<servlet>外面的参数
2、关于ServletContext
ServletContext context =this.getServletContext();
String data0 = context.getInitParameter("data0");
System.out.println(data0);
String data1 = (String)context.getAttribute("data1");
System.out.println(data1);
运行Servlet后,控制台输出
aaaaaaa
Null
说明ServletContext可以用获取<context-param>中的值而不能获取<init-param>的值
所以获取<init-param>的值用ServletConfig,获取<context-param>用ServletContext
关于response响应
response.getOutputStream().write("怎么回事呢".getBytes());
返回响应到浏览器
关于Request请求转移
Dispatcher pathcher =request.getRequestDispatcher("/12.html");
pathcher.forward(request, response);
<servlet-mapping>虚拟路径可以配置多个
例如:
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/servlet/Demo1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/aaa</url-pattern>
</servlet-mapping>
则可以通过http://localhost/day4/aaa访问
如果<servlet-mapping>虚拟路径同时配置如下的一些映射关系:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
//利用ServletContext读取资源文件
ServletContext context = this.getServletContext();
//该路径相对于Tomcat中web应用day4文件夹的路径
InputStream in = context.getResourceAsStream("/1.properties");
Properties p = new Properties();
p.load(in);
System.out.println(p.getProperty("username"));
//利用TomCat 加载web应用classes中类的加载器获取资源文件
1、利用类加载器获取路径,再用FileInputStream加载,这样就可以避免出现类加载器已有缓存中的资源文件
ClassLoader loader = this.getClass().getClassLoader();
//该路径相对于WEB_INF/classes
URL urlPath = loader.getResource("../../1.properties");
String path = urlPath.getPath();
FileInputStream in = new FileInputStream(path);
2、直接用类加载器加载资源文件,该方法不能实时更新资源文件
ClassLoader loader = this.getClass().getClassLoader();
InputStream in
= loader.getResourceAsStream("../../1.properties");
Properties p = new Properties();