Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)
Servlet技术(Servlet,ServletConfig,ServletContext)
1.Servlet的概述
Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写。与Java程序的区别是,Servlet 对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器(Tomcat)的支持。
- Servlet接口的方法(javax.servlet.Servlet)
Servlet,ServletConfig,ServletContext --> GenericServlet --> HttpServlet(实现Http请求) --> 自定义Servlet
方法声明 功能描述 void init(ServletConfig config) Servlet实例化后,Servlet容器调用该方法完成初始化工作 void service (ServletRequest req,ServletResponse resp) 负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时,就会调用此方法。在service()方法中,可以通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息 void destroy() 负责释放Servlet对象占用的资源。当服务器关闭或者Servlet对象被移除时,Servlet对象会被销毁,容器会调用此方法 ServletConfig getServletConfig() 用于获取Servlet对象的配置信息,返回Servlet的ServletConfig对象 String getServletInfo() 返回一个字符串,其中包含关于Servlet的信息,例如,作者、版本和版权等信息 - 继承HttpServlet的自定义Servlet
@WebServlet("/TextServlet01") public class TextServlet01 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }- Servlet的配置
1.web.xml配置Servlet
:用来定义Servlet的名字
:用来定义Servlet类的位置,包括包名和类名
:用来定义Servlet的映射路径,它有两个属性表示要映射的Servlet的名字,表示要映射的路径,要映射的路径前要加"/",表示相对于Tomcat的位置
TextServlet01 com.tyut.TextServlet01 TextServlet01 /servlet/TextServlet012.@WebServlet配置Servlet
@WebServlet 注解用于代替web.xml文件中的等标签,该注解将会在项目部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。可以标注在任意一个继承HttpServlet的类上
属性声明 功能描述 String name 指定Servlet的name属性,等价于。如果没有显式指定,则该 Servlet的取值即为类的全限定名。 String[] value 该属性等价于urlPatterns属性。urlPatterns和value属性不能同时使用,同时存在是忽略value的值。 String[] urlPatterns 指定一组Servlet的URL匹配模式。等价于标签。 InitParam[] 指定一组Servlet初始化参数,等价于标签。 @WebServlet(name = "TextServlet01", urlPatterns = {"/TextServlet01", "/textServlet01"})- Servlet的生命周期
当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有,直接使用该Servlet对象;如果没有,就创建Servlet实例对象,然后通过调用init()方法完成Servlet的初始化。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。之后访问Servlet,每一个请求作为一个线程,Servlet对象不会再次创建
/** * Servlet的生命周期 */ @WebServlet(name = "TextServlet02", urlPatterns = "/textServlet02") public class TextServlet02 extends GenericServlet { public void init(ServletConfig servletConfig) { System.out.println("Servlet is called"); } public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hello Servlet!!!"); } public void destroy() { System.out.println("Servlet is destroyed"); } }2.ServletConfig接口
- ServletConfig基本概述(每个Servlet的配置信息)
在Servlet运行期间,经常需要一些配置信息,可以在@WebServlet注解的属性中配置或者在web.xml中配置。
当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。
- ServletConfig基本方法
方法声明 功能描述 String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值 Enumeration getInitParameterNames() 返回一个Enumeration对象,其中包含了所有的初始化参数名 ServletContext getServletContext() 返回一个代表当前Web应用的ServletContext对象 String getServletName() 返回Servlet的名字 1.通过在每个Servlet中的@WebServlet注解的initParams属性中,通过@WebInitParam(name=“”,value=“”)注解设置Servlet的初始化参数
2.通过ServletConfig方法调用每个Servlet的初始化参数
/** * ServletConfig方法练习 */ @WebServlet(name = "ServletConfigText",urlPatterns = "/textServlet03", initParams = {@WebInitParam(name = "encoding", value = "UTF-8"), @WebInitParam(name = "name", value = "tyut")}) public class TextServlet03 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); ServletConfig sc = getServletConfig(); //方法一:获取ServletConfig的内容 String name = sc.getInitParameter("name"); String encoding = sc.getInitParameter("encoding"); out.write("name=" + name + " encoding=" + encoding + "
"); //方法二:获取ServletConfig的内容 Enumeration initParameterNames = sc.getInitParameterNames(); while (initParameterNames.hasMoreElements()) { String param = initParameterNames.nextElement(); String initParameter = sc.getInitParameter(param); out.write(param + ":" + initParameter + "
"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }3.ServletContext接口
- ServletContext基本概述
当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用。ServletContext对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。
- 获取web应用初始化参数
1.通过再web.xml中配置web应用的初始化参数
school tyut address taiyuan2.通过ServletContext方法实现对web应用程序初始化参数的调用
方法声明 功能描述 String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值 Enumeration getInitParameterNames() 返回一个Enumeration对象,其中包含了所有的初始化参数名 @WebServlet("/TextServlet04") public class TextServlet04 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); ServletContext sc = getServletContext(); /* 1.获取web应用程序初始化参数 */ //方法一: String school = sc.getInitParameter("school"); String address = sc.getInitParameter("address"); out.write("school=" + school + "
" + "address=" + address + "
"); //方法二: Enumeration names = sc.getInitParameterNames(); while (names.hasMoreElements()) { String s = names.nextElement(); out.write(s + "=" + sc.getInitParameter(s) +"
"); } }- 实现多个Servlet数据共享(域对象)
一个Web应用中的所有Servlet共享同一个ServletContext对象,ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。
方法声明 功能描述 Enumeration getAttributeNames() 获取域对象名字的Enumeration对象 Object getAttribute(String name) 根据域对象的名字获取域对象的值 void removeAttribute(String name) 根据域对象的名字删除域对象 void setAttribute(String name, Object value) 添加域对象 @WebServlet("/TextServlet04") public class TextServlet04 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* 2.实现Servlet之间的数据共享 */ List cart = new ArrayList(); cart.add("apple"); cart.add("orange"); sc.setAttribute("cart", cart); sc.setAttribute("food", "beef"); } } @WebServlet("/TextServlet05") public class TextServlet05 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); ServletContext sc = getServletContext(); List cart = (List) sc.getAttribute("cart"); System.out.println(cart); sc.removeAttribute("food"); String food = (String) sc.getAttribute("food"); System.out.println(food); } }- 读取web应用下的资源文件
ServletContext接口定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径
方法说明 功能描述 Set getResourcePaths(String path) 返回一个Set集合,集合中包含资源目录中子目录和文件的路径名称。参数path必须以正斜线(/)开始,指定匹配资源的部分路径 String getRealPath(String path) 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始,“/”表示当前Web应用的根目录,如果Servlet容器不能将虚拟路径转换为文件系统的真实路径,则返回null URL getResource(String path) 返回映射到某个资源文件的URL对象。参数path必须以正斜线(/)开始,“/”表示当前Web应用的根目录 InputStream getResourceAsStream(String path) 返回映射到某个资源文件的InputStream输入流对象。参数path传递规则和getResource()方法完全一致 /** * ServletContext实现下载web应用下的资源文件 */ @WebServlet("/TextServlet06") public class TextServlet06 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //获取资源的绝对路径 ServletContext sc = getServletContext(); String path = sc.getRealPath("/WEB-INF/tyut.properties"); System.out.println(path); //获得文件的流对象 InputStream in = sc.getResourceAsStream("/WEB-INF/tyut.properties"); Properties pros = new Properties(); pros.load(in); System.out.println(pros.getProperty("name")); System.out.println(pros.getProperty("hobby")); } }
- 读取web应用下的资源文件
- 实现多个Servlet数据共享(域对象)
- 获取web应用初始化参数
- ServletContext基本概述
- ServletConfig基本方法
- ServletConfig基本概述(每个Servlet的配置信息)
- Servlet的生命周期
- Servlet的配置
- 继承HttpServlet的自定义Servlet

