软件专业方向和专业技能
专业方向:
- 前端方向
html 页面内容展示
js: 动态交互
css: 页面的样式
jquery: js框架
ajax: 异步交互 异步访问后台的逻辑
bootstrap: 响应式布局
elementui: 饿了么 ui框架 vue的基础之上的
vue: MVVM模型 Model View View Model模型
react:
angularjs:
微信开发者工具: 编写小程序
uniapp:
很多的前端ui框架
-
后台开发
javaoop : java面向对象 封装 继承 多态 File 文件 IO流 (输入输出流 ) 多线程 异常
javaeweb: 服务器端编程,所有的服务器代码资源使用web服务器tomcat来部署发布
servlet jsp cookie session jstl标签库 el表达式
框架:
spring springmvc mybatis ssm 三大框架整合 ssm在框架里面就是一个基础性的框架
springboot 其实就是对ssm的配置的进一步封装
微服务框架: (springcloud dubbox springcloudalibaba)
关系型数据库: mysql sqlserver oracle 以表的形式来呈现
NoSql: Not Only Sql 非关系型数据库: 数据结构是key value键值对形式
redis mongdb
中间件技术:
消息队列: rabbitmq activemq kafka rocketmq zeromq
上传服务器: fastdfs 阿里云oss 七牛云
搜索服务器: ElasticSearch Solr
发送短信验证码: 阿里短信
单点登录: token+jwt
授权: oauth2
安全框架: springsecurity shiro
分布式事务:
缓存: redis,运行在内存里面
秒杀模块的实现思路: 特点: 高并发 高可用
钉钉审批功能: 工作流 activity
项目: 办公系统 OA 进销存系统 CRM(客户关系管理系统 ) 电商项目 金融项目 租房类项目 在线教育项目
nginx: web服务器:1. 反向代理 2. 负载均衡 3. 动静分离 并发量比较高 5W
设计模式: 23种设计模式 创建型 结构型 行为型
jvm调优 :
sql优化:
spring底层:
springmvc执行原理:
springboot的配置以及执行原理微服务的核心组件级原理
-
学校里面: 计算机网络 数据结构 c++ java面向对象 File IO流 Servlet Jsp jstl el表达式 spring springmvc mybatis学过 mysql
学校里面: 现状:
软件开发需求:后台开发技术栈
差距:》努力==》满意的工作
else: 软件专业===> 毕业之后找不到开发的工作===》专业 大学四年 学无所用====》 可能终生与这个专业擦肩而过
一边努力一边抬头看方向
学习方法:
编程是实践性很强的技术
少看多练: 看10遍没有练习1遍的效果好
现在: 11月份 就业季 明年7月份拿毕业证 中间5个月左右时间 ,经过合适的方法+努力,完全可以掌握这些技术栈,达到企业的要求
进公司还需要不断学习:
刚进公司, 3年经验,5年经验,10年经验的程序员 区别在什么地方?
薪资不一样,经验不一样,对知识点掌握的深度不一样,解决问题的能力不一样
软件开发 技术栈一般就那么多,就意味着这么多技术栈相当于 一把剑
刚进公司: 这把剑 还是比较钝
3年经验: 这把剑 可以砍断木头
5年经验: 砍断杂物
10年经验: 削铁如泥
知识领域 一般来说 就这么多知识点,技术栈;不同经验的人画的时间和精力不一样;
以技术论英雄
授课安排:zz
1、 学习方法
- 项目参观,评价
- 作业,上午上课,下课作业,第二天提交作业,课前分享,每天2个同学课前分享
- 上课 复习javaoop
- servlet ,jsp 讲解核心知识点
- spring (IOC控制翻转和DI以来注入), Mybatis(持久层框架),springmvc
- ssm整合,增删改查,maven管理工程
- ssm项目 融合各种技术点: 验证码,登录 注册, 多个模块,前端页面布局,角色权限管理,echarts图表,获取系统信息,日志管理,前后端分离,vue前端框架
- 根据同学们的需求具体讲解某个技术
1115 面向对象复习:
变量:
数据类型:
基本数据类型: 8种
数值:
整数:byte short int long
小数:float double
字符: char
布尔: boolean false/true
引用数据类型: 创建的时候一般使用new关键字来创建
String 数组 类 接口
运算符:
数学运算符: + - * / %
单目运算符: ++ –
三目运算符: 条件表达式 ? 表达式1 : 表达式2
比较运算符: > >= < <= == !=
逻辑运算符: && ! 与或非
分支判断:
if else
if else if else if …else
switch() case 支持的数据类型: string(jdk7版本之后) byte short int
循环:
for
while
do…while
break 跳出当前循环 ,未执行的不再执行 continue 跳出本次循环,本次不再执行,后面还继续
数组:
数组定义时必须 指明长度,类型固定的
javaoop:
java面向对象:
类和对象:
Thinking in Java :
类里面定义的是属性和方法
属性: 特征 ; 表示是静态的; 声明的时候 数据类型 变量;
方法:
普通方法:
分为有参的和无参的构造方法
分为有返回值和无返回值的方法 void
构造方法:
用于构造对象或者初始化对象的时候使用的方法,使用new关键字
加载时机: 构造对象,初始化对象,new关键字的时候使用调用的
根据有无参数: 分为有参的构造方法和无参的构造方法
构造方法:
当系统里面没有任何构造方法的时候,系统将会默认提供一个无参的构造方法;
当你有有参的构造方法的时候,系统将不再默认提供
平时写代码的时候,建议有参的和无参的全部写上
深层次理解构造方法的原理?
方法:
方法的重载: 用在一个类里面: 方法名相同,参数列表不一致(参数类型及个数不一致);跟返回值类型无关
包括构造方法的重载和普通方法的重载
方法的重写: 子类重写父类相应的方法 方法名相同, 参数列表一致,方法里面的逻辑不一样
面向对象的特征:
-
封装: 属性私有,通过公共的gettersetter方法来实现对属性的访问
-
继承: 子类 extends父类, 可以继承父类的属性和普通方法,构造方法不能被继承
-
多态: 用父类来代表子类,调用的是子类重写之后的方法逻辑,通过父类来表现出子类不一样的状态
多态本质上就是向上转型
条件:
1. 要有重写 1. 要有继承 1. 父类的引用指向子类对象
关键字:
this关键字:
1. this.属性 当参数名和属性名有冲突时,在属性前加this加以区分
2. this() 表示在一个构造方法里面调用另外一个无参构造方法,只能放在第一行
3. this(参数值,参数值..) 表示在一个构造方法掉头另外有个有参的构造方法,只能写在第一行
4. this.方法名() 表示调用另外一个普通方法
访问权限修饰符:顺序从小到大
private 私有的 只能在本类里面使用
[default] 默认的,不写就是默认的 可以在本包里面使用
protected 受保护的 只能在本包里面或者异包的子类里面使用
public 公共的 在任何地方都可以使用
super关键字: 在子类里面调用父类相应的逻辑
-
super.属性 在子类里面调用父类相应的属性
-
super() 表示在子类的构造方法里面调用父类的无参构造方法,只能放在第一行
-
super(参数值,参数值…) 表示在子类的构造方法调用父类相应的有参的构造方法,只能写在第一行
-
super.方法名() 表示在子类里面调用父类有参的构造方法
final关键字: 最终的
- final 变量 : final 修饰的变量就是一个常量,不能被重新赋值
- final 类: final修饰类的时候,不能被继承
- final 方法: final修饰方法的时候,不能被重写
static关键字: 静态的
-
static 属性: 用static修饰的属性属于类变量
类变量 :属性属于该类所有;该属性的值和它所有的实例之间是一对多关系
实例变量: 每个对象都有一个对应的值
-
static 方法: 静态方法 在静态方法里面不能调用非静态内容
static修饰的属性或方法可以通过对象或者类名来调用,建议通过类名打点调用
-
static{} 静态代码块 里面也不能调用非静态内容
加载时机: 一般在第一次使用到该类的时候就自动加载执行,一般用于执行一些初始化工作
抽象类:
类前面有abstract关键字,那这个类就是一个抽象类
抽象类里面可以没有抽象方法,有抽象方法的类必定是抽象类
抽象方法: 方法前面有abstract关键字; 抽象方法没有方法体,包括{}也没有
抽象类的子类必须重写抽象类里面的抽象方法,抽象类不能实例化,必须使用他的具体的实现类
接口:
interface来声明接口
接口里面只能定义常量 和 抽象方法; 接口里面的抽象方法可以没有abstract关键字
接口不能直接使用,必须使用接口的实现类;
一个类可以实现接口,implements关键字,实现接口;必须要重写接口里面的抽象方法
继承只支持单根继承,一个子类只能继承一个父类;但是可以同时实现多个接口
接口可以弥补继承只能继承单个的不足
public class Student extends Person implements Player,Singer{}
抽象类和接口的区别:
- 抽象类侧重于属性,接口侧重于行为能力,约定
- 抽象类里面可以有普通方法,接口只能有常量和抽象方法
- 抽象类和接口都不能直接实例化,他们的子类或者实现类都必须重写里面的抽象方法
异常:
一旦出现异常,程序会中断执行,后续代码执行不了
编译期异常 和 运行期异常
Exception: 是所有异常的父类
处理异常的方式:
-
try catch
-
try{}catch(){}finally{}
finally: 表示最终无论都会执行的逻辑
-
throws 异常类型; 方法的签名后面
产生一个异常对象:
throw 异常对象;
throw关键字一般和try catch或者throws搭配使用
集合: 可以存储各种数据类型(Object类型),里面内置了很多现成的方法
Collection (接口):
List (子接口) 有序的
实现类: ArrayList LinkedList
Set(子接口) 无序的
实现类: HashSet TreeSet(带排序功能的Set集合)
Map <Key,Value>(接口) 里面放的是键值对:
实现类: HashMap HashTable Properties(放的是键值对,可以持久化存储)
线程:
定义方式: 继承Thread 和 实现Runnable,都必须重写run方法
-
class 线程类 extends Thread{
public void run(){}
}
new 线程类().start()
-
class 线程类 implements Runnable{
public void run(){}
}
new Thread(new 线程类()).start()
run(): 线程体的主执行方法
start(): 启动某个线程的方法
sleep()
1116 JavaWeb入门
-
BS架构和CS架构
BS: Brower Server 浏览器服务器结构;以浏览器为载体来访问web服务器端
CS: Client Server 客户端服务器结构 腾讯QQ等客户端软件
javaweb: 其实是面向BS架构的,本质上做得是web服务器端编程
-
Web编程 做的是web服务器端编程
web服务器端包含:
前端:
呈现在用户浏览器里面的页面信息;肯定是前端技术:
html 页面内容的呈现 js 页面动态效果 css 页面样式效果
后台:
在后台运行的某些业务逻辑,比如登录,注册,分类显示,商品列表,商品详情,加入购物车,支付等
servlet jsp jstl标签库 el表达式;
javaweb学的核心就是后台技术,servlet,jsp
数据库: 所有的数据信息,包括商品,订单,分类,品牌等都是存在数据库里面的
用的比较多的是mysql数据库
web编程 和 javaoop (java面向对象)的区别:
javaoop: 理论性比较强
javaweb: 实践性很强,技术比较多,比较杂,重在运用
idea:
常用的快捷键:
alt+enter 快速提示
syso+快速提示=输出语句
main/psvm+快速提示= main方法
alt+insert=快速生成构造方法,gettersetter方法等
平时使用的软件环境:
、 建议: jdk8 + mysql 5.7 + tomcat9+ maven 3.6.0+ idea 2020.1
mysql安装的时候注意: 最好是一次性安装成功,如果安装失败,需要进注册表删除某些东西,才能再次安装
前端:
html js css
-
后台:
servlet
- 什么是servlet?
servlet其实就是服务器端的小程序,或者就是一个容器,就是用来接收请求,执行相应的业务逻辑,最终产生响应给客户端浏览器
-
写一个servlet程序
-
部署到web服务器里面、
使用的是tomcat服务器:
直接解压到英文路径底下,软件工具最好不要放在中文路径底下
创建web工程 勾选web application---->输入工程名
配置tomcat服务器,一般来说配置一次即可
创建第一个servlet,配置urlpatterns,对用的浏览器的访问路径
启动tomcat服务器
当代码改动过后,需要重启tomcat服务器
重点核心:
先把web环境搭起来: 1. 创建web项目 2. 关联配置tomcat服务器 3. 创建servlet 4. 通过浏览器来访问servlet,测试后台运行效果
登录的实现逻辑:
- 登录页面 login.html action="" action的属性值执向后台的LoginServlet的urlPatterns的值
- 后台登录的servlet LoginServlet
- 取参数 通过request对象来取值 request.getParameter(String name) 参数名必须和前台表单的name属性值保持一致
- 判断登录的处理逻辑
- 产生响应给客户端浏览器 登录成功/登录失败
1117 servlet详解
1.servlet的体系结构:
普通的java类 extends HttpServlet(http协议相关的servlet)===》extends GenericServlet(跟协议无关的,通用的servlet)
====> implements Servlet(接口), ServletConfig (接口)
创建好的这个servlet继承了很多类和实现了很多接口,类里面的属性和方法以及接口里面的方法都能继承过来,可以直接使用
2. Servlet: 接口
常用方法:
void init() 初始化方法
void init(ServletConfig config) servlet初始化方法
void service(ServletRequst request,ServletResponse response) servlet的服务方法
void destroy() servlet的销毁方法
ServletConfig getServletConfig() 获取ServletConfig对象
3. HttpServlet: 抽象类
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 处理get请求
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 处理post请求
protected void service(HttpServletRequest req, HttpServletResponse resp) 处理所有的请求方式
4 HttpServletRequest: 请求对象
当用户发送的请求到达servlet容器时,包含数据的请求将被转换为HttpServletRequest对象,对请求数据的处理工作便由HttpServletRequest对象完成。
方法:
public String getParameter(String name) 返回指定name对应的参数的值
public String[] getParameterValues(String name) 返回指定name对应的一组参数值,返回值是数组
public Enumeration getParameterNames() 返回所有客户请求的参数名
String getMethod() 获取请求的方法 (GET,POST)
String getRequestURI() 获取请求的uri
StringBuffer gerTrequestURL() 获取请求的URL
String getProtocol() 获取请求协议的版本号
5. HttpServletResponse: 响应对象
把服务器对客户端浏览器的所有响应内容封装到该对象里面
常用方法:
void setContentType(String str) 专门设置content-type这个响应头
PrintWriter getWriter() 获取一个字符方式的响应 输出流
ServletOutputStream getOutputSttream() 获取一个字节方式的响应 输出流
6. ServletConfig: 接口
常用方法:
getInitParameter(String param) 根据参数name值返回对用的初始化参数值 一个名称对应一个值
getInitParameterNames(String param) 根据参数名返回该name对应的所有的参数值 一个名称对应多个值
getServletContext() 返回一个ServletContext对象
getServletName() 返回当前servlet的名称,即@WebServlet的name属性值,如果没配,返回全限命名
注意: 一个Servlet对应一个ServletConfig对象
7. ServletConext: 接口
如何在servlet中获取ServletContext对象,下面3个类里面有相应的方法
HttpServlet: getServletContext();
ServletConfig: getServletContext();
HttpSession: getServletContext();
好用API:
String getRealPath(String relativePath)//相对路径的参数,获得运行时本应用在tomcat中的绝对路径
InputStream getResourceAsStream(String relativePath)文件的相对(应用)路径,直接取得它的文件输入流
请求的方式有: get post put delete options
method= get、post
get请求:
method=“get”,浏览器直接敲url也属于get请求,执行的是后台的doGet()方法,
get请求参数通过浏览器url来传输,
doGet() 处理的是get请求;数据不安全;传输的参数有大小限制,正常理论上不超过1M
post请求: method=“post” post请求数据走请求体
doPost() 方法处理的是post请求,post请求传送内容大小没有限制,安全
service()方法: 即可以处理get请求,又可以处理post请求,可以处理所有请求,本质上就是将请求再一次分发一下
doGet() : 处理的是get请求
doPost(): 处理的是post请求
请求: 请求行 请求头 请求体
servlet的生命周期:
servlet是个过程,有开始,有结束; 有初始化,执行,销毁的过程
称之为他的生命周期
init() 初始化
service() 服务的方法 在浏览器访问该servlet的时候被执行
destroy() 销毁的方法 tomcat关闭的时候会自动执行
void init(ServletConfig var1) throws ServletException;
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
void destroy();
servlet的加载时机:
给servlet什么时候被加载,该servlet什么时候初始化的时机,执行init()方法的
loadOnStartup=
值是个整数 ,
<0 就是浏览器访问该servlet的时候被加载;
值是整数 >=0 ,tomcat服务器启动的时候就加载执行
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;正数的值越小,启动该servlet的优先级越高;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
jdbc:
java 连接 数据库
-
先创建数据库,表
-
导入mysql-connector-java的驱动包
在web-inf,目录下面创建文件夹lib,吧mysql的驱动包直接复制粘贴到这个目录底下;
还需要将lib目录引入到项目依赖里面
点击右上角图表 project strutor---->project setting 下的modules---->点击右边depencies
----->点击+ 选择1. jars or directoies------->选择该项目下的lib目录即可----》ok ok
-
写jdbc连接数据库的流程
创建实体类
编写jdbc的实现逻辑
数据库就是存储数据的仓库
1. 注册公司、工厂 1. 修路 1. 造车 1. 拉货 1. 查询 会有结果集 处理货物 ; 增删改 没有结果集 1. 货物处理掉,车砸了;路毁了
-
测试结果
今天作业:
1. 强化练习
1. 保证idea,mysql,tomcat没有问题
1. jdbc连接数据库增删改查流程和原理一定要非常熟练
1. 预习一下 servlet之间的跳转 forward sendRedirect
明天讲课内容:
前台 后台 数据库 打通,实现 登录功能(1. 传统方式 2. 异步登录 ajax+jquery)
前后台之间的跳转,前台 前台 /前台跳转后台/ 后台跳转
前端页面布局
1118 登录注册列表功能
中文乱码问题:
tomcat默认编码为iso-8859-1,不支持中文,中文传输时会出现中文乱码问题
中文编码有: utf-8, gb2312 ,gbk,gb18030等,出现问题时,按照情形分别处理即可:
解决方案:
请求request:
post请求:
1.保证页面中(html)编码是中文编码
2.在服务器端(servlet中)接收请求之前,写在请求的最上方;要设置一下请求对象的字符编码方式变成中文
request.setCharacterEncoding(“中文编码”)
get请求:
1.保证页面中编码是中文编码
2.修改tomcat配置文件(在tomcat安装根目录\conf\server.xml)设置请求的URI编码方式
大概在server.xml中69行
<Connector… URIEncoding=“utf-8”/>
3.改完server.xml一定要记得重新启动tomcat
注意: tomcat9中get请求不需设置,默认支持中文编码
响应response:
不区分POST与GET的,再获取输出流之前设置响应对象的字符编码,一般写在响应的最上方
response.setCharacterEncoding(“中文编码”);
连接数据库实现登录功能
连接数据库实现注册功能
实现注册成功或者失败时候实现跳转
跳转的两种方式: 请求转发和重定向
-
请求转发:
request对象的一个方法:
request.getRequestDispatcher(String path).forward(request,response);
浏览器地址栏不会发生改变, 跳转前后的两个逻辑能够实现数据共享,在服务器端实现跳转
-
重定向
response对象的一个方法:
response.sendRedirect(String path)
浏览器地址栏会发生改变,跳转前后的2个页面数据不能共享,是在客户端跳转的
就相当于在url里面重新敲了一个网址
作业:
- 吧登录和注册功能实现一下
- 理解请求转发和重定向的实现原理
- 连接数据库的增删改查一定要会写
- jsp语法预习一下
1119 JSP语法及增删改查
编程的三重境界:
-
照着写
-
稍微变通一下,活学活用
-
随心所欲,想怎么敲就怎么敲
大前提: 需要不断练习,不断强化
经验论:
经验是怎么形成的?
bug: 机遇和跳转
学习就像爬楼梯一样,解决一个问题就相当于往上面爬了一个台阶,解决的每一个问题,都是经验的积累
JSP: java server pages java动态网站技术
文件后缀名.jsp 可以写java代码
本质上就是: html+java代码片段;以html代码为主
jsp语法:
<%@ %> jsp指令 page taglib include
<%@ page import="" pageEncoding="utf-8" %>
定义页面的相关信息 import 导包 pageEncoding="utf-8" 指明该页面编码方式 utf-8 中文编码
<%@ include file="" %>
引入另外一个jsp文件
<% %> jsp代码片段 小脚本
js 运行在客户端 jsp 运行在服务器端
<%! %> 全局变量 属性或方法放在这里面
<%= %> 表达式 取值 这个标记等同于out.println()。例如<%=1%>等同于out.print(1);
<%-- --%> jsp注释
JSP中的注释:
(1)、HTML注释:
(2)、JSP注释标记: <%–JSP注释(客户端不可以看到源代码)–%>
(3)、JSP脚本中注释 <%//单行注释%>、<%/多行注释法/%>
jsp文件的执行原理:
jsp文件再执行的过程中,会自动转换成一个java文件,而这个java文件间接的继承了servlet;
jsp本质上就是一个servlet
什么时候使用servlet? 使用jsp文件?
servlet侧重于业务罗炯,jsp侧重于页面呈现
正常增删改查的思路:
列表:查询所有
ListServlet(后台连接数据库查询所有)======》list.jsp(数据呈现)
添加功能:
添加====> add.jsp (用户输入数据,添加)=>AddServlet(添加数据库)
====》 true 成功,进入到 list (后台,重新查询所有,不是list.jsp)
删除功能:
删除 delete?id=<%=s.getStuNo()%> =====> delete(后台实现删除)
=======》删除成功 true,进入到 list (后台,重新查询所有,不是list.jsp)
修改功能: 需要在原来老数据的基础之上吧老数据修改成新数据; 再提交修改
需要老数据回显,就需要先根据id查询单个,查询出老数据
修改 href=”queryone?id=<%=s.getStuNo()%> “ ====> queryOne(查询单个)
===============》 update.jsp 吧查询出的单个对象回显到表单里面
=> 修改成新数据 提交=>update(修改的后台;逻辑)====》
修改成功,true,进入到 list (后台,重新查询所有,不是list.jsp)
1120 登录注册增删改查的实现
容易碰到的问题:
- 数据库名在什么地方配: url : 3306/数据库名?参数
- 数据库连接密码一定要写成自己的数据库密码
- mysql驱动包一定要放在web-inf下的lib目录,没有的,需要手动创建
- mysql驱动包放到lib目录底下之后,还需要将lib目录添加到项目项目
- 查询所有数据需要先访问后台ListServlet,因为前台的数据是经过后台传过来的
- 报错提示: 4XX 客户端问题 5XX 后台服务器问题 404 浏览器路径不对 50X后台服务器代码报错了,看控制台里面的报错提示
删除功能:
?key=value: get请求就是通过吧参数通过浏览器以键值对的形式来传输
修改功能:
1. 修改的时候需要先查询单个,原数据回显
1. 修改的时候是根据主键来修改其他字段的; 主键 stuNo 不能被修改,所以设置成readonly 只读
1. 修改成功之后需要跳转到主页面;注意: 需要调到的是list后台,而不是list.jsp
实现首页的上左右布局: 管理系统首页的布局:
<a href="list" target="">学生列表</a>
target: _blank _self _parent
_blank : 新打开一个选项卡,新打开一个浏览器页面来呈现
_self : 在当前浏览器窗口打开新页面
_parent: 跳转到父窗口所有的浏览器页面
main: 表示跳转到name="main"的那个frame窗口
登录成功我就直接跳转到index.jsp 首页,主页面
实现在top.jsp显示当前登录的用户信息:
request作用域: 只能在请求转发的前后2个页面实现数据共享;第三个,第四个页面能取到值吗? 不能
servlet就是服务器的小程序,用来接收request,产执行业务逻辑操作,产生response
顾客需要知道在某超市的消费情况;
通过会员卡来实现 某个顾客在某超市的所有消费记录,会员卡有个唯一的编号来标识某个用户;
用户的单次购买是无状态的;这次购买和下次购买没有关系;、如果想知道总购买的记录,需要会员卡;
会员卡可以记录每次的消费情况;会员卡就是将每次无状态的购物串联起来,形成有状态的消费记录
servlet就相当每次购物
session: HttpSession: 会话: 表示某个用户的一系列行为,是用户级别的;一个用户一个session对象;
session存储的数据在整个会话期间有效,里面的数据在整个该用户的整个流程里面都能实现共享:
某个用户会员卡里面的钱: 只能是该用户使用,并且在该用户的所有消费期间都可以实现共享;
session是用户级别的;张三会员卡里面的钱是不是只能张三使用;李思只能使用李思的会员卡
一个用户一个session:
如何获取session对象:
HttpSerssion sesion=request.getSession();
session对象里面如何存取数据:
session.setAttribute(String name,Object value) 设置一个值
session.getAttribute(String name); 根据名称来取对应的值
session失效: session失效之后数据就没有了,不能实现数据共享了
相当于会员卡注销:
session.invalidate(); 立即失效
session.setMaxInactiveInterval(long 毫秒值); 让session经过多久之后自动失效
1121 统计在线总人数&jstl和el表达式
登录注册 增删改查 显示当前登录用户名 退出系统
知识点:
bs架构与cs架构: javaweb使用的bs架构,面向web服务器端编程
servlet: 运行在服务端的程序,用户接收客户端请求,执行相应的业务逻辑,最终产生相应给客户端浏览器
request: HttpServletRequest: 客户端浏览器向服务器端发送的内容就是request
request对象就封装了request的所有信息
request: 封装了 请求头,请求url,请求method,请求参数,请求的协议
常用的方法:
request.getParameter(String name);//根据参数名来取对应的参数值
参数名必须跟前台form表单name属性保持一致
request.getMethod(); //获取请求方式
request.getRequestDispatcher(String path).forward(request,response);
请求转发: 前后数据能够共享,路径url不会发生改变,在服务器端转发的
request.setAttribute(String name,Object value): 往request对象里面设置数据
request.getAttribute(String name);//根据名称来取对应的值
request.setCharacterEncoding(中文编码) //处理post请求里面的中文乱码
请求方式:
分为: method="" 值就是请求方式,action 跳转的地址
get: 浏览器直接访问 或者 通过超链接 a标签 来访问属于get请求方式;
走浏览器url传输数据: login?username=zhangsan&password=123456
不安全,传输的数据大小有限制
post: 数据传输走的是请求体,传输大小理论上没有限制;相对安全一点
put:
delete:
response: HttpServletResponse: 服务器给客户端浏览器发送的内容就是响应 response
响应的所有内容全部封装在response对象里面
PrintWriter response.getWriter(): 获取字符输出流
response.setCharacterEncoding(中文编码); //设置response里面的中文编码
response.setContentType(“text/html;charset=utf-8”)//设置响应的文本格式和字符编码
response.sendRedirect(String path)//重定向: 发生在客户端,前后数据不能共享
servlet里面的主执行方法:
doGet(request,response): 处理get请求
doPost(request,response): 处理post请求
service(request,reponse): 能够处理所有请求方式 ,相对通用一点
生命周期方法:
init(): 初始化方法
跟loadOnStartup: 加载时机的配置
值是个整数值
值>=0 tomcat服务器启动的时候加载;多个servlet配置多个loadonstartup时,正数的值越小越先加载
值<0 浏览器url访问该Servlet的时候加载
service(): 主执行方法: 当通过浏览器url方式来访问的时候,就会执行service方法
destroy(): 销毁的方法: tomcat服务器关闭的时候执行
web服务器: tomcat; 吧idea跟本机tomcat关联起来
jdbc: java连接数据库
分层: dao层 (数据访问层,专门跟数据库打交道的一层) service(服务层) servlet(业务逻辑层)
session: HttpSession类型:会话,用户级别;表示某个用户从开始到结束的一系列流程;
session里面的数据在整个会话期间有效
request.getSession(); 获取session对象
session.setAttribute(String name,Object value): 往session对象里面设置数据
session.getAttribute(String name);//根据名称来取对应的值
session.invalidate(); //让session立即失效
session.setMaxInactiveInterval(long 毫秒值); 让session经过多久之后自动失效
后续功能实现:
统计在线总人数
列表分页实现 jsp作用域 jsp九大内置对象
异步登录功能
异步验证添加的学生姓名是否存在
上传功能
图表,柱状图 echarts
实现统计在线总人数: count
request HttpServletRequest: 只能在请求转发的前后两个页面数据共享,第三个页面取不到
request.setAttribute(String name,Object value): 往request对象里面设置数据
request.getAttribute(String name);//根据名称来取对应的值
session HttpSession: 代表用户级别的,一个用户一个session对象
session.setAttribute(String name,Object value): 往session对象里面设置数据
session.getAttribute(String name);//根据名称来取对应的值
统计在线总人 数: 一个人登录就是一个session;相当于统计多少个session;
需要的是所有用户,所有session都能共享的全局变量;相当于比session作用域更大一级的作用域
application ServletContext: 表示该项目级别的,表示所有用户都可以访问的全局变量,在该项目中任何地方都可以访问
获取ServletContext对象:
ServletContext application = req.getServletContext(); 通过request对象来获取
ServletContext application = session.getServletContext(); 通过session对象来获取
application.setAttribute(String name,Object value): 往ServletContext对象里面设置数据
application.getAttribute(String name);//根据名称来从ServletContext里面取对应的值
jsp: java server pages 以显示为主,动态显示,动态指的是里面可以写java代码片段
html+java代码片段; html可以写的东西,jsp也有
基本语法:
<%! %> 相当于写在servlet里面的全局属性和一般方法
<% %> 里面是java代码片段,相当于写在servlet里面的service方法逻辑 小脚本
<%= %> 表达式
<%-- --%> jsp注释;jsp注释在源代码里面看不到
也可以写html注释
<%@ %> jsp的指令
jsp九大内置对象:
jsp里面可以直接使用的对象; 正常来说对象需要事先声明,但是这些可以直接使用,是因为jsp底层里面已经声明过了,
我们可以直接使用
9个内置对象说的是9个变量可以再java代码片段中直接使用。
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
out JspWriter(等同于PrintWriter)
pageContext PageContext页面上下文
exception Throwable
config ServletConfig
page jsp生成的java类型的当前对象,相当于this
jsp三大指令:
page (当前页面的相关指令) include (包含) taglib (用于标签库)
jsp四大作用域:
page范围:只在一个页面保留数据(javax.servlet.jsp.PageContext(抽象类))
request范围:只在一个请求中保存数据(javax.servlet.httpServletRequest)
Session范围:在一次会话中保存数据,仅供单个用户使用(javax.servlet.http.HttpSession)
Application范围:在整个服务器中保存数据,全部用户共享(javax.servlet.ServletContext)
el表达式:
语法:
${ el表达式 }
操作符:
关系操作符
==(eq)等于 !=(ne)不等于
<(lt)小于 >(gt)大于
<=(le)小于等于 >=(ge)大于等于
逻辑操作符
&&(and) 与
||(or) 或
!(not)非
隐式对象:
作用域对象:
pageScope 本页面 requestScope 请求
sessionScope 会话 applicationScope 程序
参数访问对象
Param 单一
paramValues 一组
jsp对象: pageContext
JSTL(JavaServerPage Standard Tag Library)jsp标准标记库
作用:使用标记来替换java代码,整个页面都是标签,方便好看
标签:
core:核心标签库,里面的代码都是一些java编程语言的基础,例如分支判断,设置值,取值,显示值
fmt: 格式化标签库:可以格式化日期等数据
通用标签
<c:set> <c:out> <c:remove>
条件标签
<c:if> <c:choose> <c:when> <c:otherwise>
迭代标签
<c:forEach>
使用步骤:
-
引入jstl标签库的依赖,复制粘贴到web-inf/lib目录里面
jstl-1.2.jar
-
引入jstl标签声明
核心标签库: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
格式化标签库: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-
使用标签
1123 实现分页功能
实现分页效果:
-
思路的设计
设计一个实体类PageBean ;每页就相当于一个PageBean对象;通过PageBean对象来实现对每页内容要素的封装
PageBean对象里面可以封装分页的所有信息要素:
属性: 当前页 页面大小(每页显示多少条记录) 总记录数 总页数 页面数据(List<> 集合)
当点击第一页的时候,查询的是第一页对应的PageBean;
当点击第二页的时候,返回的是第二页的PageBean对象;
属性
一个PageBean就是一页
class PageBean{
int currentPageNum;// 当前页
int pageSize=3;//页面大小
int totalRecords;//总记录数
int totalPageNum;//总页数
List list;//页面数据
}
那这几个属性都需要有值,如何获取?
currentPageNum: 从前台获取到,取参数值
pageSize=3; 默认值,是写好的
totalRecords: 总记录数,需要连接数据库查询 count(*)
totalPageNum: 可以根据总记录数和页面大小计算出来
List list; 当前页面数据 需要连接数据库查询,需要根据 当前页 和 页面大小来查询
-
代码的实现
– 查询第一页 每页3条 查询1-3
– limit ?,? 第一个 表示从第几条的下一条开始往后面查几条
select * from stu limit 0,3
– 查询第2页 每页3条 查询3-6
select * from stu limit 3,3
– 查询第3页 每页3条 查询6-9
select * from stu limit 6,3
页码数 第一个参数 关系 页面大小
1 0 (当前页-1)*页面大小 3
2 3 3
3 6 3
小项目: 分组实现,一个小组5个人左右;一个小组共同实现,合理分工
图书管理系统:
user: 用户表
int id 用户编号 主键
varchar username 用户名
varchar password 密码
varchar phone 手机号码
varchar email 邮箱
上面字段必须要有,其他的字段自己根据需求自行设计
book: 图书表
int bookid: 图书编号 主键
varchar bookname 图书名称
varchar publishname 出版社名称
varchar publicdate 出版时间
int nums 图书熟练
上面字段必须要有,其他的字段自己根据需求自行设计
要求必须实现的功能点:
-
登录 注册功能
-
图书信息的增删改查功能
-
图书信息的查询需要分页来实现
-
图书的模糊查询功能(根据图书名称模糊查询)
-
页面布局需要 上左右布局方式
-
需要在首页显示当前登录的用户名
-
需要在首页显示当前系统登录的总人数
-
需要有退出系统功能
-
如果可以的话,最好添加或者注册的时候要字段验证功能
可以有附加功能;根据实际需求可以自行添加,属于加分项
最后提交 按小组提交,每个小组交一份:
-
源代码
-
整体项目演示的效果录屏
-
小组名单(组长)及小组人员分工
1124 其他附加功能点
模糊查询
模糊分页实现:
前台表单输入框-----》会将mohu这个参数传到后台--------》参数有没有值: 如果没有值,就直接查询所有;有值,模糊查询
sql语句里面使用: like “%张%” %表示张前后匹配任意0个或多个字符
过滤器:
public class 过滤器类 implements Filter{
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);//放行
}
public void init(FilterConfig config) throws ServletException {
}
}
init(): 过滤器初始化方法
doFilter(): 表示执行过滤的主方法
chain.doFilter(req, resp); 表示放行的意思
destroy(): 过滤器销毁的方法
urlPatterns="/*" 表示过滤所有
中文编码过滤器:
将原本写在每个servlet里面的中文乱码处理逻辑直接在过滤器里面实现
核心代码:
package com.hs.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// urlPatterns = "/*" 表示过滤器过滤的内容 /*拦截所有servlet
@WebFilter(filterName = "CharacterEncodingFilter",urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {
public void destroy() {
System.out.println("该Filter已经被销毁了");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("该Filer正在过滤");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
chain.doFilter(req, resp);//放行
}
public void init(FilterConfig config) throws ServletException {
System.out.println("该Filter被初始化了");
}
}
安全登录过滤器:
目的: 防止用户未经登录直接访问其他的逻辑;
思路:
需要判断用户有没经过登录,如果session中有用户信息,说明用户经过登录,需要放行
但是登录和注册的时候session中还没有用户信息,此时必须要执行,所以这两个逻辑必须要放行
注意: 写过filter之后; html页面可能会出现乱码,但是jsp页面没有问题;此时解决办法就是将html页面用jsp页面代替
安全登录过滤器
核心代码:
package com.hs.filter;
import com.hs.pojo.User;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter(filterName = "LoginFilter",urlPatterns = "/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1. 需要从session中取得用户信息
//需要强转
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponse response= (HttpServletResponse) resp;
//获取session对象
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
//返回当前的请求路径
String path = request.getRequestURI();
System.out.println("path: "+path);
//2. 需要判断该用户是否为null;如果为null;说明用户没有经过登录,需要回到登录页面登录;
//不为null,说明用户经过登录,可以放行
if(user!=null){
//说明经过登录 放行
chain.doFilter(req, resp);
return;
}else{
//说明没有经过登录,回到登录页面,继续登录
//登录和注册功能此时session中user为null,必须要执行,必须放行
if(path.endsWith("login.jsp")||path.endsWith("login")||path.endsWith("register.jsp")||path.endsWith("register")){
chain.doFilter(req,resp);
}else {
response.sendRedirect("login.jsp");
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
监听器:
ajax异步验证用户名是否存在:
实现思路:
当用户在添加页面输入用户名后,当触发光标丢失事件的时候,执行验证用户名是否可以使用的逻辑:
1. 需要获取输入的用户名
1. 需要异步传输(异步:同时执行;同步:按顺序执行) 吧数据传到后台CheckNameServlet,连接数据库查询有没有该用户名
1. 后台查询之后,会响应一个结果,响应给前台页面,前台页面接收到这个结果之后,在页面进行相应的内容提示
ajax: 异步交互
直接使用原生的ajax比较复杂,在jquery里面就有调用ajax的函数
核心代码:
add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
<script type="text/javascript">
//onblur 光标丢失事件
function checkName() {
//1. 取用户输入的用户名
//#就表示id选择器
var sname=$("#sname").val();
console.log("sname: "+sname);
//2. 通过ajax异步访问后台
//$.post() 通过post请求方式传到后台
$.post(
'checkName',//后台验证用户名是否存在的url
{'sname':sname},//传到后台的参数
//回调函数 就是后台执行完毕之后前台再继续执行的逻辑 data 用来接收后台响应的内容
function (data) {
//alert(data);
if(data==1){
//1 用户名存在,不能使用
$("#ff").html("该用户名已被使用,请重新输入");
}
if(data==0){
//0 用户名不存在,可以使用
$("#ff").html("该用户名不存在,可以使用");
}
}
)
}
</script>
</head>
<body>
<h1>添加页面</h1>
<form action="add" method="post">
<!--添加的时候id是自增的,不需要从前台输入-->
<table>
<tr>
<td>学生姓名</td>
<td><input type="text" id="sname" name="stuName" onblur="checkName()">
<font id="ff" color="red" size="3"></font>
</td>
</tr>
。。。。。。。。。。
后台:
CheckNameSevlet:
package com.hs.servlet;
import com.hs.service.StudentService;
import com.hs.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "CheckNameServlet",urlPatterns = "/checkName")
public class CheckNameServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 取参
String sname = req.getParameter("sname");
//2. 连接数据库查询用户信息是否存在
StudentService studentService=new StudentServiceImpl();
boolean flag = studentService.queryStudentBySname(sname);
//产生响应 注意: 由于是异步传输,不能重定向,必须输出流响应
PrintWriter writer = resp.getWriter();
if(flag){
//用户名存在 1
writer.println(1);
}else{
//用户名不存在 0
writer.println(0);
}
writer.flush();
writer.close();
}
}
service:
@Override
public boolean queryStudentBySname(String sname) {
return studentDao.queryStudentBySname(sname);
}
dao:
package com.hs.dao.impl;
public class StudentDaoImpl implements StudentDao {
@Override
public boolean queryStudentBySname(String sname) {
String sql="select * from stu where stuname=?";
Connection conn = DBUtil.getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,sname);
rs = pstmt.executeQuery();
if (rs.next()) {
//该用户存在
return true;
}
}catch(Exception e){
e.printStackTrace();
}finally {
DBUtil.close(rs,pstmt,conn);
}
return false;
}
}
复习总结:
bs架构与cs架构:
javaweb: 属于明显的bs架构
核心的后台:
servlet: 服务器端,接收request.执行业务逻辑,产生response
request: 客户端浏览器 向 服务器发送的内容
response: 服务器给客户端浏览器发送的内容
前台《—》 后台servlet《------->连接数据库
前台访问后台:
请求方式: get post put delete
servlet里面:
doGet(): 处理前台get请求
doPost(): 处理的是前台post请求
service(): 可以处理所有请求的方式
get和post请求的区别:
需要传参数:
servlet里面取参数:String request.getParameter(String name)
servlet之间的跳转:
forward:请求转发
服务器端 url不会改变 前后数据可以共享
redirect: 重定向
客户端 url会发生改变 前后数据不可以共享
专属于某个用户可能某个数据需要很多地方使用:
比如登录的用户名:
HttpServletRequest request:
request.setAttribute(String name,Object object) 设置值
Object request.getAttribute(String name) 取值
HttpSession session : 会话;用户级别的,一个用户一个session对象
HttpSession session=request.getSession(); 获取session对象
session.setAttribute(String name,Object object) 设置值
Object session.getAttribute(String name) 取值
ServletContext application: 代表该项目,表示所有用户都能共享的全局变量
ServletContext request.getServletContext(); //通过request对象来获取
ServletContext session.getServletContext(); //通过session对象来获取
application.setAttribute(String name,Object object) 设置值
Object application.getAttribute(String name) 取值
Filter: 过滤器;
核心方法: doFilter() 执行过滤的方法
jsp:
本质上就是html+java代码片段; 以html为主
java代码片段必须放在特定的语法里面:
jsp语法:
<%@ %> jsp指令
<% %> jsp小脚本,java代码片段,相当于service里面的逻辑
<%! %> 定义的属性和普通方法;相当于定义servlet里面的属性和普通方法
<%-- --%> jsp注释
<%= %> 表达式
jsp:本质上就是一个servlet;他被访问的时候会转换成一个java文件,而这个java文件他的父类的父类就是HttpServlet
三大指令:
page taglib include
四大作用域:
pageContext : 当前对象,当前jsp页面
request :请求前后
session:会话,表示用户级别的
application: 最大的,表示该项目,所有用户都能共享
九大内置对象:
9个变量,jsp系统里面事先定义好了,不需要载定义,可以直接使用
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
out JspWriter(等同于PrintWriter)
pageContext PageContext页面上下文
exception Throwable
config ServletConfig
page jsp生成的java类型的当前对象,相当于this
el表达式:
取值的方式,比较方便 ${} 表示
取作用域:
pageScope requestScope sessionScope applicationScope
jstl标签库:
通过标签的形式来实现java的某些功能:比如判断 ,分支,循环,设置等等
好处: 都是标签,格式比较整齐
1.需要引入jstl.jar 驱动包
2. 需要引入标签库的声明
3. 在jsp页面直接使用标签库