day30_servlet

news2024/11/15 17:59:54

今日内容

零、复习昨日

一、接收请求

二、处理响应

三、综合案例

零、复习昨日

画图, 请求处理的完整流程(javaweb开发流程)

image-20230818094130792

零、注解改造

@WebServlet注解,相当于是在web.xml中配置的servlet映射

Servlet类

package com.qf.servlet;

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

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 * 注解@WebServlet取代web.xml中的配置
 * 服务器运行时会处理这个注解
 * 根据注解后的参数匹配请求路径
 */
@WebServlet("/a")
public class MyServlet1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("接收请求" );
    }
}

web.xml , 内容不用配置

<?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_3_1.xsd"
version="3.1">

<!--    @WebServlet("/a")可以取代以下配置-->
<!--    <servlet>-->
<!--        <servlet-name>aServlet</servlet-name>-->
<!--        <servlet-class>com.qf.servlet.MyServlet1</servlet-class>-->
<!--    </servlet>-->
<!--    <servlet-mapping>-->
<!--        <servlet-name>aServlet</servlet-name>-->
<!--        <url-pattern>/a</url-pattern>-->
<!--    </servlet-mapping>-->
    
</web-app>

启动项目,访问/a路径即可

一、接收请求

需求: html页面中写一个表单,发送请求,后台服务器接收所有请求数据

1.1 编写页面

index.jsp或者index.html都行

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>

<%--
    input必须加name属性,因为后台服务器通过name获取输入框的值
    单选,复选框,选择框,需要设置value属性,后台服务器获得是value的值
    文件上传比较特殊,后续单独讲,暂时忽略
--%>
<h1>演示:servlet接收请求数据</h1>
<form action="/req" method="get">
    <table>
        <tr>
            <td>
                用户名
            </td>
            <td>
                <input type="text" name="username">
            </td>
        </tr>
        <tr>
            <td>
                密码
            </td>
            <td>
                <input type="password" name="password">
            </td>
        </tr>
        <tr>
            <td>
                性别
            </td>
            <td>
                <input type="radio" name="sex" value="1">男
                <input type="radio" name="sex" value="2">女
            </td>
        </tr>
        <tr>
            <td>
                爱好
            </td>
            <td>
                <input type="checkbox" name="hobby" value="1">唱歌
                <input type="checkbox" name="hobby" value="2">跳舞
                <input type="checkbox" name="hobby" value="3">rap
            </td>
        </tr>
        <tr>
            <td>
                生日
            </td>
            <td>
                <input type="date" name="birthday">
            </td>
        </tr>
        <tr>
            <td>
                学历
            </td>
            <td>
                <select name="xl">
                    <option value="1">大专</option>
                    <option value="2">本科</option>
                    <option value="3">研究生</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>
                提交
            </td>
            <td>
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>
</form>
</body>
</html>

image-20230818104807614

1.2 编写Servlet

package com.qf.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示接收请求数据
 */
@WebServlet("/req")
public class MyServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 请求中有请求方法,请求路径以及请求数据
         * ----------------------------------
         * 通过doGet方法参数1 HttpServletRequest req对象来获得请求数据
         * ps:当请求到达该类的这个方法时,该参数req就会被赋值,其中就有关于请求的所有东西
         */
        String method = req.getMethod( );
        String uri = req.getRequestURI( );
        StringBuffer url = req.getRequestURL( );
        System.out.println("method = " +  method);
        System.out.println("uri = " +  uri);// uri资源标识符
        System.out.println("url = " +  url);// url资源定位符

        // ===============获得请求数据[重点]===================
        /**
         * 获得请求参数的方法是
         * req.getParameter("key"); key就是前端标签name值
         * [重点:] 后端获得的数据全都是字符串,如果需要后续使用,
         * 还需按照性质做相应的转换
         * 比如: 字符串转数字,字符串转日期
         */
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String sex = req.getParameter("sex");
        // int i = Integer.parseInt(sex);

        String birthday = req.getParameter("birthday");
        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // try {
        //     Date parse = sdf.parse(birthday);
        // } catch (ParseException e) {
        //     e.printStackTrace( );
        // }

        String xl = req.getParameter("xl");
        System.out.println("username = " +  username);
        System.out.println("password = " +  password);
        System.out.println("sex = " +  sex);
        System.out.println("birthday = " +  birthday);
        System.out.println("xl = " +  xl);


        // 多选框使用getParameterValues()
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println("hobby = " + hobby );
        }

    }
}

总结:

  • req.getParameter(“”) 能获得请求数据
  • req.getParameterValues(“”) 能获得请求数据

1.3 配置web.xml

注解开发,不需要配置

1.4 部署项目

1.5 启动测试

复习回顾

前端
html,css,js/jq

后端服务器:

1开发架构有哪些:

  • b/s,
  • c/s

2服务器是干什么的?

  • 运行web项目项目容器
  • 接收请求,做出响应

3浏览器如何发出的请求

  • 常见的如,a标签,form表单
  • js中使用ajax发请求
  • vue中使用axios发请求

4发请求后如何与后端servlet类关联的?
(或者说绑定的?一一映射的?)

  • 没注解时,通过web.xml文件一一映射关联
  • 有注解,通过注解@WebServlet(“/路径”)中设置路径

5什么时候servlet类会执行doGet方法,什么时候执行doPost方法?

  • 前端发get,后端就执行doGet
  • 前端发post,后端就执行doPost

6写出完整的项目(假设项目命名his)http请求路径,以登录(login)请求为例

  • 协议://ip:端口/资源?k=v&k=v
  • jdbc:mysql://localhost:3306/java2313?useSSL=false&serverTimeZone=utc
  • http://localhost:8080/his/login?username=admin&password=123456

7画图, 请求处理的完整流程(javaweb开发流程)

8具体如何接收请求中的数据?

  • 通过HttpServletRequest对象接收请求中的数据
  • 通过req对象调用getParameter(“key”)

二、做出响应

做出响应是通过HttpServletResponse对象

  • 响应正文
    • 向浏览器展现的内容
package com.qf.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示接收请求数据,响应内容
 */
@WebServlet("/req")
public class MyServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // ....

        // ==================演示响应=======================
        /**
         * 响应是通过HttpServletResponse resp对象来完成
         * 响应可以设置响应内容(即展示在浏览器上的内容)
         * -----------------------------------------
         * ps: 其实响应也可以设置响应状态码,但是一般不需要,服务器会自动设置状态码
         * 但是需要知道一些常见状态码:
         * 200 成功, 404 资源未找到, 500 服务器内部错误,
         * 405 get/post请求方式不对,400 一般是数据解析出错了
         */
        // 响应乱码,在响应前设置编码格式
        resp.setContentType("text/html;charset=utf-8");
        // 响应是通过输出流的形式实现
        PrintWriter out = resp.getWriter( );
        //out.write("hello this is response - 这是响应");
        out.write("<html>");
        out.write("<head><title>响应</title></head>");
        out.write("<body>");
        out.write("<h1>这是响应的页面</h1>");
        out.write("<div style='color:red'>div</div>");
        out.write("<p style='color:red'>"+username+"</p>");
        out.write("</body>");
        out.write("</html>");
    }
}

三、乱码解决

请求乱码

 req.setCharacterEncoding("utf-8");

响应乱码

resp.setContentType("text/html;charset=utf-8");

四、 综合案例-登录(Servlet + JDBC)

  • 要求:实现登录功能
第一步: 先设计数据库
	库,表 (ORM,要根据表设置实体类)
登录页面
	html/jsp
	表单发送请求,携带数据
后台服务器代码
	servlet,接收数据
	jdbc+orm
	servlet,做出响应

4.0 项目结构[重点]

web开发有三层架构

  • 控制层 -servlet 流程控制,是指整个请求响应的流程
  • 业务层 - service - 是指在请求接收后,对数据按照需求处理
  • 数据访问层 - DataAccessObject - DAO

image-20230818145238992

三层架构

image-20230818150122062

4.1 数据库

CREATE TABLE `tb_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `money` double(10,2) DEFAULT NULL,
  `createTime` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

实体类 - ORM

需要创建一个包,专门存储实体类,一般命名pojo/entity/model

public class User {
    // 列名对属性名
    private int id;
    private String username;
    private String password;
    private String sex;
    private double money;
    private Date createTime;

    // set get 构造 toString
}

4.2 pom依赖

   <!-- 引入servlet依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <!-- 引入jsp依赖 -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
    </dependency> 
    <!-- mysql驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
     <!-- DbUtils依赖 -->
    <dependency>
      <groupId>commons-dbutils</groupId>
      <artifactId>commons-dbutils</artifactId>
      <version>1.7</version>
    </dependency>
    </dependency>

4.3 登录页面

index.jsp

<body>
<h2>登录</h2>
<form action="/login" method="post">
    用户名<input type="text" name="username"><br>
    密码<input type="password" name="password"><br>
    <input type="submit" value="提交"><br>
</form>
</body>

4.4 控制层Servlet

Servlet只负责接收请求数据,做出响应

如果要处理数据,那就调用业务层

package com.qf.servlet;

import com.qf.model.Admin;
import com.qf.service.AdminService;
import com.qf.service.AdminServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 命名
 * 功能+层
 * LoginServlet
 * LoginService
 * LoginDao
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 防止乱码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 1 接收请求数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");

 		// servlet调用service(业务层)
        LoginService service = new LoginService( );
        User user = service.login(username, password);

        // 做出响应
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter( );

        if (user != null) { // 登录成功
            writer.write("登录成功!");
            writer.write(user.toString());
        } else { // 登录失败
            writer.write("登录失败!用户名或密码错误");
        }
    }
}

4.5 业务层service

业务层就处理项目业务逻辑的,业务逻辑包含哪些内容?

  • 除了servlet接收请求做出响应以及jdbc操作数据库的代码,其他全是业务逻辑
    • 加密解密
    • 处理上传下载excel表格
    • 处理项目中数据格式
    • 计算项目中涉及金额
    • 缓存处理
    • 购物车,订单,支付
    • 短信,验证码,定时调度,推送
    • …等等

业务层代码编码

  • 需要创建包结构service

LoginService

public class LoginService {

    /**
     * 业务层要定义方法,能接收数据,处理后返回数据
     * -----
     * 登录一般返回的是实体类
     * - 登录成功,返回实体类对象中有数据
     * - 登录失败,返回实体类对象是null
     * ----------------------
     * 业务层需要调用数据层 操作数据库
     */
    public User login(String username, String password){

        // 处理业务
        // ...
        // 处理后,要将数据继续传递给dao层
        LoginDao loginDao = new LoginDao( );
        User user = loginDao.login(username, password);

        return user;
    }
}

4.6 数据访问层dao

数据访问层 Data Access Object - DAO

项目需要创建dao层代码专门操作数据库

dao层编码

LoginDao

public class LoginDao {

    public User login(String username,String password) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java23132?useSSL=false", "root", "123456");
            ps = conn.prepareStatement("select * from tb_user where username = ? and password = ?");
            ps.setString(1,username);
            ps.setString(2,password);

           rs = ps.executeQuery( );
            while (rs.next()) {
                User user = new User( );
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setSex(rs.getString("sex"));
                user.setMoney(rs.getDouble("money"));
                user.setCreateTime(rs.getDate("createTime"));
                return user;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                rs.close();
                ps.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace( );
            }
        }
        return null;
    }
}

4.7 测试

登录页面

image-20230523162257066

登录成功

image-20231120143529612

登录失败

image-20231120143524446

4.8 总结

重点

  • 熟悉开发的流程
  • 熟记开发架构 (控制层,业务层,数据访问层)
  • 响应拼接页面方式,了解即可
  • 前后端发请求,做响应

经验总结

1 写项目不要照抄,应该按照流程一步一步写
(前端–>servlet–>service–>dao–>service—>servlet–>前端)

2 学会看异常

  • 前端页面报错404,405,500
  • 后端控制台要查看异常(注意几个关键词,Exception,error,caused by ,at …)

3 逻辑bug

  • 前端页面没有报错,后端控制台有没有报错,但是结果不对
  • 这就是bug,该怎么解决?
  • 从头(按照流程)读,检查代码,去输出,高端玩家打断点

4 如果确定前端,后端,数据库都没问题,考虑缓存

  • idea缓存(file-invalidate cache)(删除target文件夹)
  • 浏览器缓存(清空)

5 学会倒推

五、注册功能

(如何写需求?建议当做用户,见到什么写什么,需要什么写什么)

注册 —> 向数据库插入数据

5.1 跳转注册

5.2 注册页面

5.3 发请求,后端Servlet接收

注意接收的中文防止乱码

5.4 UserService

注意: 将之前的LoginService重命名为UserService,因为一个类中可以定义多个方法,不需要创建很多类

5.5 UserDao

注意日期bug,只能是java.sql.Date类型

5.6 UserDao返回给UserService

5.7 UserService在返回给RegistServlet

5.8 Servlet根据结果做响应

六、作业-查询全部

登录成功后查询全部,并展示全部

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode:914. 卡牌分组(python3解法)

难度&#xff1a;简单 给定一副牌&#xff0c;每张牌上都写着一个整数。 此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌按下述规则分成 1 组或更多组&#xff1a; 每组都有 X 张牌。组内所有的牌上都写着相同的整数。 仅当你可选的 X > 2 时返回 tru…

作为测试你连K8S都不懂,你还有脸说自己是测试?

kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替中间 8 个字符 “ubernete” 而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful)&#xff0c;Kuberne…

vue3之echarts区域折线图

vue3之echarts区域折线图 效果&#xff1a; 核心代码&#xff1a; <template><div class"abnormal"><div class"per">单位&#xff1a;{{ obj.data?.unit }}</div><div class"chart" ref"chartsRef"&g…

如何在Linux以docker-compose方式快速部署运行StackEdit,并实现公网访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

井下特种兵——智能管网监测终端

深入井下&#xff0c;守护每一滴水的智慧——井下特种兵&#xff0c;智能管网监测终端 你是否曾为地下管网的监测和维护感到困扰&#xff1f;现在&#xff0c;我们向你介绍一款强大的井下特种兵——智能管网监测终端。这是一款专门为解决地下管网监测难题而设计的智能设备&…

单/三相dq解耦控制与特定次谐波抑制

1. 单相整流器dq坐标系下建模 单相整流器的拓扑如图所示&#xff0c;可知 u a b u s − L d i s d t − R i s {u_{ab}} {u_{s}} - L\frac{{d{i_s}}}{{dt}} - R{i_s} uab​us​−Ldtdis​​−Ris​。   将电压和电流写成dq的形式。 { u s U s m sin ⁡ ( ω t ) i s I …

FPGA_探针(ISSP)调试工具

探针则是将 FPGA 内部的节点信号通过 JTAG 电缆传输到 PC 机上&#xff0c;方便用户观察。对于一些变化比较缓慢或者实时性要求不高的信号&#xff0c;使用该工具调试非常的方便&#xff0c;例如观察 ADC 的采样结果。 为了更便捷地进行板级调试&#xff0c;这里介绍 Qusrtus …

前端本地存储数据库IndexedDB

前端本地存储数据库IndexedDB 1、前言2、什么是 indexedDB&#xff1f;3、什么是 localForage&#xff1f;4、localForage 的使用5、VUE 推荐使用 Pinia 管理 localForage 1、前言 前端本地化存储算是一个老生常谈的话题了&#xff0c;我们对于 cookies、Web Storage&#xff…

键盘控制ROS车运动

键盘控制ROS车运动 上位机 使用pyseria库与stm32单片机进行通信控制 #!/usr/bin/env python # -*- coding: utf-8 -*import sys, select, termios, tty import serialmsg """ ---------------------------w a x ds w : x a : y s : -x …

NX二次开发UF_CAM_ask_cam_preferences 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_cam_preferences Defined in: uf_cam.h int UF_CAM_ask_cam_preferences(UF_CAM_preferences_p_t prefs ) overview 概述 This function provides the current settings of the CAM pre…

2024一定要看的文章系列!!!接口自动化测试框架思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具&#xff0c;并可以用来“驱动&#xff02;待测应用程序和数据的测试脚本代码&#xff0c;关键字驱动测试看上去与手工测…

Leetcode 153. 寻找旋转排序数组中的最小值

class Solution {//因为最小值和最大值总是相邻的&#xff08;除了初始状态&#xff09;//1.用二分查找&#xff0c;如果右侧是有序则最小值在左侧//2.如果右侧无序则最小值在右侧//如果mid正好是最小值&#xff0c;那么右侧自然是有序的&#xff0c;//为了将mid加入到搜索的一…

如何用内容营销推动企业成长?媒介盒子教你三步实现

信息时代下每个人都能通过网络了解自己所需的信息&#xff0c;企业与受众的接触也更加直接&#xff0c;企业在获得更多消费者触达通道的同时&#xff0c;消费者也在经历信息爆炸和碎片化&#xff0c;如何在大量信息中脱颖而出&#xff0c;抓住消费者心智&#xff0c;成为许多品…

外卖小程序系统:数字化餐饮的编码之道

在当今数字化时代&#xff0c;外卖小程序系统成为了餐饮业的一项技术巨制。这个系统不仅提供了便捷的点餐体验&#xff0c;更通过先进的技术手段&#xff0c;实现了高效订单处理、实时配送追踪以及个性化推荐。让我们深入了解外卖小程序系统的技术魔法&#xff0c;一起揭秘数字…

API接口接入1688电商数据平台获取商品详情数据示例

1688电商数据平台是一个提供海量商品信息的数据平台&#xff0c;通过API接口可以方便地获取商品详情数据。以下是一个示例&#xff0c;演示如何接入1688电商数据平台&#xff0c;获取商品详情数据。 步骤一&#xff1a;注册1688账号并获取API权限 首先需要在1688电商数据平台…

ArkTS编程语法基础,让你成为HarmonyOS开发高手

文章目录 ArkTS简介ArkUI开发框架的整体架构ArkTS的基础类型条件语句函数类模块函数定义函数的参数箭头函数 迭代器后续学习资源介绍 ArkTS简介 ArkTS是HarmonyOS主力应用开发语言。它在TypeScript (简称TS)的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态…

防火墙..

目录 1.什么是防火墙 1.1分类 1.2.Netfilter(数据包过滤) 1.2.1定义 1.2.2Netfilter分析内容 1.3防火墙无法完成的任务 1.4iptables 与firewalld区别 2.iptables 2.1iptables执行原则 2.1.1原则 2.1.2防火墙规则 2.2规则链 2.2.1概念 2.2.2分析 2.2.3规则链分类…

leetcode:反转链表

题目描述 题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 分析题目 思路一 我们可以设计算法让整个链表掉头 定义三个代码n1,n2,n3 n1指向NULL&#xff0c;n2指向head&#xff0c;n3指向第二个结点 当n2不为NULL的时候&#xff0c;让n2->ne…

fastdfs-client-java-1.30 maven 打包安装

1. 进入源代码目录&#xff0c;打开cmd mvn clean install 或者 mvn package 问题不大的话会在同级目录target目录下生成打包后文件 2. 当前目录下cmd进行maven安装 mvn install:install-file -DgroupIdorg.csource -DartifactIdfastdfs-client-java -Dversion${version} -D…