未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • Java web 开发

    • Web笔记(一) Web 简介与开发环境搭建
    • Web笔记(二)Tomcat 使用总结
    • Web笔记(三)Servlet 的类与接口API
    • Web笔记(四)Servlet 程序开发
      • Web笔记(五)Servlet 的生命周期
    • Java web 开发
    • Java web 开发
    程序猿阿朗
    2018-09-04

    Web笔记(四)Servlet 程序开发

    # Servlet 的编写

    Servlet本质上是一个Java类,创建一个Servlet很简单,就是定义一个Java类,这个类继承自javax.servlet.http.HttpServlet类,覆盖其中的doGet和doPost方法,在doGet和doPost中编写处理请求的代码。 由于 Servlet 不是 Java 平台标准版的组成部分,所以必须添加jar包:servlet-api.jar 可以在Tomcat下lib目录下找到,也可自行下载添加。在创建Web项目的时候如果有选择Tomcat ,则会自动添加,如何创建一个web项目并部署到Tomcat,可以参考之前文章。 Web笔记(一) Web 简介与开发环境搭建 (opens new window)

    编写第一个Servlet ,我们可以直接在Eclipse 中的Web项目里新建Servelt。 创建servlet

    也可以普通创建类手动继承HttpServlet。在创建完毕后需要手动重写doGet和doPost方法。 创建servlet

    使用第一种方法新建 FirstServlet.java 类(注意看代码注释)

    package net.codingme.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * 第一个servlet测试
     * 
     */
    //@WebServlet("/firstServlet") 
    public class FirstServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public FirstServlet() {
    		super();
    	}
    
    	// get请求处理
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//设置响应的文本类型和字符编码
    		response.setContentType("text/html;charset=UTF-8");
    		//通过输出流向客户端做出响应
    		PrintWriter out = response.getWriter();
    		out.println("<html><body>");
    		out.println("<h3>firest servlet</h3>");
    		out.println("</body></html>");
    		out.close();
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

    HTTP的请求方式除了get和post请求之外还有put、delete等,get和post是最为常用两种请求方式,所以通常只覆盖doGet和doPost方法。
    response.setContentType("text/html;charset=UTF-8");用于设置响应的文本类型和编码方式,通过响应对象获得输出流对象out,用于向客户端浏览器输出响应内容,代码中输出的HTML标记,这实际上是一个动态的Web的页面。 关于HTTP协议的相关知识可以查看文章网络协议之HTTP (opens new window)

    # Servlet 的web.xml配置

    Servlet编写完成之后,需要在工程WEBROOT/WEB-INF/web.xml中进行配置才可以生效,web.xml是Web应用的主配置文件,包含Web应用配置的主要信息。

    在web.xml中根元素<web-app>中配置Servlet,代码如下:

    <servlet>
    	<servlet-name>first</servlet-name>
    	<servlet-class>net.codingme.servlet.FirstServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
    	<servlet-name>first</servlet-name>
    	<url-pattern>/firstServlet</url-pattern>
    </servlet-mapping>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    配置解释:

    <servlet>
    	<servlet-name>servlet名</servlet-name>
    	<servlet-class>servlet的class的全名</servlet-class>
    </servlet>
    
    <servlet-mapping>
    	<servlet-name>servlet名</servlet-name>
    	<url-pattern>servlet的访问路径</url-pattern>
    </servlet-mapping>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    # Servlet 3.0的注解配置

    如果Servlet版本是3.0及以上的,可以使用@WebServlet注解进行配置,省去了web.xml中的繁琐配置。此方式和通过web.xml配置Servlet二选一即可。

    @WebServlet主要属性列表

    属性名 类型 描述
    name String 指定 Servlet 的 name 属性,等价于 。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
    value String[] 该属性等价于 urlPatterns 属性。两个属性不能同时使用。
    urlPatterns String[] 指定一组 Servlet 的 URL 匹配模式。等价于 标签。
    loadOnStartup int 指定 Servlet 的加载顺序,等价于 标签。
    initParams WebInitParam[] 指定一组 Servlet 初始化参数,等价于 标签。
    asyncSupported boolean 声明 Servlet 是否支持异步操作模式,等价于 标签。
    description String 该 Servlet 的描述信息,等价于 标签。
    displayName String 该 Servlet 的显示名,通常配合工具使用,等价于 标签。

    @WebServlet完整的使用例子

    @WebServlet(urlPatterns = {"/simple"}, asyncSupported = true, 
    loadOnStartup = -1, name = "SimpleServlet", displayName = "ss", 
    initParams = {@WebInitParam(name = "username", value = "tom")} 
    ) 
    
    
    1
    2
    3
    4
    5

    只配置访问路径的示例:

    package net.codingme.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    /**
     * 第一个servlet测试
     * 使用注解配置访问路径
     */
     @WebServlet(urlPatterns= {"/firstServlet"})
    public class FirstServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public FirstServlet() {
    		super();
    	}
    	.
    	.
    	.
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    # Servlet 的运行与访问

    Servlet配置完成之后,把Servlet所在工程项目部署到web服务器上并启动。 发布成功之后可以访问servlet配置的路径进行访问。
    格式如:协议://服务器地址:端口号/WEB应用名/Servlet的访问路径 那么web服务器是如何找到对应的servlet类的呢?

    1. 查找web.xml中Servlet配置信息中的<url-pattern>值与请求路径相匹配的项。
    2. 访问到对应的(<servlet-mapping>中<servlet-name>与<servlet>中<servlet-name>值相等,)<servlet-class>,可以访问到指定的Servlet类。
    3. web服务器将在第一次访问servlet时实例化一个servlet对象用于处理请求。

    访问Servlet有三种方式

    • 直接在浏览器地址中输入访问路径来访问
    • 通过超链接来访问
    • 通过提交表单来访问

    访问测试:
    访问测试

    # Servlet 的初始化参数

    自定义的Servlet继承了了HttpServlet,HttpServlet继承了GenericServlet,GenericServlet类实现了ServletConfig接口,所以自定义的Servlet中可以直接使用ServletConfig中的getInitParameter(String name)方法。也可直接通过getServletName()方法获得Servlet名字,也就是web.xml中相应的<servlet>元素的<servlet-name>的值。如果没有配置会返回Servlet类名。

    # 编写Servlet

    package net.codingme.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /** 
     * 
     * Servlet获得初始化参数
     * 
     * @author Niu on 2017年7月25日 下午6:14:23
     */
    public class GetInitParamServlet extends HttpServlet {
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//通过getInitParameter方法获得配置文件中设置的初始化值
    		String name = this.getInitParameter("name");
    		String password = this.getInitParameter("password");
    		
    		//通过getServletName方法获得配置文件中设置Servlet名字
    		String servletName = this.getServletName();
    		
    		//设置响应文本类型和编码方式
    		resp.setContentType("text/html;charset=UTF-8");
    		
    		//通过输出流向客户端做出相应
    		PrintWriter out = resp.getWriter();
    		out.println("name:"+name);
    		out.println("<br>");
    		out.println("password:"+password);
    		out.println("<br>");
    		out.println("servletName:"+servletName);
    		out.close();
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		doGet(req, resp);
    	}
    	
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    # 配置Servlet

    初始化了两个参数,分别是name:xy和password:123,访问路径/getInitParam

    <!-- Servlet获取初始化参数值 -->
    	<servlet>
    		<servlet-name>getInitParam</servlet-name>
    		<servlet-class>net.codingme.servlet.GetInitParamServlet</servlet-class>
    		<!-- 初始化参数值 -->
    		<init-param>
    			<param-name>name</param-name>
    			<param-value>xy</param-value>
    		</init-param>
    		<init-param>
    			<param-name>password</param-name>
    			<param-value>123</param-value>
    		</init-param>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>getInitParam</servlet-name>
    		<url-pattern>/getInitParam</url-pattern>
    	</servlet-mapping>
    	
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    # 测试Servlet

    访问配置的路径:http://localhost:8080/servlet-GetInitParam/getInitParam 访问测试 获取到配置的初始化参数。

    GitHub:获取初始化参数 (opens new window)

    # Servlet 的开发总结

    Servlet开发步骤:

    1. 编写Servlet,编写一个Java类,继承HttpServlet类并覆盖doGet和doPost方法
    2. 在配置文件web.xml中配置Servlet(Servlet3.0以上版本可以使用注解)
    3. 将Servlet所在Java Web项目部署到Web服务器上,例如Tomcat
    4. 启动Web服务器
    5. 请求访问Servlet

    Servlet执行流程:

    1. 客户端浏览器向Web服务器发送请求访问某一个Servlet
    2. Web服务器根据配置信息定位到具体的Servlet
    3. 如果这个Servlet是第一次被访问,此时Servlet对象在内存中不存在,则创建这个Servlet对象,如果这个Servlet已经被访问过,则Servlet的对象已经存在内存中,然后创建一个线程操作这个Servlet对象,完成具体功能。
    4. 获得运行结果,通过响应对象(response)设置响应参数并将结果返回到客户端。
    5. 客户端将相应结果显示在浏览器中。

    GitHub:第一个Servlet (opens new window)

    订阅

    文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

    文章作者: 程序猿阿朗
    文章链接:https://www.wdbyte.com/2018/09/develop/web/web/base-04/
    版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
    #Servlet
    上次更新: 2022/12/05, 08:18:32
    Web笔记(三)Servlet 的类与接口API
    Web笔记(五)Servlet 的生命周期

    ← Web笔记(三)Servlet 的类与接口API Web笔记(五)Servlet 的生命周期→

    最近更新
    01
    如何搭建一个自己的音乐服务器
    12-04
    02
    JUnit 5 单元测试教程
    11-17
    03
    使用 StringUtils.split 的坑
    11-02
    更多文章>

    提示:评论前请刷新页面,否则评论的可能不是当前文章。

    Theme by Vdoing | Copyright © 2018-2022 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式