源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java Web编程之Servlet技术详解

  • 时间:2021-08-11 03:28 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java Web编程之Servlet技术详解
Java Web编程之Servlet技术,知多少? [b]1、Servlet基础[/b]   针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax.servlet.http,Servlet就是一种实现了Servlet接口的类,它由Web容器(Tomcat/Jetty等)负责调用并创建,用于接收和响应用户请求。Servlet接口中定义了5个抽象方法: [img]http://files.jb51.net/file_images/article/201605/20165590834376.jpg?2016459841[/img] Servlet顶层类结构如下所示: [img]http://files.jb51.net/file_images/article/201605/20165590909476.jpg?2016459917[/img] [b]2、第一个Servlet程序[/b] 新建一个Java Web工程,然后新建Hello类,Hello.java源码如下:
package zzz;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {
 @Override
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
  // 设置响应消息编码
  response.setContentType("text/html;charset=utf-8");
  PrintWriter out = response.getWriter();
  out.println("Hello World");
 }
 
 @Override
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
  this.doGet(request, response);
 }
}


配置文件web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <display-name>zzz</display-name>

 <servlet> <!-- 注册Servlet -->
  <servlet-name>Hello</servlet-name> <!-- 指定Servlet名称 -->
  <servlet-class>zzz.Hello</servlet-class> <!-- 指定Servlet完整类名 -->
 </servlet>
 <servlet-mapping> <!-- 映射Servlet对外访问路径 -->
  <servlet-name>Hello</servlet-name> <!-- 指定Servlet名称 -->
  <url-pattern>/hello</url-pattern> <!-- 指定访问Servlet的虚拟路径 -->
 </servlet-mapping>
</web-app>


启动运行浏览器显示如下: [img]http://files.jb51.net/file_images/article/201605/20165590944660.jpg?2016459952[/img] [b]3、Servlet生命周期[/b] [b][img]http://files.jb51.net/file_images/article/201605/20165591154037.jpg?2016459122[/img] [/b] Servlet生命周期大致分为3个阶段,[b]初始化阶段、运行阶段[/b][b]销毁阶段[/b]。以下是各个阶段详细说明: [b]初始化阶段:[/b]客户端向Servlet容器发出请求访问Servlet时,容器首先解析请求,查看内存中是否有该Servlet对象,如果有直接使用;否则创建该Servlet对象,然后调用init()方法,注意,Servlet整个声明周期中,init()只会调用一次 [b]运行阶段:[/b]这个是Servlet最重要的阶段,此阶段容器会构造一个ServletRequest和ServletResponse对象作为参数传递到Servlet的service()方法中。对于Servlet的每一次访问,Servlet容器都会调用一次service()方法,service()方法在Servlet整个生命周期中会被调用多次 [b]销毁阶段:[/b]当服务器关闭或者Web应用被移除出容器时,会进入到此阶段,此时会调用destroy()方法,整个生命周期中destroy()方法只会被调用一次   在客户端首次访问Servlet时,容器会创建该Servlet对象,但是有时希望Servlet对象在Tomcat启动时跟随启动,这怎么处理呢?此时,只需要在web.xml中使用<load-on-startup>元素即可,示例配置如下:
<servlet>
  <servlet-name>Hello</servlet-name>
  <servlet-class>zzz.Hello</servlet-class>
 <!-- 自动加载servlet程序 -->
 <load-on-startup>1</load-on-startup> 
 </servlet>
 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>
[b]4、ServletConfig和ServletContext [/b] [b]ServletConfig接口[/b]   Servlet运行期间,如果需要一些辅助信息,例如文件编码、使用Servlet的公司等,这些信息可以在web.xml中使用<init-param>元素进行配置,当Tomcat初始化一个Servlet时,会将该Servlet配置信息封装成一个ServletConfig对象通过init(ServletConfig config)传递到Servlet。ServletConfig定义了一系列获取配置信息的方法: [img]http://files.jb51.net/file_images/article/201605/20165591316622.jpg?20164591324[/img] 接下来以getInitParameter()为例,讲解该方法使用示例: web.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <display-name>zzz</display-name>

 <servlet>
  <servlet-name>Hello</servlet-name>
  <servlet-class>zzz.Hello</servlet-class>
  <init-param>
   <param-name>company</param-name>
   <param-value>dahua</param-value>
  </init-param>
 </servlet>
 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>
</web-app>
Hello.java文件如下:
package zzz;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {
 @Override
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
  // 设置响应消息编码
  response.setContentType("text/html;charset=utf-8");
  PrintWriter out = response.getWriter();
  
  ServletConfig config = this.getServletConfig();
  String param = config.getInitParameter("company");
  out.println("company: " + param);
 }
 
 @Override
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
  this.doGet(request, response);
 }
} 
[b]ServletContext接口 [/b]  当Servlet容器启动时,会为每一个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了该Web应用的所有信息,而且实现了多个Servlet对象间的数据共享。在web.xml中不仅可以配置Servlet的初始化信息,还可以配置整个Web应用的初始化信息,配置方式如下所示:
<context-param>
 <param-name>name</param-name>
 <param-value>luoxn28</param-value>
</context-param>
<context-param>
 <param-name>company</param-name>
 <param-value>dahua</param-value>
</context-param>
[b]注意:[/b]一个<context-param>元素里只能有一个<param-name>和<param-value>,上面的配置在web.xml中<web-app>下配置。Hello.java文件如下:
package zzz;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {
 @Override
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
  // 设置响应消息编码
  response.setContentType("text/html;charset=utf-8");
  PrintWriter out = response.getWriter();
  
  ServletContext context = this.getServletContext();
  Enumeration<String> paramNames = context.getInitParameterNames();
  while (paramNames.hasMoreElements()) {
   String name = paramNames.nextElement();
   String value = context.getInitParameter(name);
   out.println(name + ": " + value + "<br/>");
  }
 }
 
 @Override
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
  this.doGet(request, response);
 }
}

  由于一个Web应用中所有Servlet共享一个ServletContext对象,所以ServletContext对象的域属性可以被Web应用中所有的Servlet访问。在ServletContext接口中定义了分别增加、删除、设置ServletContext域属性的4个方法: [img]http://files.jb51.net/file_images/article/201605/20165591442176.jpg?20164591450[/img] 通过以上方法就可以实现多个Servlet间共享数据,这个具体实例就不贴代码了,网上可参考的资料很多,比如可以点击: [url=http://www.1sucai.cn/article/83545.htm]javaweb Servlet开发总结(二)[/url] 以上就是本文的全部内容,希望对大家了解Java Web的Servlet技术有所帮助。 [b]参考资料 [/b] 1、《Java Web程序开发入门》Servlet技术章节
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部