JAVAWEB 系列文章目录
黑马B站视频JAVAWEB部分的知识范围、学习步骤-【思维导图知识范围】
文章目录
银诗一宿
题西林壁
宋·苏轼
横看成岭侧成峰,远近高低各不同。
不识庐山真面目,只缘身在此山中。
SSM
要改动代码的话,那你就得要学很多的相关技术了

操作比较复杂,目前提供了有声版:
https://www.bilibili.com/video/BV1nmQKYdE8G/
【JAVAWEB】idea如何导入停车场JAVAWEB项目
SSM技术是JAVAWEB技术之后的后续技术。
SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。
Spring是一个英文单名词、形容词、及物动词、不及物动词,作名词时翻译为“春天;弹簧;泉水;活力;跳跃,人名;(德)施普林;(英、芬、瑞典)斯普林”,作形容词时翻译为“春天的”,作及物动词时翻译
为“使跳起;使爆炸;突然提出;使弹开”,作不及物动词时翻译为“生长;涌出;跃出;裂开”。
错了,如果你百度到这个解释那就差太多了。
Spring
Spring是一个开源的Java开发框架,它提供了一种全面的解决方案,用于构建企业级应用程序。Spring框架的设计理念是基于面向对象的编程思想和松耦合的架构原则,旨在简化Java应用程序的开发,并提供可扩展性和灵活性。
Spring框架的核心特性包括:
1、 控制反转(IoC):Spring通过控制反转将对象的创建和管理交给框架来完成,开发人员只需关注业务逻辑的实现。这种解耦的设计模式可以降低组件之间的耦合度,提高代码的可维护性和可测试性。

2、 依赖注入(DI):Spring通过依赖注入将组件之间的依赖关系注入到对象中,而不是硬编码在代码中。这样可以使得组件之间的关系更加灵活,并方便进行单元测试和模块化开发。
spring会自动的把JAR里的功能加到项目里,不管你用不用得上。过于灵活,导致spring的JAR包依赖成为了一个噩梦。
注意的是,这个是SSM为啥 要升级成springBoot的重大原因
如果用升级成使用maven ,不用springBoot 这种父pom 的办法,那么初学者 把一个项目的JAR的依赖整明白,怕是黄瓜菜都凉了。关公大老爷都可以把1000多个华雄杀一个来回了。:)

3、 面向切面编程(AOP)
Spring提供了面向切面编程的支持,可以将横切关注点(如事务管理、安全性等)从业务逻辑中分离出来,以提高代码的模块化和重用性。
spring成名之作。SSM的时候,你可以理解为事务的最方便的实现。
springBoot的时候,你可以理解为配置类的各种妙用。
4、 组件化开发:Spring鼓励使用组件化开发的方式,通过将应用程序划分为多个独立的模块(组件),来提高代码的可重用性和可维护性。同时,Spring提供了一些开箱即用的组件(如数据访问、Web开发、消息传递等),简化了开发过程。
SpringBoot
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
也就是springBoot 简化了SSM的配置。

SpringMVC
Model-View-Controller(MVC)是一种软件架构模式,是软件设计模式的体现 [8-9] ,用于组织代码并分离关注点,广泛应用于用户界面的开发中。该模式将相关程序逻辑划分为三个相互关联的组成部分:模型、视图和控制器 [10]。MVC 模式最初用于桌面图形用户界面(Graph User Interface,GUI),但后来因设计 Web 应用程序而变得流行。许多流行的编程语言都有 MVC 框架,这些框架促进了 MVC 模式的实现。
MVC 模式随后发展,产生了诸如层次化模型-视图-控制器(Hierarchical-Model-View-Controller,HMVC)、模型-视图-适配器(Model-View-Adapter,MVA)、模型-视图-展示者(Model-View-Presenter,MVP)、模型-视图-视图模型(Model-View-View-Model,MVVM)等变体,这些变体将 MVC 适应于不同的上下文。随着 1996 年 NeXT的 WebObjects 的推出,MVC 模式在 Web 应用程序中的使用得到了增长,该框架最初是用 Objective-C 编写的(这种语言在很大程度上借鉴了 Smalltalk),并帮助强化了 MVC 原则。后来,当 WebObjects 被移植到 Java 时,MVC 模式在 Java 开发人员中变得流行。随后的 Java 框架,如 Spring(2002 年 10 月发布),继续强化了 Java 和 MVC 之间的紧密联系。
模型
模型是 MVC 框架的核心组成部分,它承担着管理应用程序数据和业务逻辑的重要责任。在模型中,数据被有效地管理、存储和操作,包括从各种数据源获取数据、对数据进行验证和处理、执行业务规则等。模型通常包括数据访问对象(Data Access Objects,DAO),用于与数据存储交互,以及实体类来表示应用程序中的核心数据结构。除此之外,模型也负责数据的通知和变化,确保数据变化时其他组件(如视图和控制器)能够及时获取到更新的数据。通过模型的设计,应用程序可以实现清晰的数据管理和业务逻辑,同时保持良好的可维护性、可扩展性和可测试性。同时模型会对数据进行校验和验证,确保数据的完整性、有效性和一致性。这可以通过验证规则、数据约束和业务规则来实现,以防止无效或不良数据进入系统。
在 Smalltalk-80 中,模型类型的设计完全由程序员决定。在使用 WebObjects、Rails 和 Django 时,模型类型通常代表应用程序数据库中的一个表。
模型的设计和实现对应用程序的整体质量和性能至关重要。一个良好设计的模型能够提供清晰的数据管理和业务逻辑,同时保持可维护性、可扩展性和可测试性,从而为应用程序的开发和维护提供了基础。
视图
视图是 MVC 框架中的另一个关键组件,它负责将模型的数据以用户友好的方式呈现给用户,并接收用户的输入。在视图中,用户界面元素被设计和排列,以展示应用程序的信息和功能。视图通常包括各种用户界面组件,如文本框、按钮、下拉菜单等,以及对数据的展示和呈现逻辑。与模型相对应的是视图不包含业务逻辑,它专注于数据的展示和用户交互。视图通常与具体的用户界面技术(如 HTML、JSP、Thymeleaf 等)紧密相关,通过视图解析器来将逻辑视图名称映射到实际的视图实现。通过良好设计的视图,用户可以直观地与应用程序交互,并获取所需的信息和功能,从而提升了用户体验和应用程序的易用性。
例如在 Smalltalk-80 中,视图只是模型的视觉表示,不处理用户输入。在使用 WebObjects 时,视图代表完整的用户界面元素,如菜单或按钮,并且确实接收用户输入。然而,在 Smalltalk-80 和 WebObjects中,视图旨在通用且可组合。在使用 Rails 和 Django 时,视图的角色由 HTML 模板扮演,因此在它们的方案中,视图指定了浏览器内用户界面,而不是直接代表用户界面小部件。(Django 选择将这种对象称为“模板”。)这种方法相对较少强调小型、可组合的视图;典型的 Rails 视图与控制器操作具有一对一的关系。
控制器
在 MVC 框架中,控制器不仅仅是接收请求和调用相应的处理方法,它还承担着更多的责任和功能 [13]。控制器负责从用户端接收各种类型的请求,包括 HTTP 请求、AJAX 请求等,然后根据请求的特征和内容进行路由和处理。它可能会根据请求的类型选择不同的处理逻辑,以满足不同类型请求的处理需求。
除了处理请求之外,控制器还负责协调模型和视图之间的交互。它将模型层返回的数据传递给视图层,以便视图能够呈现给用户。控制器可能会在处理过程中进行一些数据处理、格式化或转换,以确保数据能够被正确地显示在视图中。此外,控制器还可能涉及到一些与业务逻辑相关的操作,如数据验证、权限控制、日志记录等,以确保应用程序的安全性和稳定性。控制器的设计应该遵循单一职责原则,即每个控制器应该只负责处理特定类型或特定功能范围内的请求。这有助于提高代码的可维护性和可测试性,使得控制器可以更容易地被重用和扩展。通过良好设计的控制器,可以实现 MVC 框架的分离关注点原则,实现模型、视图和控制器之间的松耦合,从而为应用程序的开发和维护提供了基础。

Mybatis
M 一般指的是mybatis.
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。

项目里可能要用到的技术
TOMCAT
Tomcat服务器是一个免费的应用服务器,他的封面设计以一个动物的素描为灵感,正是因为这个设计理念,所以该项目以一个英文的动物名字为项目名称。因为其免费又好用,功能强大,所以成为大多数程序员的首选。Tomcat是一个小型的,轻量级的软件产品,他在启动运行时占用非常少的内存资源和系统开销,扩展性能比较好,支持多种应用需求,如果一个开发员对某一项功能实现特别感兴趣,他就直接可以将此功能加入到其中。Tomcat可以独立运行,身为网站的服务器,可以加载动态网页。
JAVAWEB技术比较杂
韩顺平说:学习JAVA的人有两大难
第一困惑,JAVA能百度到的知识太多太多,完全不知道学啥
第二困惑,就是不知道以什么样的顺序去学,有的时候乱看一堆视频有遗漏,有的时候,两边的视频还有重复。
以下面的黑马的JAVAWEB的内容为例,具体参见《黑马B站视频JAVAWEB部分的知识范围、学习步骤-【思维导图知识范围】》本文最上的链接

环境及工具:
要注意的是SSM的项目刚好处于maven 的推出之际,所以有一些的SSM用的是pom.xml 引入包的方式,而有一些则是用的JAR包的方式:
- SSM技术无MAVEN技术
- SSM技术使用MAVEN技术
项目里可能要用到的技术
JAVA
Java
编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
JSP
Java server page(以下简称JSP)为servlet技术的简化。JSP的功用在于它实现了Html语法中以<%, %>形式的java扩张。但是,值得注意的是,因为JSP与Servlet均在服务器端运行,故而往往以HTML文本为主要形式呈现客户端面前,所以当有 需求时,客户端可以便捷地通过浏览器来实现浏览。当网页服务器(web)遇到访问JSP提出的要求时,需要进行以下两个步骤:首先执行程序段,后将结果与htlm返回,以便系统更好运行。至于为何要进行的Java代码段的插入操作,其主要目的在于进行数据库的连接、网页重定向等等,以满足网页动态实现所需的各类功能。
HTML
Html语言是一种脚本语言,是一种规范和标准,在所有的开发语言中,是较为简单易学的一种,它有很多标签,运用标签就可以实现很多静态页面效果。虽然html语言相对其他语言来说比较简单,但是他能够实现的功能却很强大,因此受到广大用户的热爱。他可以实现静态网页设计,是学习前端设计的一门基础性语言。Html的结构包括头和主体部分,是WWW的描述语言。
TOMCAT
Tomcat服务器是一个免费的应用服务器,他的封面设计以一个动物的素描为灵感,正是因为这个设计理念,所以该项目以一个英文的动物名字为项目名称。因为其免费又好用,功能强大,所以成为大多数程序员的首选。Tomcat是一个小型的,轻量级的软件产品,他在启动运行时占用非常少的内存资源和系统开销,扩展性能比较好,支持多种应用需求,如果一个开发员对某一项功能实现特别感兴趣,他就直接可以将此功能加入到其中。Tomcat可以独立运行,身为网站的服务器,可以加载动态网页。
以项目举例:上代码
http://localhost:8080/login
说了这么多了,还是上点正菜。
这里的JSP是通过映射 访问的。有些类似springboot 的thymeleaf 的技术。也类似于thinkphp的MVC 的方式。
package com.xdcs.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 用户页面访问控制器
* @author ZYxiao
*
*/
@Controller
public class VisitorController {
@RequestMapping("/login")
public String goIndex(){
return "login";
}
/**
* 使重定向时也可以访问WEB-INF下的页面
* @param page
* @return
*/
@RequestMapping("/{page}")
public String goIndex(@PathVariable String page){
return page;
}
}
主页
http://localhost:8080/login
地址是这个。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.4.1/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.4.1/themes/icon.css" />
<script type="text/javascript" src="js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<script type="text/javascript" src="js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
<style type="text/css">
body {
background-image: url("img/bg.jpg");
background-repeat: no-repeat;
background-size:cover;
}
#logdiv{
text-align:center;
width:350px;
margin-left: 850px;
margin-top: 200px;
border: 5px solid whitesmoke;
padding: 30px 0;
}
#logbtn{
background-color: #3385FF;
}
}
</style>
<script>
var code = "";
//验证手机号
function isPhoneNo(phone) {
var pattern = /^1[34578]\d{9}$/;
return pattern.test(phone);
}
/* 定时器 */
var iTime = 60;
var Account;
function RemainTime(){
$("#codebtn").linkbutton("disable");
if (iTime >= 0){
if(iTime==0){
clearTimeout(Account);
iTime = 60;
code="";
$("#timeSpan").html('获取验证码');
$("#codebtn").linkbutton("enable");
}else{
$("#codebtn").linkbutton("disable");
Account = setTimeout(RemainTime,1000);
iTime=iTime-1;
$("#timeSpan").html("("+iTime+")");
}
}
}
function get_mobile_code(){
var tel = $("#uTel").val();
if(isPhoneNo(tel)){
RemainTime();
$.post('message', {'mobile':jQuery.trim(tel)}, function(res) {
code = res;
console.log(res);
});
}else{
$.messager.alert("提示","输入的手机号不合法");
}
};
function submitForm(){
var inp = $("#codeInp").val();
var tel = $("#uTel").val();
if(tel==null||tel==""){
$.messager.alert("提示","手机号不能为空");
return;
}
if(inp==null||inp==""){
$.messager.alert("提示","验证码不能为空");
return;
}
// if(code != inp){
// $.messager.alert("提示","验证码不正确");
// return;
// }
$("#loginForm").form('submit', {
url: "userLogin",
success: function(){
window.location.href="index"; // 如果提交成功则隐藏进度条
}
});
}
</script>
</head>
<body>
${noUser}
<div id="logdiv">
<form id="loginForm">
<span style="color:white">手机号:</span> <input id="uTel" class="easyui-textbox" data-options="iconCls:'icon-man'" name="uTel" style="width:230px;height:35px"/><br /><br />
<span style="color:white">验证码:</span> <input id="codeInp" class="easyui-textbox" style="width:140px;height:35px" />
<a id="codebtn" href="javascript:void(0);" class="easyui-linkbutton" style="width:80px;height:35px" onClick="get_mobile_code();"><span id="timeSpan">获取验证码</span></a> <br /><br />
<a id="logbtn" href="javascript:void(0);" class="easyui-linkbutton"style="width:290px;height:35px" onClick="submitForm();">登录</a>
</form>
</div>
</body>
</html>
再看登 陆的这个后台代码
package com.xdcs.web.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 用户登录Controller
* @author Administrator
*/
@Controller
public class UsersLoginController {
@RequestMapping("userLogin")
@ResponseBody
public String userLogin(String uTel,HttpSession session){
session.setMaxInactiveInterval(60*60*24);
session.setAttribute("uTel", uTel);
return "ok";
}
}
这里的后台返回OK之后,就回到了login.jsp 里的AJAX里。
然后,跳到/index 的路径。

这样,又映射到了 index.jsp的页面上。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>EasyUI</title>
<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.4.1/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.4.1/themes/icon.css" />
<script type="text/javascript" src="js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<script type="text/javascript" src="js/jquery.edatagrid.js"></script>
<script type="text/javascript" src="js/datagrid-detailview.js"></script>
<script type="text/javascript" src="js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
<script src="js/highcharts.js"></script>
<script type="text/javascript">
$(function(){
$("#tt").tree({
onClick:function(node){
var flag = $("#tt").tree("isLeaf",node.target);
var flag2=$("#tab").tabs("getTab",node.text);
if(flag){
if(!flag2){
$('#tab').tabs('add',{
title:node.text,
href:node.url,
closable:true
});
}else{
$("#tab").tabs("select",node.text);
}
}
},
});
});
</script>
</head>
<body class="easyui-layout">
<div data-options="region:'north',title:'仓库管理',split:true" style="height: 100px;">
<h2>学到猝死-仓库管理系统</h2>
</div>
<div data-options="region:'south',title:'版权声明',split:true" style="height: 100px;">
<h2 align="center">XDCS</h2>
</div>
<div data-options="region:'west',title:'菜单',split:true" style="width: 200px;">
<ul id="tt" class="easyui-tree" data-options="animate:'true'">
<li data-options="animate:'true',state:'closed'"><span>基本信息管理</span>
<ul>
<li data-options="url:'customer'">客户信息</li>
<li data-options="url:'supplier'">供货商信息</li>
<li data-options="url:'employee'">仓库员工信息</li>
</ul>
</li>
<li data-options="animate:'true',state:'closed'"><span>入库管理</span>
<ul>
<li data-options="url:'showAllInList'">查看入库单</li>
</ul>
</li>
<li data-options="animate:'true',state:'closed'"><span>出库管理</span>
<ul>
<li data-options="url:'showAllOutList'">查看出库单</li>
</ul>
</li>
<li data-options="animate:'true',state:'closed'"><span>系统设置</span>
<ul>
<li data-options="url:'repertory'">仓库信息</li>
<li data-options="">备份和还原数据</li>
</ul>
</li>
<li data-options="animate:'true',state:'closed'"><span>在库管理</span>
<ul>
<li data-options="url:'goods'">管理在库的物品</li>
<li data-options="url:'showCharts'">记录盘点信息</li>
</ul>
</li>
<li data-options="animate:'true',state:'closed'"><span>退货信息管理</span>
<ul>
<li data-options="url:'showAllBackList'">我要退货</li>
<li data-options="url:'showMyBackList'">接收退货</li>
</ul>
</li>
<li data-options="animate:'true',state:'closed'"><span>报表信息管理</span>
<ul>
<li data-options="url:'excel'">打印报表</li>
<li data-options="">查看报表</li>
</ul>
</li>
</ul>
</div>
<div id="tab" class="easyui-tabs" data-options="region:'center',closable:true">
</div>
</body>
串成一个图就是这样的。
1 浏览器输出login地址。
2 后台有一个controller 截到了这个请求。
这个类把这个请求转发给了login.jsp 页面。
3 用户在页面里点击了登陆。
4 后台正确的返回了Ok。回到ajax 里。
5 ajax 转发至/index 的这个地址。
6 后台的类再次截到了这个请求 ,然后转发至index.jsp 的这个页面上。

有人可能就感觉奇怪了,为啥不直接跳到jsp 的页面上,而是要到后台绕这么一圈呢?
1 JSP页面,放在WEB-INF 下面安全,黑客访问不到。
2 经过了这么一个后台的类,让很多的不良请求都自动死掉。
就这么一个小小的改进,当时SSM就轻松的获得了最安全框架的称号。
当然了,性能的损失也是比较大的。
这么安全的框架技术,springBoot 自然也是直接就继承了。所以,默认的情况下,template 里的内容也是不允许访问的,也是在controller 里这样绕一圈。
这里还可以参考《SpringBoot项目中MVC使用–【JSB系列之010】》
再给一下项目里的各配置。




lib 下的JAR包要引入进来!

WEB目录的设置,注意的是不是默认。
看好了web.xml的位置。还有就是web根目录的位置。

这个界面里的一般idea 会有提示,你直接确定就可以了。
运行Tomcat必须的。

跑起来
这里先配置一个tomcat 的服务器,按下图的即可。

这部分的设置比较繁琐,也容易出错,不过本博主发了视频版,可以对着视频的操作步骤一步步的进行设置。
访问如下的URL:
http://localhost:8080/login
浏览器界面
验证码随意填。手机号合法即可。如:18123459876



项目里的细节也比较多,等到下一文里再讲解吧。
好,一步成功点亮,关电,拉闸,领盒饭!走人。
总结
提示:IT是一个要多动手的职业,一定要多练不要贪快:
SSM是一个历史上的辉煌一刻,是现在的springBoot 的基础,springBoot 其实,仅仅是把SSM的JAR包的问题简化了,事实上,各种的思想都还在。spring 还是那个spring。SpringMVC 还是那个 SpringMVC 。
配套资源
IDEA如何配置SSM项目–【唐诗300首】
https://download.youkuaiyun.com/download/dearmite/88191978

2149

被折叠的 条评论
为什么被折叠?



