11、Javaweb_JSPMVCELJSTL三层架构用户列表案例

news2024/11/19 3:42:27

JSP:

1. 指令
    * 作用:用于配置JSP页面,导入资源文件
    * 格式:
        <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
    * 分类:
        1. page        : 配置JSP页面的
            * contentType:等同于response.setContentType()
                1. 设置响应体的mime类型以及字符集
                2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
            * import:导包
            * errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
            * isErrorPage:标识当前也是是否是错误页面。
                * true:是,可以使用内置对象exception
                * false:否。默认值。不可以使用内置对象exception

发生异常,跳转错误页面

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=gbk" errorPage="500.jsp"   pageEncoding="GBK" language="java" buffer="16kb" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%

    List list = new ArrayList();
    int i = 3/0;

  %>
  </body>
</html>

被跳转的错误页面:
 

<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>服务器正忙...</h1>
    <%
        String message = exception.getMessage();
        out.print(message);

    %>
</body>
</html>

2. include    : 页面包含的。导入页面的资源文件
            * <%@include file="top.jsp"%>
        3. taglib    : 导入资源
            * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
                * prefix:前缀,自定义的
2. 注释:
    1. html注释:
        <!-- -->:只能注释html代码片段,并且注释信息会发送到响应体中
    2. jsp注释:推荐使用
        <%-- --%>:可以注释所有,并且注释信息不回发送到响应体中

导入资源文件

<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<%@include file="top.jsp"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <!--
        <h1>hello</h1>
    -->
    <%--
        <%
            System.out.println("hi~~~~");
        %>
    --%>
<%--

    <input>
--%>
    <%
        pageContext.setAttribute("msg","hello");

    %>
    <%=pageContext.getAttribute("msg")%>

</body>
</html>

被导入资源文件:top.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>页面logo页面标题</h1>

3. 内置对象
    * 在jsp页面中不需要创建,直接使用的对象
//C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.3\tomcat\bc4f368a-2989-4a92-9ce4-f5e65d925d89\work\Catalina\localhost\ROOT\org\apache\jsp\_500_jsp.java
    * 一共有9个:
            变量名                    真实类型                        作用
        * pageContext                PageContext                    当前页面共享数据,还可以获取其他八个内置对象
        * request                    HttpServletRequest            一次请求访问的多个资源(转发)
        * session                    HttpSession                    一次会话的多个请求间
        * application                ServletContext                所有用户间共享数据
        * response                    HttpServletResponse            响应对象
        * page                        Object                        当前页面(Servlet)的对象  this
        * out                        JspWriter                    输出对象,数据输出到页面上
        * config                    ServletConfig                Servlet的配置对象
        * exception                    Throwable                    异常对象

MVC:开发模式

1. jsp演变历史
    1. 早期只有servlet,只能使用response输出标签数据,非常麻烦
    2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html表,造成难于维护,难于分工协作
    例如:在jsp中把HTML,CSS,JavaScript,Java代码写在一个页面,并且html嵌套在Java代码中,html还嵌套在for循环中,前端人员不易读懂代码,只有开发人员自己能够维护. 只有开发人员自己写的时候方便,不利于分工协作
    3. 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性

2. MVC:
    1. M:Model,模型。JavaBean
        * 完成具体的业务操作,如:查询数据库,封装对象
    2. V:View,视图。JSP
        * 展示数据
    3. C:Controller,控制器。Servlet
        * 获取用户的输入
        * 调用模型
        * 将数据交给视图进行展示

* 优缺点:
        1. 优点:
            1. 耦合性低,方便维护,可以利于分工协作
            2. 重用性高

        2. 缺点:
            1. 使得项目架构变得复杂,对开发人员要求高

EL表达式

1. 概念:Expression Language 表达式语言
2. 作用:替换和简化jsp页面中java代码的编写
3. 语法:${表达式}
4. 注意:
    * jsp默认支持el表达式的。如果要忽略el表达式
        1. 设置jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
        2. \${表达式} :忽略当前这个el表达式

5. 使用:
    1. 运算:
        * 运算符:
            1. 算数运算符: + - * /(div) %(mod)
            2. 比较运算符: > < >= <= == !=
            3. 逻辑运算符: &&(and) ||(or) !(not)
            4. 空运算符: empty
                * 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
                * ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
                * ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"   %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${3 > 4}

    \${3 > 4}
<hr>
    <h3>算数运算符</h3>
    ${3 + 4}<br>
    ${3 / 4}<br>
    ${3 div 4}<br>
    ${3 % 4}<br>
    ${3 mod 4}<br>
    <h3>比较运算符</h3>
    ${3 == 4}<br>

    <h3>逻辑运算符</h3>
    ${3 > 4  && 3 < 4}<br>
    ${3 > 4  and 3 < 4}<br>
    
    <h4>empty运算符</h4>
<%

    String str = "";
    request.setAttribute("str",str);

    List list = new ArrayList();
    request.setAttribute("list",list);

%>
    ${not empty str}

    ${not empty list}
</body>
</html>


    2. 获取值
        1. el表达式只能从域对象中获取值
        2. 语法:
            1. ${域名称.键名}:从指定域中获取指定键的值
                * 域名称:
                    1. pageScope        --> pageContext
                    2. requestScope     --> request
                    3. sessionScope     --> session
                    4. applicationScope --> application(ServletContext)
                * 举例:在request域中存储了name=张三
                * 获取:${requestScope.name}

            2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el获取域中的数据</title>
</head>
<body>


    <%
        //在域中存储数据
        session.setAttribute("name","李四");

        request.setAttribute("name","张三");
        session.setAttribute("age","23");

        request.setAttribute("str","");

    %>

<h3>el获取值</h3>
${requestScope.name}
${sessionScope.age}
${sessionScope.haha}

${name}
${sessionScope.name}




</body>
</html>

    3. 获取对象、List集合、Map集合的值
                1. 对象:${域名称.键名.属性名}
                    * 本质上会去调用对象的getter方法

                2. List集合:${域名称.键名[索引]}

                3. Map集合:
                    * ${域名称.键名.key名称}
                    * ${域名称.键名["key名称"]}

<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el获取数据</title>
</head>
<body>

    <%
        User user = new User();
        user.setName("张三");
        user.setAge(23);
        user.setBirthday(new Date());


        request.setAttribute("u",user);


        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add(user);

        request.setAttribute("list",list);


        Map map = new HashMap();
        map.put("sname","李四");
        map.put("gender","男");
        map.put("user",user);

        request.setAttribute("map",map);

    %>

<h3>el获取对象中的值</h3>
${requestScope.u}<br>

<%--
    * 通过的是对象的属性来获取
        * setter或getter方法,去掉set或get,在将剩余部分,首字母变为小写。
        * setName --> Name --> name
--%>

    ${requestScope.u.name}<br>
    ${u.age}<br>
    ${u.birthday}<br>
    ${u.birthday.month}<br>

    ${u.birStr}<br>

    <h3>el获取List值</h3>
    ${list}<br>
    ${list[0]}<br>
    ${list[1]}<br>
    ${list[10]}<br>

    ${list[2].name}

    <h3>el获取Map值</h3>
    ${map.gender}<br>
    ${map["gender"]}<br>
    ${map.user.name}

</body>
</html>

3. 隐式对象:
        * el表达式中有11个隐式对象
        * pageContext:
            * 获取jsp其他八个内置对象
                * ${pageContext.request.contextPath}:动态获取虚拟目录

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el隐式对象</title>
</head>
<body>


    ${pageContext.request}<br>
    <h4>在jsp页面动态获取虚拟目录</h4>
    ${pageContext.request.contextPath}

<%


%>
</body>
</html>

JSTL

1. 概念:JavaServer Pages Tag Library  JSP标准标签库
    * 是由Apache组织提供的开源的免费的jsp标签        <标签>

2. 作用:用于简化和替换jsp页面上的java代码        

3. 使用步骤:
    1. 导入jstl相关jar包

jstl-impl.jar
javax.servlet.jsp.jstl.jar

    2. 引入标签库:taglib指令:  <%@ taglib %>
    3. 使用标签

4. 常用的JSTL标签
    1. if:相当于java代码的if语句
        1. 属性:
            * test 必须属性,接受boolean表达式
                * 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
                * 一般情况下,test属性值会结合el表达式一起使用
            2. 注意:
                * c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>if标签</title>
</head>
<body>

    <%--

    c:if标签
        1. 属性:
            * test 必须属性,接受boolean表达式
                * 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
                * 一般情况下,test属性值会结合el表达式一起使用

        2. 注意:c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签


    --%>

    <c:if test="true">
        <h1>我是真...</h1>
    </c:if>
    <br>

    <%
        //判断request域中的一个list集合是否为空,如果不为null则显示遍历集合

        List list = new ArrayList();
        list.add("aaaa");
        request.setAttribute("list",list);

        request.setAttribute("number",4);

    %>

    <c:if test="${not empty list}">
        遍历集合...

    </c:if>
    <br>

    <c:if test="${number % 2 != 0}">

            ${number}为奇数

    </c:if>

    <c:if test="${number % 2 == 0}">

        ${number}为偶数

    </c:if>

</body>
</html>


    2. choose:相当于java代码的switch语句
        1. 使用choose标签声明                     相当于switch声明
        2. 使用when标签做判断                     相当于case
        3. 使用otherwise标签做其他情况的声明        相当于default

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

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>choose标签</title>
</head>
<body>

    <%--
        完成数字编号对应星期几案例
            1.域中存储一数字
            2.使用choose标签取出数字         相当于switch声明
            3.使用when标签做数字判断         相当于case
            4.otherwise标签做其他情况的声明  相当于default
    --%>

    <%
        request.setAttribute("number",51);
    %>

    <c:choose>
        <c:when test="${number == 1}">星期一</c:when>
        <c:when test="${number == 2}">星期二</c:when>
        <c:when test="${number == 3}">星期三</c:when>
        <c:when test="${number == 4}">星期四</c:when>
        <c:when test="${number == 5}">星期五</c:when>
        <c:when test="${number == 6}">星期六</c:when>
        <c:when test="${number == 7}">星期天</c:when>

        <c:otherwise>数字输入有误</c:otherwise>
    </c:choose>


</body>
</html>

    3. foreach:相当于java代码的for语句

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>foreach标签</title>
</head>
<body>

<%--

    foreach:相当于java代码的for语句
        1. 完成重复的操作
            for(int i = 0; i < 10; i ++){

            }
            * 属性:
                begin:开始值
                end:结束值
                var:临时变量
                step:步长
                varStatus:循环状态对象
                    index:容器中元素的索引,从0开始
                    count:循环次数,从1开始
        2. 遍历容器
            List<User> list;
            for(User user : list){

            }

            * 属性:
                items:容器对象
                var:容器中元素的临时变量
                varStatus:循环状态对象
                    index:容器中元素的索引,从0开始
                    count:循环次数,从1开始


--%>

<c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
    ${i} <h3>${s.index}<h3> <h4> ${s.count} </h4><br>

</c:forEach>

    <hr>


    <%
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        request.setAttribute("list",list);


    %>

    <c:forEach items="${list}" var="str" varStatus="s">

            ${s.index} ${s.count} ${str}<br>

    </c:forEach>


</body>
</html>

5. 练习:
    * 需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中

<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>test</title>
</head>
<body>

<%

    List list = new ArrayList();
    list.add(new User("张三",23,new Date()));
    list.add(new User("李四",24,new Date()));
    list.add(new User("王五",25,new Date()));

    request.setAttribute("list",list);


%>

<table border="1" width="500" align="center">
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>生日</th>
    </tr>
    <%--数据行--%>
    <c:forEach items="${list}" var="user" varStatus="s">

        <c:if test="${s.count % 2 != 0}">

            <tr bgcolor="red">
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.birStr}</td>
            </tr>
        </c:if>

        <c:if test="${s.count % 2 == 0}">

            <tr  bgcolor="green">
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.birStr}</td>
            </tr>
        </c:if>




    </c:forEach>

</table>






</body>
</html>

三层架构:软件设计架构

1. 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
2. 业务逻辑层:处理业务逻辑的。
3. 数据访问层:操作数据存储文件。

案例:用户信息列表展示

1. 需求:用户信息的增删改查操作

导入包

bootstrap.css
bootstrap-theme.css
bootstrap.js
bootstrap.min.js
jquery-2.1.0.min.js

glyphicons-halflings-regular.eot
glyphicons-halflings-regular.svg
glyphicons-halflings-regular.ttf
glyphicons-halflings-regular.woff
glyphicons-halflings-regular.woff2

导入jar包
spring-tx-4.2.4.RELEASE.jar
spring-jdbc-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-beans-4.2.4.RELEASE.jar
mysql-connector-java-8.0.18.jar
mysql-connector-java-5.1.18-bin.jar
jstl-impl.jar
javax.servlet.jsp.jstl.jar
druid-1.0.9.jar
commons-logging-1.1.1.jar
commons-beanutils-1.8.3.jar
c3p0-0.9.1.2.jar
2. 设计:
    1. 技术选型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat
    2. 数据库设计:
        create database day17; -- 创建数据库
        use day17;                -- 使用数据库

  create table user(   -- 创建表
            id int primary key auto_increment,
            name varchar(20) not null,
            gender varchar(5),
            age int,
            address varchar(32),
            qq    varchar(20),
            email varchar(50),
            username varchar(32),
            password varchar(32)
        );

insert into user(name,gender,age,address,qq,email,username,password) values
("张三","男",27,"广东","2345857","123@qq.com","zhangsan","123456"),
("李四","男",37,"北京","23458572","1223@qq.com","lisi","123456"),
("王五","男",29,"上海","2345817","1883@qq.com","wangwu","123456"),
("小七","女",22,"广东","2345257","1111@qq.com","xiaoqi","123456"),
("小九","女",23,"四川","23225257","x666@qq.com","xiaojiu","123456"),
("大九","女",23,"四川","23225257","d666@qq.com","dajiu","123456"),
("三九","女",23,"四川","23225257","s666@qq.com","sanjiu","123456"),
("四九","女",23,"四川","23225257","ss666@qq.com","sijiu","123456"),
("五九","女",23,"四川","23225257","w666@qq.com","wujiu","123456"),
("六九","女",23,"四川","23225257","l666@qq.com","liujiu","123456"),
("七九","女",23,"四川","23225257","q666@qq.com","qijiu","123456"),
("八九","女",23,"四川","23225257","b666@qq.com","bajiu","123456");

3. 开发:
    1. 环境搭建
        1. 创建数据库环境
        2. 创建项目,导入需要的jar包

    2. 编码

4. 测试
5. 部署运维

 视图资源

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8"/>
  <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
  <title>首页</title>

  <!-- 1. 导入CSS的全局样式 -->
  <link href="css/bootstrap.min.css" rel="stylesheet">
  <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  <script src="js/jquery-2.1.0.min.js"></script>
  <!-- 3. 导入bootstrap的js文件 -->
  <script src="js/bootstrap.min.js"></script>
  <script type="text/javascript">
  </script>
</head>
<body>
<div align="center">
  <a
          href="${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息
  </a>
</div>
</body>
</html>

list.jsp

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

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户信息管理系统</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>

        <c:forEach items="${users}" var="user" varStatus="s">
            <tr>
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.gender}</td>
                <td>${user.age}</td>
                <td>${user.address}</td>
                <td>${user.qq}</td>
                <td>${user.email}</td>
<%--                <td><a class="btn btn-default btn-sm" href="update.jsp">修改</a>&nbsp;--%>
                <td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/userFindServlet?name=${user.name}">修改</a>&nbsp;
                    <a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/userDeleteServlet?name=${user.name}">删除</a></td>
            </tr>

        </c:forEach>


        <tr>
            <td colspan="8" align="center"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a></td>
        </tr>
    </table>
</div>
</body>
</html>

add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- HTML5文档-->
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>添加用户</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <center><h3>添加联系人页面</h3></center>
    <form action="${pageContext.request.contextPath}/userAddServlet" method="post">
        <div class="form-group">
            <label for="name">姓名:</label>
            <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
        </div>

        <div class="form-group">
            <label>性别:</label>
            <input type="radio" name="gender" value="男" checked="checked"/>男
            <input type="radio" name="gender" value="女"/>女
        </div>

        <div class="form-group">
            <label for="age">年龄:</label>
            <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
        </div>

        <div class="form-group">
            <label for="address">籍贯:</label>
            <select name="address" class="form-control" id="address">
                <option value="广东">广东</option>
                <option value="广西">广西</option>
                <option value="湖南">湖南</option>
            </select>
        </div>

        <div class="form-group">
            <label for="qq">QQ:</label>
            <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
        </div>

        <div class="form-group">
            <label for="email">Email:</label>
            <input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
        </div>

        <div class="form-group" style="text-align: center">
            <input class="btn btn-primary" type="submit" value="提交" />
            <input class="btn btn-default" type="reset" value="重置" />
            <input class="btn btn-default" type="button" value="返回" />
        </div>
    </form>
</div>
</body>
</html>

update.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
    <head>

<%--    	<base href="<%=basePath%>"/>--%>
        <!-- 指定字符集 -->
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>修改用户</title>

        <link href="css/bootstrap.min.css" rel="stylesheet">
        <script src="js/jquery-2.1.0.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
        
    </head>
    <body>
        <div class="container" style="width: 400px;">
        <h3 style="text-align: center;">修改联系人</h3>
        <form action="${pageContext.request.contextPath}/userUpdateServlet" method="post">
          <div class="form-group">
            <label for="name">姓名:</label>
            <input type="text" class="form-control" id="name" name="name"  readonly="readonly" value="${user.name}" placeholder="${user.name}" />
          </div>

          <div class="form-group">
            <label>性别:</label>
              <input type="radio" name="gender" value="男"    <c:if test="${user.gender=='男'}">checked</c:if>/>男
                <input type="radio" name="gender" value="女" <c:if test="${user.gender=='女'}">checked</c:if> />女
          </div>

          <div class="form-group">
            <label for="age">年龄:</label>
            <input type="text" class="form-control" id="age"  name="age" placeholder="请输入年龄" value="${user.age}" />
          </div>

          <div class="form-group">
            <label for="address">籍贯:</label>
             <select id="address" name="address" class="form-control" >
                <option value="广东">广东</option>
                <option value="广西">广西</option>
                <option value="湖南">湖南</option>
                 <option value="北京">北京</option>
                 <option value="上海">上海</option>
            </select>
          </div>

          <div class="form-group">
            <label for="qq">QQ:</label>
            <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码" value="${user.qq}"/>
          </div>

          <div class="form-group">
            <label for="email">Email:</label>
            <input type="text" class="form-control" id="email" name="email" value="${user.email}" placeholder="请输入邮箱地址"/>
          </div>

             <div class="form-group" style="text-align: center">
                <input class="btn btn-primary" type="submit" value="提交" />
                <input class="btn btn-default" type="reset" value="重置" />
                <input class="btn btn-default" type="button" value="返回"/>
             </div>
        </form>
        </div>
    </body>
</html>

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title>管理员登录</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <script type="text/javascript">
    </script>
  </head>
  <body>
  <script>
        window.onload = function(){
            document.getElementById("img").onclick = function(){
                this.src="${pageContext.request.contextPath}/checkCodeServlet?time="+new Date().getTime();
            }
        }


    </script>
  	<div class="container" style="width: 400px;">
  		<h3 style="text-align: center;">管理员登录</h3>
        <form action="${pageContext.request.contextPath}/loginServlet" method="post">
	      <div class="form-group">
	        <label for="user">用户名:</label>
	        <input type="text" name="user" class="form-control" id="user" placeholder="请输入用户名"/>
	      </div>
	      
	      <div class="form-group">
	        <label for="password">密码:</label>
	        <input type="password" name="password" class="form-control" id="password" placeholder="请输入密码"/>
	      </div>
	      
	      <div class="form-inline">
	        <label for="vcode">验证码:</label>
	        <input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>
	        <a href="javascript:refreshCode()"><img id="img" src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/></a>
	      </div>
	      <hr/>
	      <div class="form-group" style="text-align: center;">
	        <input class="btn btn btn-primary" type="submit" value="登录">
	       </div>
	  	</form>
		
		<!-- 出错显示的信息框 -->
	  	<div class="alert alert-warning alert-dismissible" role="alert">
		  <button type="button" class="close" data-dismiss="alert" >
		  	<span>&times;</span></button>
		   <strong>登录失败!</strong>
			<div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%></div>
			<div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %></div>
		</div>
  	</div>
  </body>
</html>

druid.properties        jdbc配置文件

#driverClassName=com.mysql.jdbc.Driver
driverClassName=com.mysql.cj.jdbc.Driver
#url=jdbc:mysql:///day17
url=jdbc:mysql:///db?serverTimezone=UTC
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000

JDBCUtils        工具类

/**
 * JDBC工具类 使用Durid连接池
 */
public class JDBCUtils {

    private static DataSource ds ;

    static {

        try {
            //1.加载配置文件
            Properties pro = new Properties();
            //使用ClassLoader加载配置文件,获取字节输入流
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);
            //2.初始化连接池对象
            ds = DruidDataSourceFactory.createDataSource(pro);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接池对象
     */
    public static DataSource getDataSource(){
        return ds;
    }


    /**
     * 获取连接Connection对象
     */
    public static Connection getConnection() throws SQLException {
        return  ds.getConnection();
    }
}

User类

public class User {
    private int id;
    private String name;
    private String gender;
    private int age;
    private String address;
    private String qq;
    private String email;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getQq() {
        return qq;
    }

    public void setQq(String qq) {
        this.qq = qq;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", qq='" + qq + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

UserDao 接口

/**
 * 用户操作的DAO
 */
public interface UserDao {
    public List<User> findAll();
    public User userAdd(User u);
    public String userDelete(String name);
    public Map<String, Object> userFind(String name);
    public boolean userUpdate(User user);
}

UserDaoImpl        实现类

public class UserDaoImpl implements UserDao {

    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public List<User> findAll() {
        //使用JDBC操作数据库...
        //1.定义sql
        String sql = "select * from user";
        List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));

        return users;
    }
    @Override
    public Map<String, Object> userFind(String name) {
        String sql="select name,gender,age,address,qq,email from user where name = ?";
        Map<String, Object> map = template.queryForMap(sql, name);
        return map;
    }

    @Override
    public User userAdd(User adduser) {
        String sql = "insert into user (name,gender,age,address,qq,email) values(?,?,?,?,?,?)";
        template.update(sql, adduser.getName(),adduser.getGender(),adduser.getAge(),
                adduser.getAddress(),adduser.getQq(),adduser.getEmail());
        return null;
    }

    @Override
    public String userDelete(String name) {
        String sql="delete from user where name = ?";
        template.update(sql,name);
        return null;
    }
    @Override
    public boolean userUpdate(User user) {
        String sql = "update user set gender = ?,age=?,address=?,qq=?,email=? where name = ?";
        template.update(sql,user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getName());
        return true;
    }

}

UserService 业务接口

/**
 * 用户管理的业务接口
 */
public interface UserService {

    /**
     * 查询所有用户信息
     * @return
     */
    public List<User> findAll();
    public User userAdd(User u);
    public String userDelete(String name);
    public Map<String, Object> userFind(String name);
    public boolean userUpdate(User user);

}

UserServiceImpl       实现类

public class UserServiceImpl implements UserService {
    private UserDao dao = new UserDaoImpl();

    @Override
    public List<User> findAll() {
        //调用Dao完成查询
        return dao.findAll();
    }

    @Override
    public User userAdd(User u) {
        return dao.userAdd(u);
    }

    @Override
    public String userDelete(String name) {
        return dao.userDelete(name);
    }

    @Override
    public Map<String, Object> userFind(String name) {
        return dao.userFind(name);
    }

    @Override
    public boolean userUpdate(User user) {
        return dao.userUpdate(user);
    }
}

UserListServlet 查询所有

@WebServlet("/userListServlet")
public class UserListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.调用UserService完成查询
        UserService service = new UserServiceImpl();
        List<User> users = service.findAll();
        //2.将list存入request域
        request.setAttribute("users",users);

        //3.转发到list.jsp

        request.getRequestDispatcher("/list.jsp").forward(request,response);

        HttpSession session = request.getSession();
        Cookie c = new Cookie("JSESSIONID", session.getId());
        c.setMaxAge(60*30);
        response.addCookie(c);
        session.setAttribute("users",users);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

UserAddServlet         添加联系人

@WebServlet("/userListServlet")
public class UserListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.调用UserService完成查询
        UserService service = new UserServiceImpl();
        List<User> users = service.findAll();
        //2.将list存入request域
        request.setAttribute("users",users);

        //3.转发到list.jsp

        request.getRequestDispatcher("/list.jsp").forward(request,response);

        HttpSession session = request.getSession();
        Cookie c = new Cookie("JSESSIONID", session.getId());
        c.setMaxAge(60*30);
        response.addCookie(c);
        session.setAttribute("users",users);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

UserDeleteServlet
 

@WebServlet(name = "userAddServlet", value = "/userAddServlet")
class UserAddServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

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

        request.setCharacterEncoding("utf-8");
        Map<String, String[]> map = request.getParameterMap();
        User u = new User();
        try {
            BeanUtils.populate(u,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        UserServiceImpl service = new UserServiceImpl();
        service.userAdd(u);

    }
}

UserFindServlet         查询单个联系人
 

@WebServlet(name = "userFindServlet", value = "/userFindServlet")
public class UserFindServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("name");
        //1.调用UserService完成查询
        HttpSession session = request.getSession();
        List<User> users =(List<User>) session.getAttribute("users");
        if (users != null){
            for (User u:users){
                if(name.equals(u.getName())){
                    request.setAttribute("user",u);
                    request.getRequestDispatcher("/update.jsp").forward(request,response);
                    return ;
                }
            }
        }else{
            UserServiceImpl service = new UserServiceImpl();

            Map<String, Object> map = service.userFind(name);
            User user = new User();
            try {
                BeanUtils.populate(user,map);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            request.setAttribute("user",user);
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        }
    }
}

UserUpdateServlet        修改联系人信息
 

@WebServlet(name = "userUpdateServlet", value = "/userUpdateServlet")
public class UserUpdateServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        Map<String, String[]> map = request.getParameterMap();
        User u = new User();
        try {
            BeanUtils.populate(u,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        UserServiceImpl service = new UserServiceImpl();
        service.userUpdate(u);
        request.getRequestDispatcher("/index.jsp").forward(request,response);
    }
}

LoginServlet         登录        登录未连数据库,只有验证码刷新

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置request编码
        request.setCharacterEncoding("utf-8");
        //2.获取参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String checkCode = request.getParameter("checkCode");
        //3.先获取生成的验证码
        HttpSession session = request.getSession();
        String checkCode_session = (String) session.getAttribute("checkCode_session");
        //删除session中存储的验证码
        session.removeAttribute("checkCode_session");
        //3.先判断验证码是否正确
        if(checkCode_session!= null && checkCode_session.equalsIgnoreCase(checkCode)){
            //忽略大小写比较
            //验证码正确
            //判断用户名和密码是否一致
            if("zhangsan".equals(username) && "123".equals(password)){//需要调用UserDao查询数据库
                //登录成功
                //存储信息,用户信息
                session.setAttribute("user",username);
                //重定向到success.jsp
                response.sendRedirect(request.getContextPath()+"/success.jsp");
            }else{
                //登录失败
                //存储提示信息到request
                request.setAttribute("login_error","用户名或密码错误");
                //转发到登录页面
                request.getRequestDispatcher("/login.jsp").forward(request,response);
            }


        }else{
            //验证码不一致
            //存储提示信息到request
            request.setAttribute("cc_error","验证码错误");
            //转发到登录页面
            request.getRequestDispatcher("/login.jsp").forward(request,response);

        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

CheckCodeServlet        验证码
 

@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        int width = 100;
        int height = 50;

        //1.创建一对象,在内存中图片(验证码图片对象)
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);


        //2.美化图片
        //2.1 填充背景色
        Graphics g = image.getGraphics();//画笔对象
        g.setColor(Color.PINK);//设置画笔颜色
        g.fillRect(0,0,width,height);

        //2.2画边框
        g.setColor(Color.BLUE);
        g.drawRect(0,0,width - 1,height - 1);

        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
        //生成随机角标
        Random ran = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 4; i++) {
            int index = ran.nextInt(str.length());
            //获取字符
            char ch = str.charAt(index);//随机字符
            sb.append(ch);

            //2.3写验证码
            g.drawString(ch+"",width/5*i,height/2);
        }
        String checkCode_session = sb.toString();
        //将验证码存入session
        request.getSession().setAttribute("checkCode_session",checkCode_session);

        //2.4画干扰线
        g.setColor(Color.GREEN);

        //随机生成坐标点

        for (int i = 0; i < 10; i++) {
            int x1 = ran.nextInt(width);
            int x2 = ran.nextInt(width);

            int y1 = ran.nextInt(height);
            int y2 = ran.nextInt(height);
            g.drawLine(x1,y1,x2,y2);
        }


        //3.将图片输出到页面展示
        ImageIO.write(image,"jpg",response.getOutputStream());


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

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

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

相关文章

①【Spring】一文了解IOC容器

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 一文掌握IOC一、IOC二、IOC容器的实现BeanFact…

一文掌握fastapi微服务开发

目录 一、概述 1.1 微服务 1.1.1 微服务的优势 1.1.2 微服务的缺点 1.2 为何使用Python开发微服务 1.3 FastAPI概述 二、开发 2.1 安装FastAPI 2.1.1 安装虚拟环境 2.1.2 创建虚拟环境 2.1.3 激活虚拟环境 2.1.4 安装FastAPI 2.2 FastAPI简单使用 2.2.1 查询 2.…

java注解以及如何利用反射获取注解的属性值

一、什么是注解 1.Annotation是从JDK5.0开始引入的新技术 2.Annotation的作用 : &#xff08;1&#xff09;不是程序本身&#xff0c;可以对程序作出解释(这一点和注释(comment)没什么区别)&#xff08;2&#xff09;可以被其他程序(比如:编译器等)读取 3.Annotation的格式…

【每日一题】【LeetCode】【第十一天】杨辉三角

解决之路 题目描述 测试案例&#xff08;部分&#xff09; 第一次 杨辉三角感觉还是挺经典的代码题目&#xff1f;之前大一学C语言好像写过一次。 不过&#xff0c;自己当时就不会写&#xff0c;这次自己先试试能不能想出解决方案。 输入数字是几&#xff0c;那就要输出几…

亚马逊云科技帮助Gemsouls在云上快速实现技术验证与部署

元宇宙热度居高不下&#xff0c;它所创造的虚拟世界进一步拉近了人与人之间的距离&#xff0c;用数字化的形式消除地理与空间上的隔阂。而高度拟真化的虚拟人与AI虚拟社交&#xff0c;是元宇宙落地的重要领域&#xff0c;打造以人工智能驱动的虚拟人社交平台已成为行业大势。 …

DNS 的一些基础知识,以及 DNS 转换域名的过程

DNS(Domain Name System)&#xff0c;主要作用是将域名转成 IP&#xff0c;本文主要讲解了 DNS 的一些基础知识&#xff0c;以及 DNS 转换域名的过程。DNS 是什么dig命令绝大多数网络通信都是基于 TCP/IP 协议&#xff0c;而 TCP/IP 协议的基础是 IP&#xff0c;所以网络中的计…

获取未来时间 一年或N年

需求 展示从本月初开始 一年的时间 或N年的时间 以便用户选择思路 一年12个月 是已知的 从本月到12月可以生成本年的每天数据从1月至上月可以生成所需得到最后一年的数据今年加最后一年的月份可拼接一年时间 所以中间年份是所需年分-1的数组数据中间年份都是1-12月 可以通过年份…

软件的生命周期和测试的生命周期的区分

软件的生命周期测试的生命周期软件测试贯穿于软件的整个生命周期在需求分析阶段测试人员的活测试人员需要站在用户角度分析&#xff1a;软件需求是否合理&#xff1b;站在技术角度分析&#xff1a;技术上是否可行&#xff0c;还有没有优化的空间&#xff1b;站在测试角度分析&a…

VALL-E:微软全新语音合成模型可以在3秒内复制任何人的声音

近日&#xff0c;微软研究人员宣布了一种新的语音合成AI模型 VALL-E&#xff0c;给出3秒样音就可以精确地模拟一个人的声音。一旦它学会了一个特定的声音&#xff0c;VALL-E可以复制说话者的情绪和语气&#xff0c;即使说话者本人从未说过的单词也可以模仿。 论文地址&#xf…

xlCompiler转换为程序的优秀工具

xlCompiler转换为程序的优秀工具 xlCompiler是将oxel文件转换为程序的优秀工具。无需担心删除oxel文件中使用的宏和公式。该工具将您所做的转换为Exe可执行文件&#xff0c;这比分发原始文件时要低得多。最终的文件不需要氧气来执行&#xff0c;您也会有一种在简单的氧气环境中…

D. Friendly Spiders(bfs+筛法)

传送门题意&#xff1a;给你n个蜘蛛&#xff0c;每个蜘蛛有自己的腿数&#xff0c;如果某两个蜘蛛可以直接联系&#xff0c;那么这两个蜘蛛的最大公约数就不为1&#xff0c;否则这两只蜘蛛就不能直接联系。现在给你两个蜘蛛的序号i,j问这两只蜘蛛是否可以直接或者通过其他的蜘蛛…

SDK安全专项评测证书

SDK安全专项行动”是中国信息通信研究院安全研究所大数据应用与安全创新实验室共同发起的&#xff0c;实验室紧跟信息技术发展趋势&#xff0c;依托数据安全、移动安全等领域深厚积累&#xff0c;通过前瞻研究和实践探索&#xff0c;形成了完整的SDK评测方案和指标体系。 SDK产…

【HCIA-openEuler】实验手册—05【openEuler软件管理】

文章目录一、实验介绍1、内容描述2、实验目的二、配置Yum源步骤1&#xff1a;进入yum repo目录步骤2&#xff1a;更改openEuler_x86_64.repo文件步骤3&#xff1a;刷新列出软件列表三、使用RPM命令管理软件1、RPM查询命令步骤1&#xff1a;执行以下命令&#xff0c;通过yum和rp…

华为DHCP实验配置

配置AR1为PC2分配地址 dhcp enable ip pool DHCP_PC2 network 192.168.20.200 mask 24 gateway-list 192.168.20.254 dns-list 192.168.20.100 excluded-ip-address 192.168.20.100 int g0/0/1 ip address 192.168.20.254 24 dhcp select global 配置AR1为PC3分配IP地址 dhcp e…

一个令人赞不绝口的代码 Debug 神器

在编写程序时&#xff0c;无论是对于初学者还是对于专业开发人员&#xff0c;都会花费大量时间来调试或修复源代码错误&#xff0c;也就是 Debug。 这个过程繁琐复杂&#xff0c;包括 Bug 复现和 Bug 定位等环节。如果有了自动化的 Debug 程序&#xff0c;就可以显著提高编程实…

Three.js一学就会系列:05 加载3D模型

系列文章目录 Three.js一学就会系列&#xff1a;01 第一个3D网站 Three.js一学就会系列&#xff1a;02 画线 Three.js一学就会系列&#xff1a;03 炫酷3D划线 Three.js一学就会系列&#xff1a;04 炫酷3D文字 文章目录系列文章目录前言一、核心代码讲解引入插件轨道控制器加载…

ES6 课程概述⑤

文章目录9-1. Fetch Api 概述9-2. 基本使用参数返回值9-3 **Response 对象**9-4 Request 对象9-5 Headers 对象9-6 文件上传10-1 迭代器背景知识JS 中的迭代器可迭代协议 与 for-of 循环可迭代协议for-of 循环展开运算符与可迭代对象生成器 (Generator)set 集合9-1. Fetch Api …

Unity 之 Addressable可寻址系统 -- 代码加载介绍

Unity 之 可寻址系统 -- 代码加载介绍 -- 进阶&#xff08;一&#xff09;一&#xff0c;可寻址系统代码加载1.1 回调形式1.2 异步等待1.3 面板赋值1.4 同步加载二&#xff0c;可寻址系统分标签加载2.1 场景搭建2.2 代码示例2.3 效果展示三&#xff0c;代码加载可寻址的解释概述…

算法第九期——DFS(深度优先搜索)的树上应用

树 树是一种特殊的图 。 特点&#xff1a; 若树有n个点,则有n-1条边。树有连通性但没有回路。从一个点出发可以到达任意一个&#xff0c;而且路径是唯一的。树的重心u&#xff08;最平衡的点&#xff09;: 以树上任意一个结点为根计算它的子树的结点数&#xff0c;如果结点…

二部图和匈牙利算法

1.二分图最大匹配 设G为二分图,若在G的子图M中,任意两条边都没有公共节点,那么称M为二分图G的一组匹配。在二分图中,包含边数最多的一组匹配称为二分图的最大匹配。 交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。 …