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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
- Servlet的配置
1.web.xml配置Servlet
:用来定义Servlet的名字
:用来定义Servlet类的位置,包括包名和类名
:用来定义Servlet的映射路径,它有两个属性表示要映射的Servlet的名字,表示要映射的路径,要映射的路径前要加"/",表示相对于Tomcat的位置
<servlet><servlet-name>TextServlet01</servlet-name><servlet-class>com.tyut.TextServlet01</servlet-class>
</servlet><servlet-mapping><servlet-name>TextServlet01</servlet-name><url-pattern>/servlet/TextServlet01</url-pattern>
</servlet-mapping>
2.@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 {@Overrideprotected 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 + "<br>");//方法二:获取ServletConfig的内容Enumeration<String> initParameterNames = sc.getInitParameterNames();while (initParameterNames.hasMoreElements()) {String param = initParameterNames.nextElement();String initParameter = sc.getInitParameter(param);out.write(param + ":" + initParameter + "<br/>");}}@Overrideprotected 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应用的初始化参数
<!--配置web应用程序的初始化参数--><context-param><param-name>school</param-name><param-value>tyut</param-value></context-param><context-param><param-name>address</param-name><param-value>taiyuan</param-value></context-param>
2.通过ServletContext方法实现对web应用程序初始化参数的调用
方法声明 | 功能描述 |
---|---|
String getInitParameter(String name) | 根据初始化参数名返回对应的初始化参数值 |
Enumeration getInitParameterNames() | 返回一个Enumeration对象,其中包含了所有的初始化参数名 |
@WebServlet("/TextServlet04")
public class TextServlet04 extends HttpServlet {@Overrideprotected 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 + "<br/>" + "address=" + address + "<br/>");//方法二:Enumeration<String> names = sc.getInitParameterNames();while (names.hasMoreElements()) {String s = names.nextElement();out.write(s + "=" + sc.getInitParameter(s) +"<br/>");}}
- 实现多个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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/* 2.实现Servlet之间的数据共享 */List<String> cart = new ArrayList<String>();cart.add("apple");cart.add("orange");sc.setAttribute("cart", cart);sc.setAttribute("food", "beef");}
}@WebServlet("/TextServlet05")
public class TextServlet05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();ServletContext sc = getServletContext();List<String> cart = (List<String>) 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 {@Overrideprotected 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"));}
}