软件专业方向和专业技能
专业方向:
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、 学习方法
变量:
数据类型:
基本数据类型: 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关键字: 最终的
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
实现类: 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()
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程序
部署到web服务器里面、
使用的是tomcat服务器:
直接解压到英文路径底下,软件工具最好不要放在中文路径底下
创建web工程 勾选web application---->输入工程名
配置tomcat服务器,一般来说配置一次即可
创建第一个servlet,配置urlpatterns,对用的浏览器的访问路径
启动tomcat服务器
当代码改动过后,需要重启tomcat服务器
重点核心:
先把web环境搭起来: 1. 创建web项目 2. 关联配置tomcat服务器 3. 创建servlet 4. 通过浏览器来访问servlet,测试后台运行效果
登录的实现逻辑:
普通的java类 extends HttpServlet(http协议相关的servlet)===》extends GenericServlet(跟协议无关的,通用的servlet)
====> implements Servlet(接口), ServletConfig (接口)
创建好的这个servlet继承了很多类和实现了很多接口,类里面的属性和方法以及接口里面的方法都能继承过来,可以直接使用
常用方法:
void init() 初始化方法
void init(ServletConfig config) servlet初始化方法
void service(ServletRequst request,ServletResponse response) servlet的服务方法
void destroy() servlet的销毁方法
ServletConfig getServletConfig() 获取ServletConfig对象
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 处理get请求
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 处理post请求
protected void service(HttpServletRequest req, HttpServletResponse resp) 处理所有的请求方式
当用户发送的请求到达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() 获取请求协议的版本号
把服务器对客户端浏览器的所有响应内容封装到该对象里面
常用方法:
void setContentType(String str) 专门设置content-type这个响应头
PrintWriter getWriter() 获取一个字符方式的响应 输出流
ServletOutputStream getOutputSttream() 获取一个字节方式的响应 输出流
常用方法:
getInitParameter(String param) 根据参数name值返回对用的初始化参数值 一个名称对应一个值
getInitParameterNames(String param) 根据参数名返回该name对应的所有的参数值 一个名称对应多个值
getServletContext() 返回一个ServletContext对象
getServletName() 返回当前servlet的名称,即@WebServlet的name属性值,如果没配,返回全限命名
注意: 一个Servlet对应一个ServletConfig对象
如何在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是个过程,有开始,有结束; 有初始化,执行,销毁的过程
称之为他的生命周期
init() 初始化
service() 服务的方法 在浏览器访问该servlet的时候被执行
destroy() 销毁的方法 tomcat关闭的时候会自动执行
void init(ServletConfig var1) throws ServletException;
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
void destroy();
给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)
前后台之间的跳转,前台 前台 /前台跳转后台/ 后台跳转
前端页面布局
中文乱码问题:
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行
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里面重新敲了一个网址
作业:
编程的三重境界:
照着写
稍微变通一下,活学活用
随心所欲,想怎么敲就怎么敲
大前提: 需要不断练习,不断强化
经验论:
经验是怎么形成的?
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)
容易碰到的问题:
删除功能:
?key=value: get请求就是通过吧参数通过浏览器以键值对的形式来传输
修改功能:
1. 修改的时候需要先查询单个,原数据回显
1. 修改的时候是根据主键来修改其他字段的; 主键 stuNo 不能被修改,所以设置成readonly 只读
1. 修改成功之后需要跳转到主页面;注意: 需要调到的是list后台,而不是list.jsp
实现首页的上左右布局: 管理系统首页的布局:
学生列表
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经过多久之后自动失效
登录注册 增删改查 显示当前登录用户名 退出系统
知识点:
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: 格式化标签库:可以格式化日期等数据
通用标签
条件标签
迭代标签
使用步骤:
引入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" %>
使用标签
实现分页效果:
思路的设计
设计一个实体类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 图书熟练
上面字段必须要有,其他的字段自己根据需求自行设计
要求必须实现的功能点:
登录 注册功能
图书信息的增删改查功能
图书信息的查询需要分页来实现
图书的模糊查询功能(根据图书名称模糊查询)
页面布局需要 上左右布局方式
需要在首页显示当前登录的用户名
需要在首页显示当前系统登录的总人数
需要有退出系统功能
如果可以的话,最好添加或者注册的时候要字段验证功能
可以有附加功能;根据实际需求可以自行添加,属于加分项
最后提交 按小组提交,每个小组交一份:
源代码
整体项目演示的效果录屏
小组名单(组长)及小组人员分工
模糊查询
模糊分页实现:
前台表单输入框-----》会将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" %>
Title
添加页面