当前位置: 首页 > news >正文

JavaWeb项目入门(从0开始)

文章目录

  • 一、Students2025项目(用页面展示学生列表---模拟数据)
  • 原始Servlet+JSP架构项目初步搭建
    • 项目结构:
    • 数据库导入数据
    • 创建Java版本的Web项目
    • 控制层:servlet
      • StudentServlet
    • 数据模型
      • Student
    • Service层
      • 定义接口:StudentService
      • 定义实现类 StudentServiceImpl
    • 数据仓库(对数据进行读取):Dao层
      • 定义接口:StudentDao
      • 定义具体的实现类 :StudentDaoImpl
    • 页面展示:jsp部分
    • 最终的pom.xml配置文件
    • 项目运行结果

一、Students2025项目(用页面展示学生列表—模拟数据)

原始Servlet+JSP架构项目初步搭建

jsp项目已被淘汰,在此学习目的是了解未来学习的新技术的底层原理

项目结构:

在这里插入图片描述

项目结构介绍:
目前阶段只完成了初始化的后端搭建,实现从本地数据库获取数据在浏览器显示
请求处理流程
HTTP请求 → StudentsServlet → StudentServiceImpl → StudentDaoImpl → Global → 数据库
响应方向:
数据库 → Global → StudentDaoImpl → StudentServiceImpl → StudentsServlet → JSP → HTTP响应

各层职责MVC: DAO层:负责数据获取和初步封装(M)

Service层:理论上应包含业务逻辑处理,但当前示例简单透传

Servlet:控制流程和准备视图数据(C)

JSP:专注于数据展示(V)

响应与请求路径差异:请求是"控制流"向下传递响应是"数据流"向上返回最终在表示层完成数据到视图的转换

项目书写顺序:

数据库设计 → 模型类 → DAO层 → Service层 → Controller → 视图↑______________________________________|自底向上,逐层依赖

项目大体运行流程为Global->StudentServlet->StudentService->StudentDao,model的Student类为数据模型
接下来按项目大体运行流程的顺序介绍各部分

数据库导入数据

我们将数据全都写在了sql文件里面,现在直接将数据导入到数据库里面

首先在navicat里面建立数据库students2025:

在这里插入图片描述
建立完成后,直接导入我们准备好的数据:右键选择运行SQL文件
在这里插入图片描述在这里插入图片描述
出现下面的加载信息:successfully证明我们已经成功导入数据了

在这里插入图片描述

创建Java版本的Web项目

在这里插入图片描述
创建完成后,要做的是设置编码格式(一定要先配置编码格式),配置maven,查看修改pom.xml引入项目需要的依赖。

配置编码格式:
在这里插入图片描述
配置maven:使用的是本地的maven
在这里插入图片描述

查看pom.xml文件,加入我们所需要的相关配置:引入servlet和jsp依赖 ,引入lombok依赖(实体类里面用到的)。引入后一定要保存刷新maven

在这里插入图片描述

代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.situ</groupId><artifactId>students20252</artifactId><version>1.0-SNAPSHOT</version><name>students20252</name><!-- 一定要修改打包方式为war包  --><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>21</maven.compiler.target><maven.compiler.source>21</maven.compiler.source><junit.version>5.11.0</junit.version></properties><dependencies><!-- 引入依赖:jsp的并设置生效范围scope --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jsp-api</artifactId><version>11.0.0</version><!--  作用域:由外部提供 ,在项目打包的时候不把这两个打包,由外部(tomcat)提供 --><scope>provided</scope></dependency><!--   servlet的依赖     --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-servlet-api</artifactId><version>11.0.9</version><scope>provided</scope></dependency><!--  lombok      --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.38</version></dependency></dependencies><build><!--   插件:目前默认的是下面这些      --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.4.0</version></plugin></plugins></build>
</project>

创建并配置项目完成,接下来真正写项目
项目采用MVC三层架构的模式,可以先写出包,然后将对应层次的代码放在指定的包下:

在这里插入图片描述

控制层:servlet

StudentServlet

package com.situ.students20252.servlet;import com.situ.students20252.model.Student;
import com.situ.students20252.service.impl.StudentServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.List;//1.配置访问路径
@WebServlet("/admin/student/*")
public class StudentServlet extends HttpServlet {//2.重写doget和dopost方法(因为浏览器只支持这两个请求方式)@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//3.想用页面展示学生列表,但是servlet写网页不方便,所以请求转发去jsp(jsp写网页很方便,且用户无感知)String action = req.getPathInfo();//3.1先获取用户输入的*对应的是什么.getPathInfo()是专门获取*是什么的方法if("/list".equals(action)){//3.2进行判断,技巧:用已知的字符串去比较,放在前面.这样绝对不会出现空的情况异常//4.下面应该处理业务逻辑部分了,但是业务逻辑通常不写在这里,因为servlet是控制器 ,负责接收请求调度请求 ,在这里写业务逻辑会很臃肿//5.所以去service里面写,然后这里只需要用面向对象的思想new对象调用方法即可:前面一系列相关方法写完后:StudentServiceImpl studentService = new StudentServiceImpl();List<Student> students = studentService.findAll();//结果保存在students里面//6.把调用方法之后的结果存到域对象中 :第一个参数("students")是这个数据的标识符;// 第二个参数(students)是真正存储的数据。req.setAttribute("students",students);//3.3:请求转发的具体实现:由jsp页面负责展示给浏览器内容--去看(写)list.jsp页面req.getRequestDispatcher("/WEB-INF/jsp/student/list.jsp").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//项目中需要写的地方很多,加上这个to do可以防止我们遗漏东西,方便后续项目的完成:View--Tool Windows---todo//todo}
}

作用:
处理http请求,
用户访问URL: /admin/student/list,if判断用户输入地址是不是/admin/student//list,如果是,创建StudentServiceImpl对象,调用findall方法,将获取到的数据存到List中,然后将名为students的集合存放到request请求域中,然后request调用请求转发方法将students转发到/WEB-INF/jsp/student/list.jsp。

数据模型

Student

model下的Student类:数据模型类,用来保存数据,每一行student的数据存一行。

package com.situ.students20252.model;import lombok.Getter;
import lombok.Setter;import java.time.LocalDate;//使用lombok:在pom.xml里面引入依赖,添加getter和setter方法。虽然看不见,但是编译的时候会编译出来
@Getter
@Setter
public class Student {//数据模型(每一行student的数据存一行),用来保存数据://属性的名字尽量要和数据库里面的名字对应,同时遵循java的命名规范private Integer id;private String  stuId;private String name;private String pinyin;private String sex;private String qq;private String email;private String phone;private String wechat;private LocalDate birthday;
}

数据模型建立好(实体类)之后,才可以编写业务逻辑(有了实体类才能new对象,写方法)):

Service层

定义接口:StudentService

定义接口:无需关注它的具体实现

package com.situ.students20252.service;
import com.situ.students20252.model.Student;
import java.util.List;
public interface StudentService {//定义查询功能的方法:findAll:List<Student> findAll();
}

定义实现类 StudentServiceImpl

我们要做的是查询所有数据的业务逻辑,如何查询?从数据库中进行查询读取,关于数据的是dao层处理,所以我们只需要用面向对象的思维交给dao层处理,我们这里只需要 new dao层的对象然后调用方法即可。

package com.situ.students20252.service.impl;import com.situ.students20252.dao.impl.StudentDaoImpl;
import com.situ.students20252.model.Student;
import com.situ.students20252.service.StudentService;import java.util.List;public class StudentServiceImpl implements StudentService {@Overridepublic List<Student> findAll() {//实现业务逻辑:如何读取?从数据库中查---交给dao层处理//我们本层只需要用面向对象的思维:new实现类的对象,调用方法即可:StudentDaoImpl studentDao = new StudentDaoImpl();List<Student> students = studentDao.findAll();//返回结果:return students;}
}

数据仓库(对数据进行读取):Dao层

定义接口:StudentDao

同样也是只定义接口,不实现 ,交给实现类去实现

package com.situ.students20252.dao;
import com.situ.students20252.model.Student;
import java.util.List;
public interface StudentDao {List<Student> findAll();
}

定义具体的实现类 :StudentDaoImpl

在这里真正实现方法:从数据库中读取具体的数据并返回结果。

这里采用模拟数据的方法,先不从数据库里面调取数据:先模拟一个假的数据:

package com.situ.students20252.dao.impl;import com.situ.students20252.dao.StudentDao;
import com.situ.students20252.model.Student;import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;public class StudentDaoImpl implements StudentDao {@Overridepublic List<Student> findAll() {//具体实现查询所有数据的功能://模拟假的数据:List<Student> list = new ArrayList<>();Student student = new Student();student.setId(1);student.setName("张三");student.setPinyin("zhangsan");student.setSex("男");student.setQq("2344");student.setBirthday(LocalDate.of(2000,1,2));student.setWechat("123");student.setPhone("123334");list.add(student);Student student2 = new Student();student2.setId(2);student2.setName("李四");student2.setPinyin("lisi");student2.setSex("男");student2.setQq("1212");student2.setBirthday(LocalDate.of(2000,1,2));student2.setWechat("456");student2.setPhone("4111");list.add(student2);Student student3 = new Student();student3.setId(3);student3.setName("张三五");student3.setPinyin("zhangsanwu");student3.setSex("男");student3.setQq("2344");student3.setBirthday(LocalDate.of(2000,1,2));student3.setWechat("123");student3.setPhone("123334");list.add(student);return  list;}
}

页面展示:jsp部分

list…jsp:

<%--Created by IntelliJ IDEA.User: LenovoDate: 2025/7/25Time: 20:27To change this template use File | Settings | File Templates.
--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><%--2.引入JSTL标签库:固定语法--%>
<%@ taglib prefix="c" uri="jakarta.tags.core" %><html>
<head><title>学生列表页面</title>
</head>
<body>
<%--JSP用于给浏览器的展示--%>
<%--1.表格,展示给浏览器--%>
<table id="tbl">
<%--    表头--%><thead><tr><th>ID</th><th>学号</th><th>姓名</th><th>拼音</th><th>性别</th><th>出生日期</th><th>手机号</th><th>微信号</th><th>邮箱</th><th>QQ</th></tr></thead><%--表的主体--%><tbody><%--2.要写循环去遍历,也就是java代码 ,但是程序员不喜欢在前端页面里面写后端的java代码,
所以引入了:JSTL+EL使用标签写逻辑(需要在pom.xml文件导入依赖)--%><%--3.(是前面所有的代码业务逻辑全部写完才加的这个遍历数据部分)循环遍历数据展示出来(把数据存到请求域中,从请求域中取出来展示).items="${students}:从请求域中取数据students var="s"是起个名字叫s --%><c:forEach items="${students}" var="s"><tr><td>${s.id}</td><td>${s.stuId}</td><td>${s.name}</td><td>${s.pinyin}</td><td>${s.sex}</td><td>${s.birthday}</td><td>${s.phone}</td><td>${s.wechat}</td><td>${s.email}</td><td>${s.qq}</td></tr></c:forEach></tbody>
</table>
</body>
</html>

至此,我们已经实现了采用模拟数据的方式,将数据显示在浏览器页面上。

最终的pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.situ</groupId><artifactId>students20252</artifactId><version>1.0-SNAPSHOT</version><name>students20252</name><!-- 一定要修改打包方式为war包  --><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>21</maven.compiler.target><maven.compiler.source>21</maven.compiler.source><junit.version>5.11.0</junit.version></properties><dependencies><!-- 引入依赖:jsp的并设置生效范围scope --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jsp-api</artifactId><version>11.0.0</version><!--  作用域:由外部提供 ,在项目打包的时候不把这两个打包,由外部(tomcat)提供 --><scope>provided</scope></dependency><!--   servlet的依赖     --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-servlet-api</artifactId><version>11.0.9</version><scope>provided</scope></dependency><!--  lombok      --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.38</version></dependency><!-- JSTL+EL依赖:--><!-- 接口:--><!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api --><dependency><groupId>jakarta.servlet.jsp.jstl</groupId><artifactId>jakarta.servlet.jsp.jstl-api</artifactId><version>3.0.2</version></dependency><!--实现:--><!-- https://mvnrepository.com/artifact/org.glassfish.web/jakarta.servlet.jsp.jstl --><dependency><groupId>org.glassfish.web</groupId><artifactId>jakarta.servlet.jsp.jstl</artifactId><version>3.0.1</version></dependency></dependencies><build><!--   插件:目前默认的是下面这些      --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.4.0</version></plugin></plugins></build>
</project>

项目运行结果

总的项目结构以及项目运行结果如图所示:

在这里插入图片描述

项目运行结果:

在这里插入图片描述

http://www.dtcms.com/a/297090.html

相关文章:

  • 进阶向:基于Python的局域网聊天工具(端对端加密)
  • Hadoop 之 Yarn
  • iOS 网络请求常用依赖库与系统自带 API 介绍与示例
  • 在 Azure 中配置 SMS 与 OTP
  • 【IDEA】idea怎么修改注册的用户名称?
  • Java环境配置之各类组件下载安装教程整理(jdk、idea、git、maven、mysql、redis)
  • SpringBoot3(若依框架)集成Mybatis-Plus和单元测试功能,以及问题解决
  • 【人工智能与机器人研究】透水混凝土道路养护的无人机系统编队控制:一种扩散方程方法
  • Sklearn 机器学习 数值指标 均方误差MSE
  • 力扣 hot100 Day55
  • 51 单片机单文件多文件结构工程模板的创建教程
  • 如何将 iPhone 备份到 Mac/MacBook
  • RIGOL DS1104Z图像保存与市电测量
  • Mkdocs相关插件推荐(原创+合作)
  • Kotlin 内联函数
  • 栈的核心原理
  • 开源项目XBuilder的user逻辑
  • 蓝光中的愧疚
  • MCP工具开发实战:打造智能体的“超能力“
  • 如何理解泊松分布
  • Vue基础(24)_VueCompinent构造函数、Vue实例对象与组件实例对象
  • UG创建的实体橘黄色实体怎么改颜色?
  • STM32项目实战:正弦波
  • 什么是JSON,如何与Java对象转化
  • QT跨平台应用程序开发框架(11)—— Qt网络编程
  • [NLP]一个完整的 UPF 文件示例
  • Vim 编辑器全模式操作指南
  • 纳米编辑器之Nano 编辑器退出**的详细操作指南
  • 【MacOS】发展历程
  • Linux 中 `chown`、`chgrp` 和 `chmod` 命令详解