编写第一个Servelt&ServletContext

编写第一个servlet程序

1、创建一个普通的maven项目

在这里插入图片描述
在这里插入图片描述

2、删掉src目录

3、在pom.xml中添加依赖

 <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>

        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <!--删掉这一行scope-->
            <scope>provided</scope>
        </dependency>
    </dependencies>

这里报红的话点击一下右边的刷新,下载依赖

4、新建maven 的web子模块

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

报错了…

在这里插入图片描述

不知道咋回事,把项目删了,重弄一次就好了

又遇到bug,没有parent标签。这里手动添加,不然后面无法继承HttpServlet类

<parent>
  <artifactId>FirstServlet</artifactId>
  <groupId>org.example</groupId>
  <version>1.0-SNAPSHOT</version>
</parent>

ctrl+o重写方法 Alt+Enter 导包

在这里插入图片描述

5、子模块添加Java目录和Resources资源目录,形成这样的工程结构

在这里插入图片描述

6、在Java目录下自定义包,并在包下创建类

在这里插入图片描述

package com.hl;


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

public class HelloServlet extends HttpServlet {
    
    
    //由于get或者post只是请求实现的不同方式,可以互相调用,业务逻辑都一样;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //ServletOutputStream outputStream = resp.getOutputStream();
        System.out.println("进入doGet方法");
        PrintWriter writer = resp.getWriter();//响应流
        writer.print("Hello,Servlet!");

    }

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

7、配置web.xml文件

由于我们写的只是Java类,但要通过浏览器访问,即需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径,因此需要在web.xml中配置路径,请求地址映射。注册一个Servlet类,web.xml中就需要两个标签去映射表示,即与,它们是成对出现的

下面我用“hello”作为浏览器映射请求的路径,其中在标签下的表示自定义的路径请求映射,是对应的自定义Servlet类的位置;在下的与上面的要求是对应的,表示初始时默认访问的路径.

<!--注册Servlet--> 
<servlet>
   <servlet-name>hello</servlet-name>
   <servlet-class>com.hl.HelloServlet</servlet-class>
 </servlet>
<!--Servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern><!--斜杆不要漏-->
  </servlet-mapping>

8、配置Tomcat

上述工作准备就绪后,启动我们是需要借助Tomcat服务器来帮我们去到浏览器。因此我们需要准备好相关的Tomcat工具来启动

在这里插入图片描述
在这里插入图片描述

9、启动Tomcat

在这里插入图片描述
在这里插入图片描述

ServletContext应用

1、共享数据

getServletContext 在这个Servlet中保存的数据,可以在另一个Servlet中拿到

1、新建子模块servlet_02

使用servlet框架,补全maven项目,添加java和resources。看子模块servlet_02的pom.xml有没有parent标签,没有的话手动补齐

 <parent>
    <artifactId>FirstServlet</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>

2、建包,创建HelloServlet类

在这里插入图片描述

3、到web.xml下注册servlet

 <!--注册Servlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.hl.servlet.HelloServlet</servlet-class>
  </servlet>
  <!--Servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

4、配置Tomcat

删除servlet_01,添加servlet_02

在这里插入图片描述

5、启动Tomcat

6、编写HelloServlet

​```java
package com.hl.servlet;

import javax.servlet.ServletContext;
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 {
    
    
        //this.getInitParameter(); 初始化参数
        //this.getServletConfig(); Servlet配置
        ServletContext context= this.getServletContext();//Servlet上下文
        String username = "HL";
        context.setAttribute("username",username); //将一个数据保存在了ServletContext中
        System.out.println("hello " + username);
        System.out.println("Hello");
    }

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

​```

7、编写GetServlet

package com.hl.servlet;

import javax.servlet.ServletContext;
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 GetServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        ServletContext context = this.getServletContext();
     String   username = (String)context.getAttribute("username");
     resp.setContentType("text/html;charset=UTF-8");
     resp.getWriter().print("名字:"+username);


    }

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

8、注册GetServlet

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

  <display-name>Archetype Created Web Application</display-name>
  <!--注册Servlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.hl.servlet.HelloServlet</servlet-class>
  </servlet>
  <!--Servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

<servlet>
  <servlet-name>getc</servlet-name>
  <servlet-class>com.hl.servlet.GetServlet</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>getc</servlet-name>
    <url-pattern>/getc</url-pattern>
  </servlet-mapping>

</web-app>

9、运行Tomcat,/hello,/getc

在这里插入图片描述

2、初始化参数

getInitParameter获取初始化参数

除了可以获取getInitParameter里面的参数,还可以获取web.xml里面的context-param

1、在web.xml添加以下代码

<!--配置一些web应用初始化参数-->
  <context-param>
    <param-name>url</param-name>
<!--JDBC链接数据库的url-->
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>  
  </context-param>

2、demo3

package com.hl.servlet;

import javax.servlet.ServletContext;
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 demo3 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        response.getWriter().print(url);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    }
    
}

3、在web.xml中注册

  <servlet>
    <servlet-name>gp</servlet-name>
    <servlet-class>com.hl.servlet.demo3</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>gp</servlet-name>
    <url-pattern>/gp</url-pattern>
  </servlet-mapping>

4、启动Tomcat

在这里插入图片描述

3、请求转发

RequestDispatcher 请求转发

1、demo4

package com.hl.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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 demo4 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        ServletContext context = this.getServletContext();
        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//获得请求转发,转发的请求路径
        requestDispatcher.forward(req,resp);  //调用forward实现请求转发



    }

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

2、注册web.xml

<servlet>
    <servlet-name>sd4</servlet-name>
    <servlet-class>com.hl.servlet.demo4</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sd4</servlet-name>
    <url-pattern>/sd4</url-pattern>
  </servlet-mapping>

3、启动tomcat

在这里插入图片描述

由于请求转发,可以看到进入的是demo3中的/gp页面

注意区分请求转发和重定向!

在这里插入图片描述

4、读取资源文件

Properties

1、在resources目录下建一个db.properties

在这里插入图片描述

username=root
password=123456

2、运行maven的clean插件清除原来的target文件

在这里插入图片描述

3、重新启动Tomcat,发现被打包到了路径classes下,俗称为类路径classpath。

在这里插入图片描述

maven由于他的约定大于配置,我们之后可能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:

<!--在build中配置resources,来防止我们的资源导出失败问题-->
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
      </resource>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>

5、编写demo5文件

package com.hl.servlet;

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

public class demo5 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//把资源变成流,因为我们的getproperties需要流
        Properties prop = new Properties();
        prop.load(is);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user+":"+pwd);

    }

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

6、注册demo5

<servlet>
    <servlet-name>sd5</servlet-name>
    <servlet-class>com.hl.servlet.demo5</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sd5</servlet-name>
    <url-pattern>/sd5</url-pattern>
  </servlet-mapping>

7、启动Tomcat

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43666228/article/details/126112683
今日推荐