首页 > 编程语言 >Java后端01(初识servlet)

Java后端01(初识servlet)

时间:2023-07-25 11:12:16浏览次数:38  
标签:01 Java 请求 resp req 响应 servlet HelloServlet

servlet

添加依赖坐标(maven)

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

小测试

​ 所有请求都会固定携带一个参数(method)代表请求的方式(GET,POST,PUT,DELETE,OPTION)

public class HelloServlet extends HttpServlet {
    @Override
    // req 对应的是请求对象,代表的是请求
    // resp 对应的是响应对象,代表的是响应
    // Java依然按照面向对象的设计方式,开发者如果想操作请求和响应,只需要使用对应的对象调用方法即可,对象实例化也是由 tomcat 自行完成
    
    // 此方法表示处理的是 get 请求,如果发送的 post 请求,那么网页就会报错405
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过响应对象,设置响应内容
        // 准备响应内容
        String content = "This is a text content!";
        // 获取响应对应的输出流,和 socket 变成的流的获取类似
        PrintWriter printWriter = resp.getWriter();
        // 将数据读取到输出流中
        printWriter.write(content);
        // 当doGet方法运行完成之后,响应会被 tomcat 自动返回给客户端
    }
}

// 在 web.xml 文件中配置路由
<servlet>
	<servlet-name>HelloServlet</servlet-name>
	<servlet-class>com.iweb.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>HelloServlet</servlet-name>
	<url-pattern>/hello</url-pattern>
</servlet-mapping>

一个post请求的全流程

<!--页面代码-->
<body>
<!--action:点击提交按钮的时候所发送的请求路径-->
<!--method:请求方式,如果不写默认get-->
    <form action="login" method="post">
      用户名:<input type="text" name="username"><br>
      密码:<input type="password" name="password"><br>
      <input type="submit" value="提交">
    </form>
</body>
// 服务端代码
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 中文处理:在请求的参数接受之前,设置请求中的参数的字符串
        req.setCharacterEncoding("UTF-8");
        // 借助请求对象,获取form表单中所对应的参数
        // getParameter对应的参数,是form表单中input所对应的name属性
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        // req.getParameterValues("name") 获取多个值
        System.out.println(username + " : " + password);
        String html = "";
        if("admin".equals(username)&& "123".equals(password)){
            html = "<div style='color:red'>login success!</div>";
        }else{
            html = "<div style='color:green'>login failed!</div>";
        }
        // 在响应返回之前,设置响应中的内容类型和指定字符集编码
        // 1. 在Java层面将想用中的字符设置为UTF-8编码
        // 2. 通知浏览器使用UTF-8编码显示数据
        resp.setContentType("text/html;charset=UTF-8");
        // 响应返回
        resp.getWriter().write(html);
    }
}
<!--web.xml-->
<servlet>
	<servlet-name>LoginServlet</servlet-name>
	<servlet-class>com.iweb.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>LoginServlet</servlet-name>
	<url-pattern>/login</url-pattern>
</servlet-mapping>

Get请求的几种情况

  1. 浏览器地址栏输入地址访问
  2. 通过超链接点击发送的请求方式
  3. form表单的默认提交方式
  4. ajax指定get方式发送的请求

Post请求方式

  1. form表单指定post方式提交
  2. ajax指定post方式发送请求

POST 和 GET 的区别

  1. get 请求匹配 doGet 方法,post请求匹配 doPost 方法,如果不匹配,会出现405
  2. post 请求中如果携带参数,参数不会出现在 url 中,get 请求中如果携带参数,参数会出现在 url 中
  3. get 请求中参数大小是有限的,过大的参数无法携带,port 请求中参数大小远大于 get 方式

servlet生命周期

  1. 实例化(特性:延迟加载,单例)

    ​ tomcat 运行的时候,servlet 并不会立刻实例化,直到有用户发送请求,并且根据 web.xml 中所配置的映射关系,找到了对应的 servlet 类的类路径的时候,tomcat 这个时候会利用反射创建出对应 servlet 类的对象,为了保证效率,servlet类是单例的。

  2. 初始化

    ​ init方法来自于从HttpServlet 的继承,该方法是成员方法,所以一定是在实例化之后调用的,会在构造方法运行之后运行,但是无论访问多少次,Servlet init,只会初始化一次。

  3. 提供服务

    ​ 正常执行 Service 方法,开发者在方法中借助 req 和 resp 进行请求和响应的处理,方法运行结束之后,响应自动返回

  4. 销毁

    ​ tomcat 服务器关闭的时候,destory 方法被调用。这个过程不是很直观的能被观察到

  5. 被回收

    ​ servlet 被销毁之后,不再有引用存储实例的内存地址,这个时候,servlet实例就满足了被 GC 回收的条件

// 重写方法观察生命周期
public class HelloServlet extends HttpServlet {

    public HelloServlet() {
        System.out.println("HelloServlet -> HelloServlet()");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("HelloServlet -> init()");
    }

    @Override
    public void destroy() {
        System.out.println("HelloServlet -> destroy()");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过响应对象,设置响应内容
        // 准备响应内容
        String content = "This is a text content!";
        // 获取响应对应的输出流,和 socket 变成的流的获取类似
        PrintWriter printWriter = resp.getWriter();
        // 将数据读取到输出流中
        printWriter.write(content);
        // 当doGet方法运行完成之后,响应会被 tomcat 自动返回给客户端

        // 定义 url 映射,让服务器知道客户端发送的哪一个请求,会由当前 servlet 处理
    }
}

CDN快速构建前端页面

布局网站:https://www.runoob.com/try/bootstrap/layoutit/

<link href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<script src="//cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>

标签:01,Java,请求,resp,req,响应,servlet,HelloServlet
From: https://www.cnblogs.com/te9uila/p/17579268.html

相关文章

  • 【JAVA】java日志框架 - slf4j
    1、配置依赖<!--slf4j日志门面--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.26</version></dependenc......
  • luogu P3203 [HNOI2010] 弹飞绵羊 题解
    题目传送门:P3203[HNOI2010]弹飞绵羊题意\(n\)个数,满足\(i<a_i≤N+1\),\(m\)次下面两种操作修改一个数\(a_i\)从\(x\)开始跳,\(x=a_x\),几次能够跳出序列\(n\leq2*10^5,m<10^5\)分析数据范围比较大,单纯搜索模拟肯定会T,那么考虑每次让他跳一段就......
  • JavaWeb--环境搭建(idea,tomcat)到跑测试中我犯下的滔天大罪
    1.在网上copy时路径没有写对点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation......
  • Java开发笔记之mac的intellij idea在debug模式下卡住的问题
    0x00问题描述mac的Intellijidea在debug模式下放行时,程序会卡住无响应;即使在已经放行的情况下,后续代码也不运行,console内只显示Theapplicationisrunning或者等了很久程序才开始后续的运行。 0x01解决方案修改host中的配置。通过以下命令,打开hosts的编辑页面。sudovi......
  • int强制转换char在Java中的使用方法
    int强制转换char在Java中的使用方法在Java编程中,我们经常需要进行数据类型的转换,以便满足不同的需求。其中一个常见的转换就是将int类型强制转换为char类型。本文将围绕这一主题,介绍int强制转换char的使用方法,并探讨一些相关的注意事项。首先,让我们来看一下int和char的基本概念......
  • Java3DES双倍长加密算法详解
     Java3DES双倍长加密算法是一种强大的加密算法,它可以保护我们的敏感数据不被未经授权的人访问。在本文中,我将详细介绍Java3DES双倍长加密算法的原理和使用方法。首先,让我们来了解一下Java3DES双倍长加密算法的原理。这种算法是基于DES(DataEncryptionStandard)算法的改进版本......
  • Java 字符串转整形数组的方法及注意事项
     在Java编程中,经常会遇到需要将字符串转换为整形数组的情况。这是一个常见的操作,它可以帮助我们更方便地处理数据。本文将介绍一些常见的方法和注意事项,以帮助您顺利完成字符串转整形数组的任务。方法一:使用split()方法split()方法是Java中常用的字符串分割方法,它可以按照指......
  • Java中类型如何进行补零操作
     在Java编程中,我们经常需要对不同类型的数据进行处理和操作。其中一个常见的操作是对数字进行补零操作,以满足特定的需求。在本文中,我们将探讨Java中不同类型数据的补零操作方法。对于整数类型,我们可以使用NumberFormat类来进行补零操作。NumberFormat是一个用于格式化数字的工......
  • 【java】智慧导诊系统:根据患者症状匹配挂号科室
    一、系统概述:医院智慧导诊系统是在医疗中使用的引导患者自助就诊挂号,在就诊的过程中有许多患者不知道需要挂什么号,要看什么病,通过智慧导诊系统,可输入自身疾病的症状表现,或选择身体部位,在经由智慧导诊系统多维度计算,精准推荐科室,引导患者挂号就诊,实现科学就诊,不用担心挂错号。二、......
  • Java小总结---不全面
    类与对象的关系?它们的关系是,对象是类的实例,类是对象的模板。构造器定义类是一个模板:抽象;对象是一个具体的实例。类=属性+方法封装继承多态抽象类除非子类也是抽象类。抽象方法接口抽象类的单继承接口的多继承接口的作用:内部类匿名内部......