JavaWeb高级编程(三)—— 创建第一个Servlet

本文详细介绍了如何创建和配置Servlet,从创建HelloServlet类开始,讲解了选择Servlet基类、添加HTTP方法支持,以及初始化和销毁方法的使用。接着,讨论了配置Servlet、处理请求参数、多线程安全等关键知识点,还涵盖了文件上传和初始化参数的配置,为深入理解JavaWeb开发提供了扎实的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、创建HelloServlet类

        Servlet是一个运行在Web服务器中的Java小程序,Servlet会接收和响应来自Web客户端的请求,使用HTTP进行通信。除非某些过滤器提前中止了客户端的请求,否则所有的请求都将会发送到某些Servlet中。

1、选择要继承的Servlet

        大多情况下,Servlet都继承至GenericServlet,GenericServlet是一个不依赖具体协议的Servlet,它包含了一个抽象的service()方法以及几个辅助方法用于日志操作和从应用、Servlet配置中获取信息。

        作为响应HTTP请求的HttpServlet,它继承了GenericServlet,并实现了只接受http请求的service()方法,然后它提供了响应每种http请求的方法的空实现。

import javax.servlet.http.HttpServlet;

public class HelloServlet extends HttpServlet {

}

2、添加对HTTP GET方法的支持

        这个Servlet已经可以接受任何HTTP请求,但它并没有重写HttpServlet中的方法,所以会返回一个HTTP状态405作为响应。现在我们重写doGet()方法,添加对HTTP GET方法的支持,如下:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("Hello World");
    }
}
 3、使用初始化方法和销毁方法
    @Override
    public void init() throws ServletException {
        System.out.println(this.getServletName() + "has started");
    }

    @Override
    public void destroy() {
        System.out.println(this.getServletName() + "has stopped");
    }

        如果将Servlet配置为在Web应用程序部署和启动时自动启动,那么它的init()方法也将会调用。否则,init()方法将在第一次请求访问Servlet时调用。

        destroy()方法在Web应用程序被停止或卸载、关闭时立即调用,它不需要等待垃圾回收器进行 

二、配置可部署的Servlet

1、向部署描述符中添加Servlet并映射URL

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>f1.chapter3.servlet.HelloServlet</servlet-class>
        <load-on-startup>1</load-on-startup><!--让servlet在Web应用程序启动之后立即启动,数字越大启动越晚-->
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name><!--这应该跟servlet-name保持一致-->
        <url-pattern>/getting</url-pattern>
    </servlet-mapping>
</web-app>

        如果两个或多个Servlet的<load-on-startup>相同,那么将按照它们在描述符文件中的出现顺序启动,其他Servlet仍按照大小顺序进行启动。

2、运行和调试Servlet

如果tomcat没有设置为根目录的话,应该在getting前加上项目名,如:http://localhost:8080/xxx/getting

如果希望命中destroy的断点,需要在命令行关闭Tomcat,如果在IDE中关闭Tomcat,则Tomcat将在断点被命中之前断开与调试器的连接。

三、了解doGet、doPost和其他方法

1、获取请求参数

HttpServletRequest最重要的功能是从客户端发送的请求中获取参数。请求参数有两种不同的形式:查询参数(也称为URL参数)和post变量。

        //请求url为http://localhost:8080/getting?name=alex&name=zhangsan&age=25,请求类型为get
        String name = req.getParameter("name");//当参数有多个值时只返回第一个值
        System.out.println(name);//alex

        String[] names = req.getParameterValues("name");//返回参数值的数组
        System.out.println(names[0] + "==" + names[1]);//alex==zhangsan

        Map map = req.getParameterMap();//返回参数和值的key-value
        String[] s = (String[]) map.get("name");//alex==zhangsan
        System.out.println(s[0] + "==" + s[1]);

        Enumeration names1 = req.getParameterNames();//返回参数名字的枚举
        Object o1 = names1.nextElement();
        Object o2 = names1.nextElement();
        System.out.println(o1 + "==" + o2);//name==age
        resp.getWriter().print("Hello World");

2、确定与请求内容相关的信息

        //请求内容为age=8,请求类型为post,Request Body为Empty
        String contentType = req.getContentType();//返回请求的MIME内容类型(多用途互联网邮件扩展)
        System.out.println(contentType);//application/x-www-form-urlencoded; charset=GBK

        int length = req.getContentLength();//返回请求正文的长度,以字节为单位
        System.out.println(length);//5

        String encoding = req.getCharacterEncoding();//返回请求内容的字符编码
        System.out.println(encoding);//GBK
        resp.getWriter().print("Hello World");

3、读取请求的内容

        //请求内容为zhangsan,请求类型为post,Request Body为Text
        String contentType = req.getContentType();//返回请求的MIME内容类型(多用途互联网邮件扩展)
        System.out.println(contentType);//*/*; charset=UTF-8

        int length = req.getContentLength();//返回请求正文的长度,以字节为单位
        System.out.println(length);//8

        String encoding = req.getCharacterEncoding();//返回请求内容的字符编码
        System.out.printl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值