一、Servlet定义
Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应。下有GenericServlet(抽象 类)、HttpServlet子类。下面主要根据HttpServlet(HTTP协议有关的抽象类)进行学习。
二、HttpServlet的编码步骤
1、创建一个Dynimac Web Project项目
2、写一个类继承自HttpServlet并覆盖doGet和doPost方法,然后在doGet中编写
public void doGet(HttpServletRequest request, HttpServletResponse response)
request:代表着请求对象,该对象中有HTTP协议的请求部分的所有内容(获取客户端发送过来的数据)。它的实现类由服 务器提供的,封装数据也是服务器来做的。
response:代表着响应对象,该对象中由我们写数据(HTTP协议的响应部分)进去(将数据发送给客户端)。它的实现类 也是由服务器提供的。
2、添加HttpServlet的映射
在WEB-INF目录下新建web.xml配置文件
<servlet>
<servlet-name>ServletDemo1</servlet-name> 此处名字可以随便
<servlet-class>com.example.servlet.ServletDemo1</servlet-class> 需要映射到的类
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name> 此处名字要与上面的名字保持一致
<url-pattern>/ServletDemo1</url-pattern> Servlet访问地址(可以随便),主意前面需要加“/”
</servlet-mapping>
3、将其部署到Tomcat上然后通过http://localhost:8080/ServletDemo1就可以访问
三、HttpServlet的生命周期
1、诞生:用户第一次访问时,由容器创建他的实例和构造方法的执行。
2、活着:一旦实例创建就驻留内存(单例)。每次用户的访问,容器都会调用service方法发出响应体,然后执行到doGet和 doPost方法;
3、死亡:应用被关闭(卸载)或者Tomcat关闭了
//用户第一次访问时,只执行一次
public ServletDemo(){}
//用户第一次访问时,执行一次。用于实例的创建
public void init() throws ServletException {}
//每次用户访问都执行
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{doGet(request, response);}
//调用一次。用于清理工作
public void destroy() {}
四、HttpServlet的线程安全
因为servlet是单例,在servlet中使用全局变量时当有多个客户端同时访问(购票系统)会出现数据错误,所以要在servlet中使用 局部变量
五、地址通配符
写法一:*.do结尾。必须以*开头比如*.do
写法二(比一优先级略高):以/开头,必须*结尾比如/api/*
六、Servlet的参数配置
1、在Servlet的配置文件中,可以使用一个或多个标签为servlet配置一些初始化参数。
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.example.servlet.ServletDemo1</servlet-class>
<init-param> 可以配置多个init-param
<param-name>name</param-name> 参数的名字
<param-value>value</param-value> 参数的值
</init-param>
</servlet>
2、参数的获取
在doGet方法中获取参数
ServletConfig config= getServletConfig();
String value = config.getInitParameter("name");
多个参数的获取
Enumeration e =config.getInitParameterNames(); //当前Servlet参数的名字
while(e.hasMoreElements()){
String paramName = (String)e.nextElement();
config.getInitParameter(paramName)); 参数值
}
七、ServletContext
1、每个应用只有一个ServletContext对象实例,是四大域中范围最大的域
2、ServletContext的生命周期
诞生:应用被加载时就有容器创建好
活着:应用不挂就一直活着
死亡:tomcat挂了就挂了
八、ServletContext配置全局参数
<context-param> 可以配置多个context-param
<param-name>name</param-name> 参数的名字
<param-value>value</param-value> 参数的值
</context-param>
单个全局参数的获取
ServletContext sc =getServletContext();
String s =sc.getInitParameter("name");
获取所有的参数
Enumeration<String> e = sc.getInitParameterNames();
while(e.hasMoreElements()){
StringcontextName = e.nextElement();
sc.getInitParameter(contextName);
}
九、ServletContext应用
1、实现转发(不会重新请求,重定向会请求两次服务器)
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/ServletContextDemo");//转发的地址。ServletContext得到的, 地址必须以"/"开头,该"/"就代表着当前应用的访问路径
rd.forward(request, response);//转发
2、读取文件
ServletContext sc = getServletContext();
String realPath = sc.getRealPath("/WEB-INF/classes/test.txt");// 文件存放的真实绝对路径
InputStream in = new FileInputStream(realPath);//构建文件的输入流
3、读取属性文件(properties)
properties中存 hello = hello
3.1类加载器读取:只能读取classes或者类路径中的任意资源。不适合读取特别大的资源
private void test() throws IOException {
ClassLoaderclassLoader = ServletContextDemo6.class.getClassLoader();
// URLurl = classLoader.getResource("b.properties");// classes下
URLurl = classLoader.getResource("com/example/resource/c.properties");// com.example.resource包下
FileInputStreaminputStream = new FileInputStream(url.getPath());
Properties properties = new Properties();
properties.load(inputStream);
或者
ClassLoaderclassLoader = ServletContextDemo6.class.getClassLoader();
// InputStream resourceAsStream = classLoader.getResourceAsStream("b.properties");
InputStream resourceAsStream = classLoader.getResourceAsStream("com/example/resource/c.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
}
3、2利用ResourceBundle读取:文件在classes类路径内,只能读取properties的文件
ResourceBundle rb = ResourceBundle.getBundle("b");
ResourceBundle rb = ResourceBundle.getBundle("com.example.resource.c");
rb.getString("hello");
3、3 利用ServletContext读取:可以读取应用中任何位置上的资源。使用限制:只能在web应用中用 a.properties webroot 目录
String path = getServletContext().getRealPath("/a.properties");
// String path = getServletContext().getRealPath("/WEB-INF/classes/b.properties");
String path = getServletContext().getRealPath("/WEB-INF/classes/com/example/resource/c.properties");
InputStream in = new FileInputStream(path);
Properties props = new Properties();
props.load(in);
props.getProperty("hello");