Servlet-Maven的使用说明

Maven安装:

Maven下载:Maven – Download Apache Maven

右击解压缩,注意解压缩过程就是安装过程,注意自己解压后文件的目录 

记住自己解压后的文件目录,我是专门有个文件夹存放安装文件的。这个目录以后要经常用到的,可以集中放在某一路径下。

1、打开环境变量配置界面

2、配置环境

MAVEN_HOME这个变量里面可以只存放maven相关的路径配置,方便日后管理。

 这个时候在系统变量里面便会多了MAVEN_HOME这个变量

3、将MAVEN_HOME配置到系统环境变量path中

 双击path变量,新建一参数,输入%MAVEN_HOME%\bin后点击确定即可。

完成以上操作后点击确定保存并关闭配置界面

Maven的使用

        maven    可以通过一小段描述信息来管理项目的构造,报告和文档的项目管理工具软件

                       是一个Jar包下载工具,web项目创建工具,项目打包...

        安装        直接使用压缩包解压到指定位置,然后配置环境

        配置         配置maven目录 - conf - settings 文件           tools:下载jar包的地方

Idea创建Maven项目

 web可能会消失,下图是修改web所在位置的地址

在pom.xml加

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

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

会话 Cookie和Session

会话技术 

会话的概念:

        项目中的会话,就是浏览器从第一次给服务器发送请求开始,会话建立,直到任意一方断开为止,一次会话中,可能包含多次请求和多次响应。

功能:

        主要在一次会话中的多次请求之间,完成数据共享

会话的方式:

        1、客户端的会话技术:Cookie

        2、服务器端的会话技术:Session

Cookie

        Cookie对象是客户端会话技术,将数据保存到客户端

        通过Servlet实现cookie使用:

package com.web;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

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

        //使用Cookie
        //1、创建Cookie对象
        Cookie cookie = new Cookie("name", "jack");

        //2、响应Cookie回浏览器
        response.addCookie(cookie);

        //3、通过请求对象,获取Cookie
        Cookie[] cookies = request.getCookies();
        for ( Cookie cookie1 : cookies) {
            System.out.println(cookie1.getName() + "==" + cookie1.getValue());
        }

    }
}

cookie的实现原理 :

        1,当客户端第一次访问服务器的时候,如果服务 器中响应了cookie,浏览器就会把服务器响应的 cookie保存下来

        2,当客户端第二次访问服务器的时候,客户端的 请求回携带刚才保存在浏览器的cookie去访问

启动服务器之后有个默认的cookie值的问题

服务器在启动后,一般默认回创建一个session对象, 只要浏览器访问了服务器,服务器就把session的值通 过cookie返回浏览器

如果tomcat设置了启动服务自动开启浏览器,那么等 于是先访问了一次服务器,所以会先拿到一个 JSESSIONID这个cookie值

所以当我们再访问自己需要的资源的时候,就会显示已 经存在一个cookie值l

Cookie的特点

        1,一次可不可以发送多个cookie? 可以创建多个cookie对象,使用response多次调 用addCookie方法就可以了

        2,cookie可以在浏览器中,保存多长时间?

                默认情况下,浏览器关闭后,cookie就被销毁了

                通过方法可以设置cookie的生存时间

                void setMaxAge(int expiry) 设置 cookie 的 最大生存时间,以秒为单位 ,0表示删除cookie,负值 表示浏览器关闭就销毁了

                 用法 :

                        //设置cookie的生存时间

                        cookie.setMaxAge(60);

        3,cookie中能不能存放中文?

                 tomcat8之后,cookie值中可以存放中文数据

        4,cookie的取值范围有多大 ?(数据的共享范围)

               public void setPath(String uri)

                cookie 对于指定目录中的所有页面及该目录子目 录中的所有页面都是可见的。

                同一个服务器下,不同的服务模块中,共享 cookie,可以通过设置setPath值                 setDomain(String pattern)

                指定应在其中显示此 cookie 的域

                不同的服务器下

                可以通过setDomain设置相同显示的一级域名地 址,可以实现多个服务器之间cookie的共享

总结:cookie的特点和作用?

        1、cookie存放数据在客户端,不太安全

        2、cookie存放一般存在大小限制(4KB),一个域名下,存放cookie在20个左右

        3、作用就是存放一些不敏感的数据,可以在 不登陆的情况下,完成服务器对客户端的身份识别

Cookie案例

        使用cookie完成上一次的访问时间记忆

                1,访问的时候,判断有没有cookie,如果有cookie, 就拿到cookie中的时间戳

                2,如果没有cookie,表示第一次登录,把第一次登录 时间,放到cookie中

package com.web.cookiecase;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

@WebServlet("/ServletLoginTime")
public class ServletLoginTime extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

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

        //设置请求响应的格式
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //获取一个输出流对象write
        PrintWriter writer = response.getWriter();

        //获取cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = true;
        //判断获取的cookie数组
        if (cookies != null){
            //不是有cookie
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //如果有事先设定好的cookie名称logintime,表示之前访问过
                if ("loginTime".equals(cookie.getName())){
                    flag =false;
                    //处理logintime中的值
                    String time = cookie.getValue();
                    //将字符串转long类型
                    long loginTime = Long.parseLong(time);
                    //获取到的毫秒值,转为日期类型
                    Date date = new Date(loginTime);
                    writer.write("欢迎回来,上次访问的时间是:" + date.toLocaleString());
                }
            }
        }
        if (flag){
            writer.write("欢迎你第一次访问!");
        }
        //如果不存在指定cookie,就创建一个cookie,并且在这个cookie中存入时间戳
        Cookie cookie = new Cookie("loginTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(60*60*24);
        response.addCookie(cookie);
    }
}

Session对象的使用

        概念 :

                 Session对象是服务器端的会话技术,在一次会话的多次请 求间,共享数据

·        获取方式 :

                 通过 HttpServletRequest 对象创建一个HttpSession

                HttpSession getSession()         返回与此请求关联的 当前会话,如果该请求没有会话,则创建一个会话。

         HttpSession对象的常用方法:

                Object getAttribute(String name)         返回与此会话中的指定名称绑定在一起的对象,如果没有对 象绑定在该名称下,则返回 null。

                 void setAttribute(String name, Object value)         使用指定名称将对象绑定到此会话。如果具有同样名称的对 象已经绑定到该会话,则替换该对象。

                 void removeAttribute(String name)         从此会话中移除与指定名称绑定在一起的对象。

                String getId()         返回包含分配给此会话的唯一标识符的字符串。标识符是 由 servlet 容器分配的,并且是与实现相关的。

package com.web.servletsession;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/ServletSession1")
public class ServletSession1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

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

        //通过请求对象,获取Session对象
        HttpSession session = request.getSession();
        //存值
        session.setAttribute("name","jack");

    }
}
package com.web.servletsession;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/ServletSession2")
public class ServletSession2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

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

        //通过请求对象,获取Session对象
        HttpSession session = request.getSession();
        //获取session值
        Object name = session.getAttribute("name");
        System.out.println(name);

    }
}

Session运行的原理

        Session是通过Cookie完成传输的

        session工作流程

               1,当客户端第一次请求服务器的时候,服务器会创建一个 Session对象,并且给Session对象定义一个id值,id值是一 长串随机的字符串

                2,第一次请求对应的响应,响应的时候,服务器会创建 Cookie对象,并在Cookie中存入刚才创建的Session的id ,格式是 : JSESSIONID=573184625BB404A1F8959CC6CE94DDF8                 3,第一次响应之后,响应回来的cookie会存放在浏览器 中,下次再去请求服务器的时候,会携带这个cookie中的 JSESSIONID

                4,第二次请求的servlet中,通过请求过来的的 JSESSIONID中的具体的id值,找到对应的session对象,这 时候,就可以拿到session中的值了

        所以,session具有以下特点 :

                服务器会给每个用户(浏览器)创建一个session对象,如 果有两个浏览器同时访问服务器,就会创建2个session

                一个session独占一个浏览器的,只要浏览器没有关 闭,session就一直存在

                将来session可以用来,保存登录用户信息,保存购物 车的信息...

Session其他信息了解

        1,当用户客户端关闭,服务器不关闭,用户再次访 问,两次获取的session是否为同一个 ?                 默认情况下,不是同一个

                如果想让客户端多次访问获取相同的session,可 以手动设置Cookie,并设置JSESSIONID的值

        

package com.web.servletsession;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/ServletSession1")
public class ServletSession1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

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

        //通过请求对象,获取Session对象
        HttpSession session = request.getSession();

        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
        //存值
        session.setAttribute("name","jack");

    }
}
package com.web.servletsession;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/ServletSession2")
public class ServletSession2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

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

        //通过请求对象,获取Session对象
        HttpSession session = request.getSession();
        System.out.println(session.getId());
        //获取session值
        Object name = session.getAttribute("name");
        System.out.println(name);

    }
}

         2,客户端不关闭,服务器重启了,两次获取的session 是否是同一个 ?

                不是同一个 ,因为服务器重启后,对象都销毁 了,原来的对象信息就不存在了

                现实中这种情况不太合理,tomcat服务器会做 session钝化和session活化的操作,确保session中的 数据不会丢失

                session钝化 :服务器正常关闭之前,将session对 象序列化到硬盘上

                session活化:服务器重新启动后,将session文件 转为内存中的session对象

        3,Session什么时候被销毁?

                1,服务器被关闭了,session被销毁

                2,session对象调用 invalidate() 方法

                3,session默认的失效时间 30 分钟 可以自己设置session有效期

<session-config>
   <!-- 设置session有效期,单位分钟-->
    <session-timeout>1</session-timeout>
  </session-config>

Session的其他特点

        session相比于servletContext域对象,存放的数据量 会多一些,servletContext中的数据,多个请求可以共享

        session可以用来存储一次会话中的多次请求数据,存 在服务器端

        session可以存储任意类型、任意大小的数据

说一下cookie和session的特点区别:

        1,cookie存在客户端,session存在服务器

        2,cookie数据大小有限制,session大小没有限制

        3,cookie数据相对不太安全,session比较安全

    JSP了解    

        基本概念: Java Server Pages java服务端页面

                JSP中,既可以编写html标签,也可以编写

                java代 码,早起的作用就是简化书写

        特点 :

                写jsp跟写html基本标签用法相同

                jsp中可以提供动态数据,html只能写静态的数据

        通过查看tomcat工作路径发现,jsp每次运行起来之 后,就被当做java文件编译了

        查看代码发现,jsp继承自httpJspBase , httpJspBase 也是servlet的一个子类,所以,其实jsp就是 servlet

        jsp中也提供了一些内置对象

        将来可以在jsp页面上,直接使用这些对象

        页面上展示的所有数据,都是通过out对象,调用方法,将 内容写出的

el表达式

        概念 :Exprssion Language 表达式语言

        作用 :简化jsp页面中的代码编写

        语法:${表达式}

        jsp中默认是支持el表达式的

用法

        1,运算符 : 支持 算数运算符 、比较运算符、逻辑运 算符 、空运算符 empty

        2,从域对象中获取值

                语法 : ${域名称.键名} : 从指定的域中获取指定 的键值

                        域名称:

                                1,requestScope :一个请求中

                                2,sessionScope : 一次会话中

                                3,applicationScope :整个服务器

                                4,pageScope : 当前页面

        3,获取对象、List集合、Map集合的值

                1,对象值的获取

                        本质上是调用对象的get方法

                        ${域名称.键名.属性名}

                2,list集合

                        ${域名称.键名[索引]}

                3,map集合

                        ${域名称.键名.map中key名称}

                        ${域名称.键名["mapkey名称"]}

                4,空运算符

                        ${empty 集合名} 用来判断字符串、集合、数 组 是否为空或者长度为0

package com.web;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class User {

    private String name;
    private String age;
    private String birthday;

    public User() {
    }

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    public long getBrithAge(){
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse(this.birthday);
            long time = System.currentTimeMillis() - date.getTime();
            return (time / 1000 / 60 / 60 / 24 /365);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;

    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
<%@ page import="com.web.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Daisy
  Date: 2023/10/16
  Time: 9:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
用户名:<input type="text" name="username"><br><br>
密  码:<input type="password" name="password">

<div>

</div>
<h1>EL表达式</h1>
<h1>算术运算符</h1>
    ${1+2}<br>
    ${5/3}<br>
    ${3>2&&5>4}<br>

<%--java代码要写在这对标签中--%>
<%
    //pageContext.setAttribute("name","alice");
    request.setAttribute("name","jack");
    session.setAttribute("name","luck");
    application.setAttribute("name","lisi");
%>

    <h1>获取值</h1>
    ${pageScope.get("name")}<br>
    ${requestScope.get("name")}<br>
    ${applicationScope.get("name")}<br>
    ${sessionScope.get("name")}<br>

<%--el表达式用来取值的话,可以简写--%>
${name}

<%--创建对象,并把对象放入到域对象中--%>
<%
    User user = new User();
    user.setAge("jack");
    user.setAge("22");
    user.setBirthday("1990-10-10");
    //在request域中存放对象
    request.setAttribute("user",user);
%>

<h1>获取对象,集合中的值</h1>
<%--通过el表达式去获取域中的值--%>
    ${requestScope.get("user").age}<br>
    ${user.name}<br>
    ${user.birthday}<br>
    ${user.brithAge}<br>

<%
    // 创建集合
    ArrayList<Object> list = new ArrayList<>();
    list.add("hello");
    list.add("java");
    list.add("world");
    //把list放入域中
    request.setAttribute("stringList",list);
%>
    <h1>获取集合list中的值</h1>
    ${requestScope.get("stringList")[1]} <br>
    ${stringList[0]} <br>
    ${stringList[2]} <br>
<%-- map集合获取示例--%>
<%
    HashMap<String, String> map = new HashMap<>();
    map.put("one","hello");
    map.put("two","world");
    map.put("three","java");
    request.setAttribute("map",map);
%>
    <h1>获取map中的数据</h1>
    ${requestScope.get("map").one} <br>
${map.two} <br>
${map["three"]} <br>
    <%-- ${map.twomm} <br>--%>
    <%-- ${map.twommmm} <br>--%>
    ${map.two} <br>
    <%-- 空运算符--%>
    <h1>空运算符的使用</h1>
<%
    String s = "";
    request.setAttribute("str",s);
    ArrayList<Object> list1 = new ArrayList<>();
    request.setAttribute("list1",list1);
%>
    ${empty str}
    ${not empty str}
    <%--获取动态虚拟路径--%>
    ${pageContext.request.contextPath}
    <a href="${pageContext.request.contextPath}/xxxservlet"></a>


</body>
</html>

JSTL表达式

        概念: Java Server pages Tag Library jsp标准标签 库

        用于简化和替换jsp页面的一些Java代码

        使用步骤 :

                1,导入jar包依赖

                2,引入标签库

                3,使用标签

                        c:if

<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: Daisy
  Date: 2023/10/16
  Time: 11:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--c:if    表示判断指定的结果,从而显示内容
            必填属性:test,需要设置true或false
--%>
        
<%
    ArrayList<Object> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");
    list.add("6");
    list.add("7");
    list.add("8");
    list.add("9");
    list.add("10");
    request.setAttribute("list",list);
%>

    <%--c:if  判断标签
        属性:
            test 是此标签必填属性,结果为true或者false,如果是true,就将标签中的内容显示
            如果是false,此标签内容不显示
    --%>
    <c:if test="true">
        <h1>你好</h1>
    </c:if>

    <%--配合el表达式--%>
<%
    //ArrayList<Object> list1 = new ArrayList<>();

    //request.setAttribute("list",list);
%>

<%--如果list内容为空,如果为空,就不显示,不为空,才显示--%>
<c:if test="${not empty list}">
    ${list[0]}<br>
    ${list[1]}<br>
    ${list[2]}
</c:if>

</body>
</html>

                        c:choose

<%--c:forEach 完成循环获取--%>
    <c:forEach begin="1" end="10" var="i" step="1" varStatus="s">
        ${1} ${s.index} ${s.count} <br>
    </c:forEach>
<br>

                        c:for

<%--c:forEach 完成循环获取,获取集合
    属性:
        items :容器dx
        var : 容器的临时对象
        varstatus : 循环状态对象
            index : 容器的索引,从0开始
            count : 循环的次数
--%>

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

练习 : 在request域中,有一个存有User对象的List集合 通过el+jstl 将集合中的数据,展示到jsp页面,并 放入到表格中

package com.web.java;

public class User1 {
    private int id;
    private String name;
    private int age;
    private String sex;

    public User1() {
    }

    public User1(int id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    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 int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User1{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}
<%@ page import="com.web.java.User1" %>
<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: Daisy
  Date: 2023/10/16
  Time: 14:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
    <style>
        .mytd{
            text-align: center;
        }
    </style>
</head>
<body>
<%--创建对象,把对象放入request域中--%>
<%
    ArrayList<Object> list = new ArrayList<>();
    User1 user1 = new User1(1001,"jack",21,"男");
    User1 user2 = new User1(1002,"alice",22,"女");
    User1 user3 = new User1(1003,"tom",23,"男");
    list.add(user1);
    list.add(user2);
    list.add(user3);
    request.setAttribute("list",list);
%>

<br>
<br>
<br>

<table border="1px" cellspacing="0" cellpadding="5px"
       width="500px" align="center" bgcolor="#fffc8f">
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
    </tr>
    <c:forEach items="${list}" var="str" varStatus="s">
    <tr class="mytd">
        <th>${str.id}</th>
        <td>${str.name}</td>
        <td>${str.age}</td>
        <td>${str.sex}</td>
    </tr>
    </c:forEach>
</body>
</html>

MVC开发模式

        1,早期,只有servlet,只能通过response对象,将各种数 据写出来

        2,后来出现jsp,简化了servlet开发,jsp中既可以写前端 代码,也可以写java代码,开发的时候,过度使用jsp,造成 难以维护的情况

        3,再后来,javaweb开发,借鉴了mvc开发模式,使得开 发的流程更加合理

        MVC : 将一个javaweb的开发程序,分为3个部分, M、 V、C

        M: model 模型,完成具体的业务操作,比如 ,数据库查 询、封装对象...

        V: view 视图 jsp ,主要功能是展示数据

        C: controller 控制器(servlet)

                用来获取用户输入,调用模型结果,处理逻辑,将处理 结果交给视图展示

       

 项目架构分层 :

        界面层 : 用户看到的界面

        业务逻辑层 : 处理业务逻辑的

         数据访问层 : 操作数据库存储文

        使用MVC模式写一个简单的案例 :

        使用:JSP、Jdbc、Servlet、MySQL、Tomcat 完成一个简 单的员工管理系统

        开发步骤:

                1,创建数据库

                2,创建项目,导入依赖

                3,编写程序

                4,测试

                5,部署

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值