**内网渗透的本质是信息收集**
**intext:
把网页中的正文内容种的某个字符作为搜索的条件
intitle:
把网页标题中的某个字符作为搜索条件
cache:
搜索搜索引擎李关于某些内容的缓存可能会在过期内容中发现有价值的信息
filetype:
指定一个格式类型的文件作为搜索对象
inurl:
搜索包含指定字符的URL
site:
在指定的站点搜索相关内容
引号 ""
把关键字打上引号后把引号部分作为整体来搜索
or
同时搜索两个或者更多关键字
link:
搜索某个网站的链接
典型用法:
找管理后台地址
site:xxx.com intext:管理|后台|登陆|用户名|密码|系统|账号
site:xxx.com inurl:login/admin/manage/manager/admin_login/system
site:xxx.com intitle:管理|后台|登陆
找上传类漏洞地址
site:xxx.com inurl:file
site:xxx.com inrul:upload
找注入页面
site:xxx.com inurl:php?id=
找编辑器页面
site:xxx.com inurl:ewebeditor**
**主要的信息手机目标:
1.目标站点使用的技术(页面 数据库等) 数据库类型 后台类型
2.目标站点的whois信息 是否可能存在旁站等
3.挖掘目标站点可能使用的网络安全配置 通过收集结果推测防火墙 安全措施架构
4.挖掘目标企业机构可能存在的管理构架 社会工程 钓鱼 爆破 邮箱爆破等等
5.使用站长工具对目标站点进行初步扫描 端口扫描 是否被黑检测 初步扫描 查询IP 等
6.其它与目标站点的相关工具
拿到站点后 首先登陆这个网站去看一看 渗透第一步就是尽可能多的从网站上搜集目标的信息 了解基本情况
目标是做什么的 目标提供的产品和服务 地理位置和练习方式 招聘信息和行证架构 管理层的成员简介 支持论坛和电子邮件命名规则
可能用于密码分析的特殊字符或短语**
**使用站长工具对目标站点进行信息收集
1.IP查询 2.同IP网站查询 3.WHOIS查询和反查 4.子域名查询 5.识别服务器类型 页面类型 6.DNS信息查询 7.网站安全监测 8.端口扫描**
**获取IP地址之类之后 针对性寻找漏洞 例如得知目标系统 曾经是否有被攻击的历史 和被公开的漏洞 获取参考价值 了解目标相关配置
漏洞平台是很好的收集平台 常用漏洞平台 乌云漏洞平台 360补天 Exploit-DB GHDB CVE中文漏洞信息库 中国国家信息安全漏洞库 国家信息安全漏洞共享频台
漏洞库搜索方式 搜索对应厂商 目标企业站点 搜索对应软件平台
信息收集的目标 已有的渗透过程 目标的技术架构 目标使用架构的公开漏洞 目标可能进行的修复**
**"Vi 编辑器 记忆方法 系统 组织结构 |=》文件
Linux系统构成 1.内容 用户===============》文件夹
2.操作====》本地操作=========>服务配置
|===》网络操作=======>网络技术
文件操作===>创建=====》touch
| |==》vi 文件名
| |==》echo "">文件名 将双引号内容写入文件
|===>修改====》文件名========》mv 原文件 现文件 将文件改名或移动
| | |=》rename 原文件 新文件名
| |=》文件内容======》echo "内容">文件 写入 单行
| | |=》echo "内容">>文件 追加内容
| | |=》vi 文件名 写入多行
| |=================》删除 rm 提示是否删除
|===》删除============》强制删 rm -rf 强删无提示
|===》查询============》find 路径 -name 文件名 标准查询 find / -name
|==》where is 文件名 在内存中查找 速度较快
文件夹操作===》创建 mkdir
|==》修改 mv/rename
|==》删除 rmdir rm -rf rm文件夹/*
|==》查询 find
Vi编辑器
打开文件 vi/vim 文件名
关闭文件 按ESC :q 回车 无任何操作
按ESC :q! 回车 不保存退出
按ESC :wq! 回车 保存并退出
编辑文件 先按i输入内容 关闭
先按i输入内容:w保存不退出"**
1.挂载命令 光盘镜像 文件类型 iso
mount -o loop 路径 挂载到的路径
挂载命令 选项 iso9660
2.卸载命令 路径
3.yum源(本地源)的具体配置
配置文件所在路径:/etc/yum.repos.d/
文件类型:.repo
配置本地源所使用的repo文件为:Centos-Media.repo
4.具体操作
切换至root账户
备份原配置文件(复制配置文件所在文件夹)
将/etc/yum.repos.d文件夹内除CentOS-Media外的其它文件删除
修改CentOS-media.repo文件 保存并退出
按顺序执行以下两个命令
yum clean all
yum makecache
安装软件:yum install 软件名称
卸载软件:yum remove 软件名称
1.使用最小安装
2.安装 配置网络 选择英文
3.更新系统
4.常用命令安装 vim wget tfp
wget 路径
5.使用ssh远程连接控制服务器
ssh root@ip地址
ftp open ls dir cd lcd
get下载 put上传
FTP服务器搭建步骤
1.安装VSFTPD
2.查看服务状态
3.配置vsftpd.config 最好备份下
4.配置FTP用户
5.配置FTP用户目录
6.开启防火墙
7.提升目录权限
vsftpd
systemctl start vsftpd
开放端口 20/21
测试匿名登陆
防火墙白名单 firewall-cmd --permanent --zone=public --add-service=ftp
setenforce 0
添加用户
useradd 用户 -d /wwwroot -s /sbin/nologin
chown 用户.用户 /wwwroot -R
passwd 用户
配置FTP
vim /etc/vsftpd/vsftpd.conf
:set number
12行NO
33行YES
48行YES
72行YES
82行YES
83YES
86YES
100YES
如出现不能登陆 则使用 chmod a-w ftp目录
还有chmod 777 目录提权
永久开启权限
getsebool -a|grep ftp
setsebool -P ftpd_full_access 1
1.配置本地源
2.安装
软件 httpd(命令安装)
3.启动服务本地测试 结果正确继续
4.设置防火墙
将80端口添加进防火墙
重启防火墙
5.重启apache
6.网页挂载文件夹
方法1
打开测试页\
方法2
查找配置文件的 DoC
1 安装配置 - --》安装yum install nginx + 源码 wget 下载 tar 解压 ifconfigure --->make
2 虚拟主机 关闭其它web服务器 ----->make install
3 负载均衡 防火墙---》启动
4 反向代理
ip addr
修改配置文件/etc/sysconfig 该目录下有各种网卡配置文件
网卡配置文件
TYPE=Ethernet
BOOTPROTO=none //这里将DHCP换成手动
IPADDR0=192.168.146.150
PREFIX0=24
GATEWAY0=192.168.1.1
ONBOOT=yes
开启关闭查看
systemctl status firewalld
systemctl start firewalld
systemctl stop firewalld
firewall-cmd --list-ports 查看防火墙开放端口列表
默认开放22端口
firewall-cmd --add-port=8282/tcp --zone=public --permanent
firewall-cmd --reload
firewall-cmd --complete-reload
firewall-cmd --remove-port=8282/tcp --zone=public --permanent
firewall-cmd --reload
tar -xvf 解压
静态 nginx/httpd
动态 tomcat 端口号8080 已安装jdk对应版本
解压软件包
1.用户需求分析 2.获得智能大厦的平面图
3.综合布线系统技术设计
4.综合布线路由走线设计
5.设计方案可行性论证
6.绘制综合布线施工图
7.编制综合布线工程材料清单
水平布线主要有六种类型的布线方式
地板下管道型(一层或二层)
蜂窝型 金属和混凝土
无限制的进出行 活动地板
吊顶型 顶棚型
管道型
其它类型
吊顶内布线形式的主要方法
区域布线法
内部布线法
电缆管道布线法
插通布线法
将网络分成 管理网络 业务网络 管理网络:对整个网络进行维护 业务网络:专业性的伺服
将所有的网络设备配置备份 属于管理网络 Vlan虚拟局域网:vlan1 --->默认通
逻辑vlan 管理IP地址 多交换机同一网段
建立用密码 等级 用户类型 用户根目录
开启FTP服务或TFTP
cmd ftp 主机vlan1地址 输入用户密码 get vrpcfg.zip
显示当前配置 display current-configuration
显示当前接口或状态 display this 显示局部内容
user-interface vty 0 4 进入用户模式
authen mode aaa //远程登陆的
protocol inbound ssh //远程登陆的
local-user 添加用户
local-user 用户 privilege level 15 密码等级
local-user 用户 service-type ftp 设置服务类型 //远程需要修改为ssh
local-user 用户 ftp-directory 目录 设定用户目录
ftp server enable 启动ftp
stelnet server enable //远程登陆的
用户视图下 SAVE 保存
1.子接口 路由器 高端三层 或路由器 单臂路由
2.vlan接口 可配IP
3.null 0 黑洞过滤泛洪攻击 防路由器环路
4.loopback 启用之后 长期处于up状态 用途管理网络
1.动态vlan 应用场景:时间短任务量大
2.思路
1 配置接入层 端口划分到不同vlan
2 在每台交换机全局开启GVRP协议
3 在端口开启trunk'模式 在Trunk口开启gvrp协议
注意:交换机相连口为Trunk口 注意开启gvrp
验证:没有配置vlan的交换机能够学习到
著交换机
分配子vlan
vlan 4
aggregate-vlan
access-vlan 子vlan to 子vlan
配置超级vlan
配置超级vlanip地址
arp-proxy inter-sub-vlan-proxy enable
进入与交换机相连的Trunk口 不可以使用port trunk allow vlan all
只可以使用 port trunk allow-pass vlan 子vlan to 子vlan 允许通过
其它交换机不需要配置超级vlan
静态路由
默认路由 缺省路由
动态路由
不同网段之间通信除了设置网关 还要 路由的方式
路由器多个网段做静态时 用缺省0.0.0.0通报该路由器全网段
交换机等单个时用静态路由单个网段通报
注意:路由端口分配vlan时 进入端口设置portswitch 切换成二层端口 才能分配Vlan
ip route-static x.x.x.x xx x.x.x.x
第一段X:哪个网段要Ping我 要经过哪些网段
第三段X:我对面的IP地址是多少
我:写静态路由的设备
反掩码 正掩码 减反掩码 ==反掩码
undo ter mo 禁用调试信息
1.立项背景
2.设计思路
3.使用对象
4.项目的目标
5.功能列表
6.所用技术/技术路线
7.责任人
作用
连接的标识 前后端连接
验证登陆 前台 发送账号密码到后台 后台先检测session的标记
思路:
前端js 定义三个方法getCookie checkStat checkCookie delCookie
作用分别是获取Cookie 查询Cookie状态 检查Cookie内容 删除Cookie
当用户点击登陆后 后端验证登陆是否成功 成功后在后端Servlet创建Cookie
Cookie Cookie变量名 =new Cookie("参数变量名", 参数);
Cookie Cookie变量名 =new Cookie("参数变量名", 参数);
//套用到项目后如下
Cookie usernamecookie =new Cookie("username", username);
Cookie passwordcookie =new Cookie("password", password);
//然后设置Cookie有效时间
Cookie变量名.setMaxAge(时间); //时间是整数型
//上面就是Cookie的创建过程 最重要的一步来了 将创建的Cookie添加到响应里
resp.addCookie(Cookie变量名); //resp是servlet里的respon
//套用到项目后的完整代码
/**
* @Title: checkUser
* @Description: TODO(反射验证登陆)
* @param req 请求
* @param resp 回复
* @throws ServletException
* @throws IOException 设定文件
* @return void 返回类型
*/
protected void checkUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("content-type", "text/html;charset=UTF-8"); // 设置中文不乱码
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
String username=req.getParameter("username");
String password=req.getParameter("password");
System.out.println("从前端获取到的账号:"+username+"从前端获取到的密码:"+password);
DB database=new DB();
database.connectServer();
UserInfo temp=new UserInfo();
if (database.autoUser(username, password)) {
System.out.println("登陆成功!");
username=URLEncoder.encode(username, "utf-8");
password=URLEncoder.encode(password, "utf-8");
Cookie usernamecookie =new Cookie("username", username);
Cookie passwordcookie =new Cookie("password", password);
usernamecookie.setMaxAge(9999);
passwordcookie.setMaxAge(9999);
resp.addCookie(usernamecookie);
resp.addCookie(passwordcookie);
resp.sendRedirect("/WebTest/Index.html");
try {
database.closeConnect();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}else {
PrintWriter out=resp.getWriter();
out.print("");
System.out.println("登陆失败!");
try {
database.closeConnect();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
反射机制的应用
1.使用场景 每一个功能一个servlet 太复杂
呈现功能相关性 减少代码量
2.具体操作
设定一个参数作为指向的方法名称
在servlet中获取该参数值,程序将跳转至同名方法处
同名方法与dopost/doget方法 相比仅有名称差别 用法相同
Method method=this.getClass().getDeclaredMethod(name,HttpServletRequest.class,HttpServletResponse.class);
代码如下:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("content-type", "text/html;charset=UTF-8"); // 设置中文不乱码
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
System.out.println(req.getParameter("function"));
String name = req.getParameter("function");
try {
Method cs = this.getClass().getDeclaredMethod(name,HttpServletRequest.class,HttpServletResponse.class);
cs.setAccessible(true);
cs.invoke(this, req, resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
后台
gson
1.作用:传递信息
2.格式
3.信息读取
4.使用
1.前台:获取后台返回gson信息 解析后使用信息
2.后台 将字符串/链表/数组 封装 使用servlet中printwriter的方法返回给前台
3.使用场景 提高访问速度 保证页面局部刷新
Jquery 常规数据
表单数据 含文件
不含文件
AJAX 前台到后台 使用jquery传递
1.不包含表单数据
1.导入框架 jquery.js/jquery.min.js
jq ajax例题如下
$.ajax({
//请求方式
type:'POST',
//发送请求的地址
url:'fzz.php',
//服务器返回的数据类型
dataType:'json',
//发送到服务器的数据,对象必须为key/value的格式,jquery会自动转换为字符串格式
data:{name:xxx,age:xxx},
success:function(data){
//请求成功函数内容
},
error:function(jqXHR){
//请求失败函数内容
}
});
3.后台接受方式与servlet表单接受相同
2后台到前台 接受gson 后台发送制作gson
1.添加jar包 2.制作gson数据 3.返回前端 4.前端解析
Gson gson=new Gson();
String resu=gson.toJson(result);
PrintWriter out=resp.getWriter();
out.write(resu);
布局时 注意分配百分比
function forImpNews(){
$.ajax({
url:"CommonServlet" , // 请求路径
type:"POST" , //请求方式
//data: "username=jack&age=23",//请求参数
dataType:"text",
data:"function=forImpNews",
success:function (data) {
var dataObj=eval(data);//转换为json对象
},//响应成功后的回调函数
error:function () {
},//表示如果请求响应出现错误,会执行的回调函数
async:false
});
}
ajax传输的是数组 直接用下标加字段或变量名
a标签地址传参
data:{“id”: window.location.search.split(“id=”)[1]},
使用BootStrap做前端实现
基本特点
布局 xs sm md lg
由左到右 12格
大小 col-sm-2
位置 竖直 定义空白设定尺寸
水平 col-sm-offset-2
1.domain
2.dao
3.service
4.action
1.在需要跳转的页面的父页面 使用a标签传参 例如需要传送的参数有 id 和 type 例题如下
此时你传到NewsContent这个页面时就带了type和id这两参数它们的值分别是
type==News;id==233;
2.编写js获取上面a标签传来的参数 并封装城方法 例子如下
原理以及思路 方法 window.location.search可自行搜索 主要是通过截取url获取
function getQueryString(name) {
var result = window.location.search.match(new RegExp("[\?\&]" + name + "=([^\&]+)", "i"));
if (result == null || result.length < 1) {
return "";
}
return result[1];
}
3.调用方法(给萌新看)
var id= getQueryString("id");
var type=getQueryString("type");
4.获取到参数后调用ajax与后端交互 例子如下 !!!未完待续!
function forNews(){
var id= getQueryString("id");
var type=getQueryString("type");
if(type.toString()=="News"){
$.ajax({
url:"CommonServlet" , // 请求路径
type:"POST" , //请求方式
dataType:"text",
data:"function=forNews", //反射机制的参数是forNews 调用servlet forNews方法
//forNews方法返回一个链表 从数据库里获取到信息并返回链表 在下面接收
success:function (data) {
var dataObj=eval(data);//转换为json对象
for (var i = 0; i < dataObj.length; i++) {
if(dataObj[i].id==id){
var divs = document.createElement("div");
var ps = document.createElement("p");
var titles = document.getElementById("title");
document.getElementById("body_main_content_noticeborder_content").appendChild(divs);
divs.appendChild(ps);
ps.innerHTML=dataObj[i].content;
titles.innerText=dataObj[i].title;
}
}
},//响应成功后的回调函数
error:function () {
},//表示如果请求响应出现错误,会执行的回调函数
async:false
});
}
}
1.1表明数据之间关系
1.2减少程序冗余,提升效率
1.Java基础语法
2.数学(四则运算) 函数
线性代数 空间几何
1.数据特征 非常明确
2.对应数据类型基本操作
3.Java中对应抽象类有哪些 方法是什么
4.不同类型之间对比
1.相关名词
1.1数据,数据项 就是用到的数据
1.2数据元素
1.3数据对象
1.4数据结构 数据与数据之间的关系
D={1,2,3,4,5}
R={(1,2),(1,3),(2,4)}
将不固定类作为参数提供给程序使用
1.定义
Set 符号里自定义
Student类 方法中做参数
Public void show(T t){
Object o = t;
System.out.Println(o);
}
课本6.7页 定义接口
查找方法 对参数T进行的处理
1.获取类型
2.与操作对象执行相关操作 课本第五页 七个数据操作
1.存储信息
不针对具体类型
2.存储方式
内部:数组方式
3.存放的数据特征(不管哪种数据类型)
1.一组有关系的数据
2.物理位置与逻辑位置对应
3.数据 长度固定
4.基本操作(第五页)
5.抽象描述
1.使用接口描述(18页)
2.创建操作使用 不能在接口里构造 构造方法是实现方法 用构造方法 接口中不做体现
6.Java里的数据存储:
1.单个数据存储:八种基本数据类型
2.多个相同类型 数组 字符串
3.多种数据类型构成的一组数据(数据结构 Object)
1.例:数据库种数据表存储 mdf 典型顺序应用
Public interface IList{
Public void clear();
Public Object get(int i);
Public void insert(Object obj,int x);
}
实现接口
1.初始化 设定线性表的长度
2.插入操作
a 检测表是否存满
b 确保可以存储的方式:检测现有表的长度 插入数据到指定位置
c 存入数据到指定位置
采用链式存储方式村粗的线性表称为链表 链表是用若干地址分散的存储单元存储数据元素
逻辑上相邻的数据元素在屋里位置上不一定相邻 必须采用附加信息表示数据元素之间的逻辑关系
因此链表的每一个结点不仅包含元素本身的信息-数据域 而且包含元素之间的逻辑关系的信息
即逻辑上相邻结点地址的指针域
单链表是指节点种只包含一个指针域的链表,指针域种存储着指向后继结点的指针。
单链表的头指针是线性表的起始地址,是线性表种的第一个数据元素的存储地址,
可作为单链表的唯一标识。单链表的尾节点没有后继节点,所以其指针域值为null。
为了使操作简便,在第一个结点之前增加头结点,单链表的头指针指向头结点。
头结点的数据域不存放任何数据,指针域存放指向第一个结点的指针。
空单链表的头指针head为null 为不带头结点的单链表存储示意图
单链表的结点的存储空间是在插入和删除过程中动态申请和释放的 不需要预先分配
从而避免了顺序表因存储空间不足需要扩充空间 和复制元素的过程,
避免了顺序表因容量过大造成内存资源浪费的问题 提高了运行效率和存储空间利用率。
1.特点:先进后出
2.应用场景
TCP/IP协议种数据的变化
程序设计中递归调用的解释程序
3.任务要求
做好与线性表的对比工作
掌握栈的抽象数据类型描述
1.特点:先进先出
2.基本操作
初始化 清空 插入 删除 指定位置插入数据 获取指定位置数据 遍历 获取长度
3.节点类
结构:一个存放数据的变量 如果为单链表 需另定义一个类型同节点仙童的变量
作为指向下一节点 上一节点的标志
查找数据为5的结点 先序
1结点 递归 调用方法 是否为空 是否为最后一个 是否为终端结点
2结点同上
3结点同上
4结点同上
5结点同上```
链表通过节点的方式来连接不同的数据 节点类Node 方法:next(下一节点) data(该节点数据)
//下面结点文字 误打为节点 不改了 太累了
插入
思路:单链表头节点插入 因只有头节点 插入需要先找到i位置的-1节点 前驱节点 j记录循环位置
在方法开头需要先定义一个节点复制head节点
1.寻找插入位置的前驱节点
2.判断 在循环寻找前驱节点下判断是否插入异常 j>i-1 || p=null; 并抛出异常
3.新建节点 新建节点指向头节点的下一节点
4.头节点的下一节点指向新建节点
//形成位置的调换 新节点指向了头节点的下一节点 头节点的下一节点指向了s 相当于插队排序
带头结点与不带头结点插入操作
双向链表的结点具有两个指针域,一个指针指向前驱结点,一个指针指向后继结点。
使得查找某个结点的前驱结点不需要从表头开始顺着链表依次进行查找 减小时间复杂度
1.结点类描述
public class DuLNode{
public Object data;
public DuLNode prior;
public DuLNode next;
public DuLNode(){
this(null);
}
public DuLNode(Object data){
this.data=data;
this.prior=null;
this.next=null;
}
}
2.双向链表基本操作实现
其与单链表的不同之处主要在与进行插入和删除操作视每个结点需要修改两个指针域。
public void insert(int i,Object x) throws Exception{
DuLNode p=head;
int j=-1;
while(p!=null&&j<i){
p=p.next;
j++;
}
if(j>i||p==null){
throw new Exception("插入位置不合法");
}
DuLNode s =new DuLNode(x);
p.prior.next=s;
s.next=p;
p.prior=s;
}
顺序表
优点:可进行高效随机存取 存储密度高空间开销小 实现简单便于使用 缺点:需要预先分配存储空间 不便插入删除
链表
优点:灵活 可进行存储空间的动态分配 插入删除效率高
缺点:存储密度低 不可按照序位号随机存取
1.线性表是其组成元素间具有先行关系的一种线性结构 其实现方式主要为基于顺序存储的实现基于链式存储的实现
2.线性表的顺序存储结构称为顺序表可用数组实现可对数据元素进行随机存取 时间复杂度O1在插入或删除为On
3.线性表的链式存储结构称为链表不能直接访问给定位置上的数据元素必须从头开始沿着后继结点进行访问
时间复杂度On在插入或删除数据元素时不需要移动任何数据元素只需要更改结点的指针域即可时间复杂度o1
4.循环链表将链表的首尾相连即尾结点的指针域为指向头结点的指针 从而形成了一个环状链表
5.双向链表的结点具有两个指针域 一个指针向前驱结点一个指针指向后继结点使得查找某个结点的前驱结点
不需要从表头开始顺着链表依次进行查找 减小时间复杂度
public class Data {
public int[] insertData(int [] arr,int x,int number) {
if (x>=arr.length) {
int [] arrs=new int [x];
for(int i=0;i
arrs[x-1]=number;
}
return arrs;
}else {
arr[x]=number;
}
return arr;
}
public void showData(int [] arr) {
for(int i=0;i0||x>size-1) {
for (int i = x; i < size-1; i++) {
arr[i]=arr[i+1];
}
System.out.println("fuck");
arr = Arrays.copyOf(arr, arr.length-1);
}
return arr;
}
1.概念
解决问题的方法
2.衡量标准
时间复杂度 优先度第一
程序执行所需的事件 每一行都是时间1 注释不计入时间
空间复杂度 优先度第二
程序执行时所需存储 变量所占用空间
衡量标准11页
1.Eclipse + JDK 配置 使用
1.配置
1.安装JDK
2.解压集成环境IDE
3.Eclipse运行 配置项目空间等 然后可以使用
2.项目建立
1.File
2.New Project
3.Java JavaProject
4.输入所要创建的项目名称(与实际需求一致)
5.Finsh
包创建/类创建
1.打开项目
2.选中src 右键
3.New Package包
4.输入包名 域名倒过来 均为小写字母+包所有类实现的重要功能描述
3.项目运行调试
2.基础语法
3.类的使用+方法/属性
4.多线程
5.集合
6.I/O
7.界面
8.网络编程
1.含义:调用自身:指方法
int circle(int mess)
return circle(mess);
public class Circle {
int max=0;
public int circle(int[] array,int i) {
System.out.println("数组的长度:"+array.length);
int y;
int n;
if (i>=array.length-1) {
y=0;
n=0;
}else {
y=array[i+1];
n=array[i];
}
if (i==array.length) {
}else {
if (max>n&&max>y) {
max=max;
}else if (max
1.作用:说明变量 方法 类的可用范围
2.关键字:private default protected public
SSM 是 Spring + SpringMVC + Mybatis集成的框架。
一、entity层
同类: model层 = entity层 = domain层
作用: 用于存放我们的实体类,与数据库中的属性值基本保持一致。
二、mapper层
同类: mapper层 = dao层
作用: 对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的
三、service层
同类: 只有一个 service层
作用: service层 是针对 controller层的 controller,也就是针对我们使用者。service的 impl 是把mapper和service进行整合的文件。
四、controller层
同类: controller层 = web 层
作用: 控制器,导入service层,因为service中的方法是我们使用到的,controller通过接收前端传过来的参数进行业务操作,再将处理结果返回到前端。
SSM中各层作用及关系
SSM中各层作用及关系
1.持久层:DAO层(mapper层)(属于mybatis模块)
?DAO层:主要负责与数据库进行交互设计,用来处理数据的持久化工作。
?DAO层的设计首先是设计DAO的接口,也就是项目中你看到的Dao包。
?然后在Spring的xml配置文件中定义此接口的实现类,就可在其他模块中调用此接口来进行数据业务的处理,而不用关心接口的具体实现类是哪个类,这里往往用到的就是反射机制,DAO层的jdbc.properties数据源配置,以及有 关数据库连接的参数都在Spring的配置文件中进行配置。
?ps:(有的项目里面Dao层,写成mapper,当成一个意思理解。)
2.业务层:Service层(属于spring模块)
?Service层:主要负责业务模块的逻辑应用设计。也就是项目中你看到的Service包。
?Service层的设计首先是设计接口,再设计其实现的类。也就是项目中你看到的service+impl包。
?接着再在Spring的xml配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。
?最后通过调用DAO层已定义的接口,去实现Service具体的实现类。
?ps:(Service层的业务实现,具体要调用到已定义的DAO层的接口.)
3.控制层/表现层:Controller层(Handler层) (属于springMVC模块)
?Controller层:主要负责具体的业务模块流程控制,也就是你看到的controller包。
?Controller层通过要调用Service层的接口来控制业务流程,控制的配置也同样是在Spring的xml配置文件里面,针对具体的业务流程,会有不同的控制器。
4.View层 (属于springMVC模块)
?负责前台jsp页面的展示,此层需要与Controller层结合起来开发。
?Jsp发送请求,controller接收请求,处理,返回,jsp回显数据。
3.三层架构运行流程
SSM框架下web项目运行流程
4.各层之间的联系
?DAO层,Service层这两个层次可以单独开发,互相的耦合度很低。
?Controller,View层耦合度比较高,因而要结合在一起开发。也可以听当做两层来开发,这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,项目会显得清晰简单。
?值得注意的是,Service逻辑层设计: ?Service层是建立在DAO层之上的,在Controller层之下。因而Service层应该既调用DAO层的接口,又提供接口给Controller层的类来进行调用,它处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。 ?SSM框架下web项目运行流程
4.SSM框架实现一个web程序主要使用到如下三个技术:
1.Spring:用到注解和自动装配,就是Spring的两个精髓IOC(反向控制)和 AOP(面向切面编程)。
2.SpringMVC:用到了MVC模型,将流程控制代码放到Controller层处理,将业务逻辑代码放到Service层处理。
3.Mybatis:用到了与数据库打交道的层面,dao(mapper)层,放在所有的逻辑之后,处理与数据库的CRUD相关的操作。
比如你开发项目的时候,需要完成一个功能模块:
1.先写实体类entity,定义对象的属性,(可以参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。
2.写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进行的那些操作,比如 insert、selectAll、selectByKey、delete、update等。
3.写Mapper.java/Dao.java,将Mapper.xml中的操作按照id映射成Java函数。实际上就是Dao接口,二者选一即可。
4.写Service.java,为控制层提供服务,接受控制层的参数,完成相应的功能,并返回给控制层。
5.写Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。
6.写JSP页面调用,请求哪些参数,需要获取什么数据。
前端AJAX请求到Controller 返回对象给Ajax Ajax将返回值转换格式之后操作