一、Servlet概述
1、Servlet是SUN制定的一套开发动态Web页面的规范。它是JavaEE技术中的一种
2、Tomcat服务器实现了Servlet规范。XX容器:实现了什么技术的服务器就称之为什么容器。
二、如何编写一个Servlet:编写步骤
1、建立标准的JavaWeb应用的目录结构
FirstApp
WEB-INF
classes
lib
web.xml
2、进入WEB-INF/classes目录下,编写一个类
package com.itheima.servlet;
import javax.servlet.*;
import java.io.*;
public class HelloServlet extends GenericServlet{
public void service(ServletRequest req,
ServletResponse res)
throws ServletException,
java.io.IOException{
String data = "Hello World";
res.getOutputStream().write(data.getBytes());
}
}
3、编译该类。不要忘记设置classpath,把servlet-api.jar加进来
set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
javac -d . HelloServlet.java
4、映射Servlet。修改web.xml文件
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>fuck</servlet-name>
<servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fuck</servlet-name>
<url-pattern>/fuck</url-pattern>
</servlet-mapping>
</web-app>
5、部署当前web应用,拷贝到Tomcat\webapps目录下,并启动Tomcat
6、访问:http://localhost:8080/FirstApp/fuck
三、GenericServlet和HttpServlet抽象类
1、如果直接实现了Servlet接口或者继承GenericServlet,需要实现service方法。
2、如果是继承HttpServlet,不要覆盖service方法。
原因:在HttpServlet的service方法中,有标准的HTTP请求处理。会根据用户的请求方式,分发给doXXX方法。(模板方法设计模式)
而doXXX方法,给了一个错误的输出,且是protected类型的。
所以:在继承HttpServlet编写Servlet时,应该覆盖掉doXXX方法。
3、修改MyEclipse生成Servlet的模板
a、关闭MyEclipse
b、在MyEclipse的安装目录下搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar)
c、打开该jar包,templates目录下找Servlet.java的文件,该文件就是模板
d、修改前先 备份
细节:
1、同一个Servlet可以被映射到多个地址上
2、可以使用通配符*进行映射
有两种写法:
以"/"开头,以*结尾
以"*"开头
多个通配符匹配的原则:"/"开头的优先级高,找最匹配的。
3、如果某个Servlet的映射为"/",那么该Servlet就是缺省Servlet,它负责在web.xml没有对应的url请求时的处理。
四、Servlet的生命周期
Servlet对象在创建时会执行init方法,第一次被访问时。
destory方法会在释放对象时执行。
service方法:每一次请求都会调用该方法。
在web.xml中,注册Servlet时,如果配置了以下标签<load-on-startup>1</load-on-startup>(取值为一个正整数)
那么Tomcat在加载该应用时,就会完成对该Servlet的实例化和初始化。
出现的问题:线程安全
1、尽量使用局部变量;实在是必须使用实例变量时,做同步处理,尽量包含少的代码。
SingleThreadModel:实现该接口能解决资源竞争问题。具体处理办法,由服务器决定。
a、把代码做了同步处理
b、搞了一个对象池:Tomcat采取该方式
五、ServletConfig接口
代表某个Servlet的初始化参数。每个Servlet都有自己对应的ServletConfig对象。
getInitParameterNames() :获取所有的参数名称
getInitParameter(java.lang.String name) :获取指定参数的取值。
参数和取值对应<init-param>标签
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>com.itheima.servlet.ServletDemo5</servlet-class>
<init-param>
<param-name>xxx</param-name>
<param-value>yyy</param-value>
</init-param>
<init-param>
<param-name>aaa</param-name>
<param-value>bbb</param-value>
</init-param>
</servlet>
六、ServletContext接口
1、相当重要。代表当前JavaWeb应用。每一个JavaWeb应用都有自己的ServletContext对象。
2、是一个域对象。(Map<String,Object>)可以通过以下方法存取该域
Object getAttribute(String name)
void setAttribute(String name,Object obj)
void removeAttribute(String name)
3、可以读取当前应用的全局参数
web.xml
<web-app>
<context-param>
<!-- 全局参数配置 -->
<param-name>encoding</param-name>
<param-value>ISO-8859-1</param-value>
</context-param>
</web-app>
4、getRealPath(String path)
获取当前JavaWeb应用中的任何资源。path必须以/开头,代表当前应用。
5、实现请求转发
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo6");
rd.forward(request, response);//转发
a、转发前,会清空response的缓存。因此,转发前所有的response输出都无效。
b、转发后,所有的输出也无效。
注:转发前不要清空response对象的缓存。
只有目标资源的输出才会显示。
七、读取配置文件的三种方式
xml、properties
1、ServletContext.getRealPath(String path)
可以读取当前应用中的任何资源。
2、ResourceBundle读取*.properties的文件。
只能读取类路径下的properties的配置文件。
3、类加载器加载配置文件
只能读取类路径下的所有的资源文件。 |
|