javaweb之Servlet

目录

1,Helloservlet
2,Servlet运行原理
3,servlet的mapping问题
4,ServletContext对象与应用
5,获取初始化参数
6,请求转发
7,读取资源文件

简介:
Servlet就是sun公司开发动态web的技术
sun公司在这些api中提供一个接口叫做Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

  • 编写一个类,实现servlet接口
  • 把开发好的java类部署到web服务器
    把实现了接口的java程序叫做servlet

一,HelloServlet

在这里,我们使用父子工程来创建项目:
1,构建一个普通的Maven项目,删掉里面的src目录,这个空的工程就是maven的主工程。对着这个项目右键新建一个modul创建子工程。
介绍一下里面的四个文件:
pom.xml:maven的核心配置文件
.iml:是idea的识别文件
.idea:idea的配置文件
2,关于maven的父子工程理解
父工程中会有:
在这里插入图片描述
子项目中会有:
在这里插入图片描述
3,父项目中的jar包子项目可以直接使用,
son extends father。
创建好过后,我们无论在什么项目中,maven都要放一个过滤器:

<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
   </resources>
</build>

4,放入依赖:

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

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>

5,编写一个Servlet程序
编写一个普通类
实现Servlet接口(Servlet接口sun公司有两个默认的实现类,HttpServlet和GenericServlet),这里我们直接继承HttpServlet

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.PrintWriter;

public class HelloServlet extends HttpServlet {

    //由于get或者post只是请求实现的不同方式,可以互相调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     System.out.println("get into doGet method");
     //ServletOutputStream outputStream = resp.getOutputSteam()
        PrintWriter writer = resp.getWriter();//向外面写东西,响应流
        writer.print("hello Servlet");

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

6,编写Servlet映射
为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器注册写的Servlet,还需要一个浏览器能够访问的路径

<?xml version="1.0" encoding="UTF-8"?>
<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">
  <!--注册servlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.servlet.HelloServlet</servlet-class>
  </servlet>

  <!--servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
</web-app>

7,配置tomcat
转链接:配置tomcat的两种方式:点击跳转

启动:
地址输入hello
在这里插入图片描述

二, Servlet运行原理

servlet是由web服务器调用,web服务器再接受浏览器请求后,会
(web容器指tomcat’服务器)
在这里插入图片描述

servlet的mapping问题

1,一个servlet可以指定一个映射路径

在这里插入图片描述

2,一个servlet可以指定多个映射路径
在这里插入图片描述

3,一个servlet可以指定通用映射路径
在这里插入图片描述
4,默认请求路径在这里插入图片描述

5,指定一些后缀或前缀等等。。。。
指定后缀
在这里插入图片描述
6,优先级问题
指定了固定的映射路径优先级最高,找不到的去默认的/*处理请求


public class Errorpage extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("页面出错");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

  <!--注册servlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.servlet.HelloServlet</servlet-class>
  </servlet>

  <!--servlet的请求路径-->
  <!--localhost://8080/Servlet_1_war -->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.zaozao</url-pattern>
  </servlet-mapping>
  
  
  <servlet>
    <servlet-name>erropage</servlet-name>
    <servlet-class>com.servlet.Errorpage</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>erropage</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

三,ServletContext对象

在父级项目中新建一个子类项目
在这里插入图片描述
得到一个项目web项目的目录,这里缺少。java和resources目录,创建文件夹与标记颜色
在这里插入图片描述
得到:
在这里插入图片描述

将web.xml文件的文件头拿过来
在这里插入图片描述
第二步:

<servlet>
  <servlet-name>ServletContext</servlet-name>
  <servlet-class>com.ServletContext</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>ServletContext</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
public class ServletContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello");
    }
}

修改为当前module
在这里插入图片描述
访问hello,由于response没有响应,什么都没有,后台打印
在这里插入图片描述

3.1ServletContext

在这里插入图片描述

web容器在启动的时候,它会为每个web程序都创建一个ServletContext对象,它代表了当前的web应用

  • 共享数据(我在这个Servlet中保存的数据,可以在另一个servlet中拿到)
    class ServletContext
public class ServletContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //this,调用自身这个类
        //this.getInitParameter()  初始化参数
        //this.getServletConfig()  Servlet配置
        //this.getServletContext()   上下文
        javax.servlet.ServletContext servletContext = this.getServletContext();
        String username ="小明";
        servletContext.setAttribute("username",username);//将一个数据保存在了ServletContext中

        System.out.println("hello");
    }
}

class GetServlet

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String attribute = (String)servletContext.getAttribute("username");

        //数据放在上面,响应放在下面
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字"+attribute);

    }

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

web.xml中写

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

先输入hello路径存入数据,再输入getc,取出数据
在这里插入图片描述

3.2ServletContext应用

idea的结构体

在这里插入图片描述
标记为过时
在这里插入图片描述

3.2.1获取初始化参数

在web.xml中配置

  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>


<servlet>
    <servlet-name>ServletParam</servlet-name>
    <servlet-class>com.ServletParam</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletParam</servlet-name>
    <url-pattern>/pg</url-pattern>
  </servlet-mapping>

class ServletParam

public class ServletParam extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String url = servletContext.getInitParameter("url");
        resp.getWriter().print(url);
    }

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

在这里插入图片描述

3.3.2请求转发

request的转发链接,输入req的地址得到gp的内容

public class ServletRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入了这个方法");
        ServletContext servletContext = this.getServletContext();
        //RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/pg");//转发的请求路径
        //requestDispatcher.forward(req,resp);//调用forward实现请求转发
        servletContext.getRequestDispatcher("/pg").forward(req,resp);



    }

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

  <servlet>
    <servlet-name>servletRequest</servlet-name>
    <servlet-class>com.ServletRequest</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>servletRequest</servlet-name>
    <url-pattern>/req</url-pattern>
  </servlet-mapping>

在这里插入图片描述

在这里插入图片描述

3.3.3读取资源文件

properties

  • 在java目录下新建properties
  • 在resources目录下新建properties
    发现,都被打包到了同一个路径下:classes,在当前web项目下。
public class PropertiesServlet extends HttpServlet {
    //用流读取配置文件内容

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties properties = new Properties();
        properties.load(resourceAsStream);
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        resp.getWriter().print(username+":"+password);
    }

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

web.xml

<servlet>
    <servlet-name>dbtest</servlet-name>
    <servlet-class>com.PropertiesServlet</servlet-class>
    
  </servlet>
  <servlet-mapping>
    <servlet-name>dbtest</servlet-name>
    <url-pattern>/db</url-pattern>
  </servlet-mapping>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值