Servlet基本使用

Servlet简介

 

Servlet是运行在Web服务器上的应用程序。Servlet本身是一个java接口,它定义了浏览器访问服务器程序的规则,我们写服务器程序只需要按照需求复写Servlet方法即可。

 

Servlet快速入门

1. 编写Servlet实现类

//实现Servlet接口,按 alt+enter-->implement methods实现所有抽象方法。
public class ServletDemo1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...执行了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service...执行了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy...执行了");
    }
}

2. 配置Servlet访问路径

每写一个Servlet实现类,需要在web.xml文件中进行配置。

<!--配置ServletDemo1的全类名 -->
<servlet>
    <servlet-name>ServletDemo1</servlet-name>
    <servlet-class>cn.itheima.servlet.ServletDemo1</servlet-class>
</servlet>
<!--配置浏览器访问ServletDemo1的路径-->
<servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>

3. 访问Servlet

在浏览器地址栏访问 http:\localhost:8080\servlet\ServletDemo1 查看IDEA控制台,会先执行init方法,再执行service方法。

 当关闭服务器的时候,destroy执行了

 

4. Servlet的执行流程

从浏览器发送请求给服务器,到服务器处理Servlet作出响应的流程,如图所示

 

Servlet体系结构

 

HttpServletRequest对象

当浏览器访问服务器时,tomcat会对Http请求的数据进行解析,并封装为HttpServletRequest对象

 

HttpServletReponse对象

当服务器给浏览器返回数据时,需要将数据封装为HttpServletReponse对象,然后用流往浏览器进行输出。

 

Servlet映射方式

一个Servlet可以对应多个映射路径,也就是说浏览器访问不同的路径可以对应同一个Servlet。

<!--一个servlet映射多个访问路径-->
<servlet>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.itheima.servlet.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <!--访问路径前面是servletDemo4,后面是什么无所谓-->
    <url-pattern>/servletDemo4/*</url-pattern>
    
    <!-- <url-pattern>*.do</url-pattern> -->
</servlet-mapping>

Servlet创建时机

Servlet默认是在第一次访问时被创建,如果想要在服务器启动时被创建,需要在web.xml文件中进行配置。

添加<load-on-startup>1</load-on-startup> 配置即可,值越小优先级越高。

 <servlet>
     <servlet-name>ServletDemo4</servlet-name>
     <servlet-class>com.itheima.servlet.ServletDemo4</servlet-class>
     <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <url-pattern>/ServletDemo4</url-pattern>
</servlet-mapping>

ServletConfig配置

ServletConfig是Servlet的配置对象,每一个Servlet都有专属的ServletConfig用来存储一些配置信息。当Servlet被创建时就会创建一个ServletConfig,同时Servlet被销毁时ServletConfig也随之销毁。

给ServletConfigDemo1配置初始化参数

<servlet>
     <servlet-name>servlerConfigDemo1</servlet-name>
     <servlet-class>com.itheima.servletconfig.ServletConfigDemo1</servlet-class>
     <!--Servlet初始化参数-->
     <init-param>
         <param-name>encoding</param-name>
         <param-value>utf-8</param-value>
     </init-param>
     <init-param>
         <param-name>desc</param-name>
         <param-value>这是一个ServletConfigDemo</param-value>
     </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>servlerConfigDemo1</servlet-name>
    <url-pattern>/servlerConfigDemo1</url-pattern>
</servlet-mapping>

获取ServletConfigDemo1的初始化参数

public class ServletConfigDemo extends HttpServlet {

    private ServletConfig servletConfig;

    @Override
    public void init() throws ServletException {
        //获取ServletConfig
        this.servletConfig = getServletConfig();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        //获取所有的配置名称
        Enumeration<String> keys = servletConfig.getInitParameterNames();
        while (keys.hasMoreElements()) {
            String key = keys.nextElement();
            //根据配置名称获取值
            String value = servletConfig.getInitParameter(key);
            //打印键和值
            System.out.println(key+"..."+value);
        }

        //获取ServletConfig(下面有讲是什么意思)
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println(servletContext); 
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

ServletContext对象

ServletContext代表整个Web应用,每一个应用只有一个ServletContext对象。常用于配置和获取应用的全局初始化参数,可以实现Servlet之间的数据共享。

配置全局参数

<!--配置全局编码-->
<context-param>
    <param-name>globalEncoding</param-name>
    <param-value>utf-8</param-value>
</context-param>

<!--配置全局描述信息-->
<context-param>
    <param-name>globalDesc</param-name>
    <param-value>utf-8</param-value>
</context-param>

获取全局参数

//获取ServletContext
ServletContext servletContext = getServletContext();

//获取全局参数globalEncoding的值
String globalEncofing = servletContext.getInitParameter("globalEncoding");
System.out.println(globalEncofing);

//获取全局参数globalDesc的值
String globalDesc = servletContext.getInitParameter("globalDesc");
System.out.println(globalDesc);

获取真实路径

在本地电脑上写代码一般都是写的相对路径,但是项目最终会发布到服务器上,需要把本地路径转换为服务器路径,才能被访问到。

//获取ServletContext对象
ServletContext servletContext = req.getServletContext();

//虚拟目录
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);

//获取虚拟目录的绝对路径
String servletContextRealPath = servletContext.getRealPath("/");
System.out.println(servletContextRealPath); 

//获取web/a.txt的绝对路径
String webPath = servletContext.getRealPath("/a.txt");
System.out.println(webPath);

//获取web/WEB-INF/a.txt的绝对路径
String webInfPath = servletContext.getRealPath("/WEB-INF/a.txt");
System.out.println(webInfPath);

//获取src/a.txt的绝对路径
String srcPath = servletContext.getRealPath("WEB-INF/classes/a.txt");
System.out.println(srcPath);

Servlet间数据共享

在Servlet1中设置数据

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置共享数据
        servletContext.setAttribute("username","zhangsan");
        servletContext.setAttribute("password","123");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

在Servlet2中获取数据

public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取username的值
       	Object username = servletContext.getAttribute("username");
        System.out.println(username);
        //获取password的值
        Object password = servletContext.getAttribute("password");
        System.out.println(password);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

Servlet注解开发

我们发现,每次写一个Servlet都需要在web.xml文件中写大量的配置,非常麻烦。好消息来了,在Servlet3.0以后的版本提供了Servlet注解配置,大大简化了代码编写。

//@WebServlet注解配置Servlet访问路径
@WebServlet("/servletDemo5")
public class ServletDemo5 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet执行了"); 
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

浏览器直接访问 http://localhost:8080/day02_servlet/servletDemo5就可以了

Web项目打包发布的流程

浏览器往服务器文件写数据

 

### Servlet使用方法 #### 使用 WebServlet 注解配置 Servlet 映射路径 通过 `@WebServlet` 注解可以定义 Servlet 的 URL 路径以及名称。这种方式无需修改 `web.xml` 文件即可完成映射配置,简化了开发流程。例如,在创建一个新的 Servlet 类时,可以通过如下方式指定访问路径: ```java import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @WebServlet(name = "LoginServlet", value = "/doLog") // 定义 Servlet 名称和访问路径 public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("This is a GET request"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("This is a POST request"); } } ``` 上述代码中,`value="/doLog"` 表示该 Servlet 可以通过 `/doLog` 访问[^2]。 --- #### 使用 web.xml 配置 Servlet 映射路径 另一种常见的配置方式是通过 `web.xml` 文件手动设置 Servlet 和其对应的 URL 映射关系。这种方法适用于较旧版本的 Java EE 或者需要集中管理所有 Servlet 配置的情况。以下是具体的实现步骤: 1. **注册 Servlet** 在 `<servlet>` 标签下声明 Servlet 并为其分配一个逻辑名。 2. **绑定 URL 地址** 将上一步中的逻辑名与实际的 URL 进行关联。 具体例子如下所示: ```xml <servlet> <servlet-name>LoginServlet</servlet-name> <!-- 声明 Servlet --> <servlet-class>com.example.LoginServlet</servlet-class> <!-- 指定类全限定名 --> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <!-- 绑定到上面声明的名字 --> <url-pattern>/login.do</url-pattern> <!-- 设置访问路径 --> </servlet-mapping> ``` 当用户请求地址为 `http://localhost:8080/login.do` 时,服务器会调用 `LoginServlet` 处理请求[^1]。 需要注意的是,如果同时存在注解和 XML 中的配置,则优先级取决于容器的具体实现;某些情况下可能会覆盖注解配置[^3]。 --- #### 开发环境搭建 (基于 IntelliJ IDEA) 为了更高效地进行 Web 应用开发,推荐使用现代 IDE 工具如 IntelliJ IDEA 来辅助构建项目结构、部署运行环境等操作。下面简单介绍如何利用此工具快速启动一个支持 Servlet 技术的应用程序: 1. 创建 Maven/Gradle 项目,并引入必要的依赖项(Tomcat Embedded Core 等); 2. 新建 Java Class 同时勾选 Generate Constructor Option 自动填充基本框架; 3. 修改 pom.xml 添加 servlet-api.jar 支持库文件; 4. 配置 Tomcat Server 参数以便本地调试测试功能正常运作。 更多细节参见参考资料相关内容说明。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值