1、Servlet基础

  针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax.servlet.http,Servlet就是一种实现了Servlet接口的类,它由Web容器(Tomcat/Jetty等)负责调用并创建,用于接收和响应用户请求。Servlet接口中定义了5个抽象方法:

方法 功能
void init(ServletConfig config)

负责Servlet初始化工作,容器在创建好Servlet对象后就调用此方法。该方法接受一个

ServletConfig 类参数,Servlet容器通过这个参数向Servlet传递配置信息

ServletConfig getServletConfig() 返回容器调用init(ServletConfig config)时传递的ServletConfig 对象
void service(ServletRequest req, ServletResponse res)

负责响应用户的请求,当接收到客户端访问Servlet对象的请求时就会调用此方法。

容器会构造一个ServletRequest和ServletResponse对象作为参数传递到该方法中,

在该方法中通过ServletRequest对象获取请求信息,对请求处理完成后,通过

ServletResponse对象设置响应消息

String getServletInfo()

返回一个字符串,包含Servlet信息。注意,该方法自己需要重定义,在GenericServlet

类中该方法返回空字符串

void destroy() 负责释放Servlet对象占用的资源,当Servlet对象被销毁时,容器会调用该函数

Servlet顶层类结构如下所示:

2、第一个Servlet程序

  新建一个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>

  启动运行浏览器显示如下:

3、Servlet生命周期

  Servlet生命周期大致分为3个阶段,初始化阶段、运行阶段和销毁阶段。以下是各个阶段详细说明:

  • 初始化阶段:客户端向Servlet容器发出请求访问Servlet时,容器首先解析请求,查看内存中是否有该Servlet对象,如果有直接使用;否则创建该Servlet对象,然后调用init()方法,注意,Servlet整个声明周期中,init()只会调用一次
  • 运行阶段:这个是Servlet最重要的阶段,此阶段容器会构造一个ServletRequest和ServletResponse对象作为参数传递到Servlet的service()方法中。对于Servlet的每一次访问,Servlet容器都会调用一次service()方法,service()方法在Servlet整个生命周期中会被调用多次
  • 销毁阶段:当服务器关闭或者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>

4、ServletConfig和ServletContext

ServletConfig接口

  Servlet运行期间,如果需要一些辅助信息,例如文件编码、使用Servlet的公司等,这些信息可以在web.xml中使用<init-param>元素进行配置,当Tomcat初始化一个Servlet时,会将该Servlet配置信息封装成一个ServletConfig对象通过init(ServletConfig config)传递到Servlet。ServletConfig定义了一系列获取配置信息的方法:

方法 功能
String getServletName() 返回Servlet名字,即web.xml中<servlet-name>中的值
ServletContext getServletContext() 返回代表当前Web应用的ServletContext对象
String getInitParameter(String name) 根据参数名返回对应的参数值,如果未找到返回null
Enumeration<String> getInitParameterNames() 返回一个Enumeration对象,其中包含所有的初始化参数

  接下来以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);
}
}

ServletContext接口

  当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>

  注意:一个<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个方法:

方法 功能
Object getAttribute(String name) 根据指定参数获取一个匹配的域属性值
Enumeration<String> getAttributeNames() 返回一个Enumeration对象,包含所有存放在ServletContext中所有域属性名
void setAttribute(String name, Object object) 设置ServletContext域属性值,name-域属性名,object-域属性值
void removeAttribute(String name) 根据指定的域属性名从ServletContext中移除域属性

  通过以上方法就可以实现多个Servlet间共享数据,这个具体实例就不贴代码了,网上可参考的资料很多,比如可以点击javaweb学习总结(六)——Servlet开发(二)

5、参考资料

  1、《Java Web程序开发入门》Servlet技术章节

  2、javaweb学习总结(六)——Servlet开发(二)

Java Web之Servlet技术的更多相关文章

  1. Java Web之JSP技术

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm ...

  2. Java Web之会话技术

    客户端与服务器通信过程中,会产生一些数据.比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存.根据J ...

  3. 使用Intellij idea新建Java Web项目(servlet) 原理及初步使用

    准备 JDK       (配置JDK_HOME\bin   和 CLASSPATH)   注:JDK8下载已经需要注册了,请使用JDK11(现在是官方长期支持的版本)     对于我们新手来说,JD ...

  4. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  5. java web中servlet、jsp、html 互相访问的路径问题

    java web中servlet.jsp.html 互相访问的路径问题 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可 ...

  6. java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...

  7. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  8. Java Web之Servlet

    Servlet参考文献: 1.http://www.cnblogs.com/luoxn28/p/5460073.html 2.http://www.cnblogs.com/xdp-gacl/p/376 ...

  9. java学习笔记—Servlet技术(11)

    如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术.那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术. Servlet技术简介 Servle ...

随机推荐

  1. 让你忘记 Flash 的15款精彩 HTML5 游戏

    HTML5 游戏开发是一个热门的话题,开发人员和设计人员最近经常谈论到.虽然不能迅速取代 Flash 的地位,但是 HTML5 凭借它的开放性和强大的编程能力,取代 Flash 是必然的趋势.你会看到 ...

  2. 使用animate()的时候,有时候会出现移进移出的闪动问题

    怎么解决这种问题呢?在animate()前面需要加上stop() 例如: $(".nav_list").hover(function(){ $(".div1") ...

  3. HTML滚动字幕代码参数详解及Js间隔滚动代码

    html文字滚动代码 <marquee style="WIDTH: 388px; HEIGHT: 200px" scrollamount="2" dire ...

  4. html5标签的改变

    1.新的文档类型声明 浏览器解析html模式是有两种模式,按照各自浏览器的定义渲染的页面叫“怪异模式”,而按照w3c组织统一的标准渲染叫“标准模式”.一般都是使用标准模式来保持网页兼容性,区分这两种模 ...

  5. 微信 小程序 drawImage wx.canvasToTempFilePath wx.saveFile 获取设备宽高 尺寸问题

    以下问题测试环境为微信开发者0.10.102800,手机端iphone6,如有不对敬谢指出. 根据我的测试,context.drawImage,在开发者工具中并不能画出来,只有预览到手机中显示. wx ...

  6. android HorizontalScrollView

    第一个控件,借鉴网上的资料,自己稍加修改,横向滑动图片浏览功能,纪念下 布局文件 <?xml version="1.0" encoding="utf-8" ...

  7. [Android]竖直滑动选择器WheelView的实现

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3819304.html 公司项目中有这么一个需求,所以需要自己实现下.效 ...

  8. 一文让你彻底了解iOS字体相关知识

    写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅. 一.iOS原生字体展示 在label中选择字体的font,并把font由system改成custom后 ...

  9. SQLite Design and Concepts

    API 分为两大类 core API. 基本的SQL操作 extension API. 创建自定义的SQL操作. 基本数据结构 需要了解的组成部分有连接.statments.B树.pager. 为了写 ...

  10. tomcat ROOT中的lib和webapp中的lib的作用

    相同点:都是用来存放jar包的 不同点:和webapps同个目录下的那个lib文件夹所放的jar包对tomcat 服务器和你的webapp 来说都是可以调用的(这时候假如tomcat和web都依赖某个 ...