hs笔记01

软件专业方向和专业技能

专业方向:

  1. 前端方向

html 页面内容展示

js: 动态交互

css: 页面的样式

jquery: js框架

ajax: 异步交互 异步访问后台的逻辑

bootstrap: 响应式布局

elementui: 饿了么 ui框架 vue的基础之上的

vue: MVVM模型 Model View View Model模型

react:

angularjs:

微信开发者工具: 编写小程序

uniapp:

​ 很多的前端ui框架

  1. 后台开发

    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的配置以及执行原理

    微服务的核心组件级原理

  2. 学校里面: 计算机网络 数据结构 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、 学习方法

  1. 项目参观,评价
  2. 作业,上午上课,下课作业,第二天提交作业,课前分享,每天2个同学课前分享
  3. 上课 复习javaoop
  4. servlet ,jsp 讲解核心知识点
  5. spring (IOC控制翻转和DI以来注入), Mybatis(持久层框架),springmvc
  6. ssm整合,增删改查,maven管理工程
  7. ssm项目 融合各种技术点: 验证码,登录 注册, 多个模块,前端页面布局,角色权限管理,echarts图表,获取系统信息,日志管理,前后端分离,vue前端框架
  8. 根据同学们的需求具体讲解某个技术

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关键字的时候使用调用的

​ 根据有无参数: 分为有参的构造方法和无参的构造方法

​ 构造方法:

​ 当系统里面没有任何构造方法的时候,系统将会默认提供一个无参的构造方法;

​ 当你有有参的构造方法的时候,系统将不再默认提供

​ 平时写代码的时候,建议有参的和无参的全部写上

​ 深层次理解构造方法的原理?

方法:

​ 方法的重载: 用在一个类里面: 方法名相同,参数列表不一致(参数类型及个数不一致);跟返回值类型无关

​ 包括构造方法的重载和普通方法的重载

​ 方法的重写: 子类重写父类相应的方法 方法名相同, 参数列表一致,方法里面的逻辑不一样

面向对象的特征:

  1. 封装: 属性私有,通过公共的gettersetter方法来实现对属性的访问

  2. 继承: 子类 extends父类, 可以继承父类的属性和普通方法,构造方法不能被继承

  3. 多态: 用父类来代表子类,调用的是子类重写之后的方法逻辑,通过父类来表现出子类不一样的状态

    ​ 多态本质上就是向上转型

    ​ 条件:

     1. 要有重写
     1. 要有继承
     1. 父类的引用指向子类对象
    

关键字:

this关键字:

 1. this.属性   当参数名和属性名有冲突时,在属性前加this加以区分
 2. this()    表示在一个构造方法里面调用另外一个无参构造方法,只能放在第一行
 3. this(参数值,参数值..)  表示在一个构造方法掉头另外有个有参的构造方法,只能写在第一行
 4. this.方法名()  表示调用另外一个普通方法

访问权限修饰符:顺序从小到大

private 私有的 只能在本类里面使用

[default] 默认的,不写就是默认的 可以在本包里面使用

protected 受保护的 只能在本包里面或者异包的子类里面使用

public 公共的 在任何地方都可以使用

super关键字: 在子类里面调用父类相应的逻辑

  1. super.属性 在子类里面调用父类相应的属性

  2. super() 表示在子类的构造方法里面调用父类的无参构造方法,只能放在第一行

  3. super(参数值,参数值…) 表示在子类的构造方法调用父类相应的有参的构造方法,只能写在第一行

  4. super.方法名() 表示在子类里面调用父类有参的构造方法

final关键字: 最终的

  1. final 变量 : final 修饰的变量就是一个常量,不能被重新赋值
  2. final 类: final修饰类的时候,不能被继承
  3. final 方法: final修饰方法的时候,不能被重写

static关键字: 静态的

  1. static 属性: 用static修饰的属性属于类变量

    类变量 :属性属于该类所有;该属性的值和它所有的实例之间是一对多关系

    实例变量: 每个对象都有一个对应的值

  2. static 方法: 静态方法 在静态方法里面不能调用非静态内容

    static修饰的属性或方法可以通过对象或者类名来调用,建议通过类名打点调用

  3. static{} 静态代码块 里面也不能调用非静态内容

​ 加载时机: 一般在第一次使用到该类的时候就自动加载执行,一般用于执行一些初始化工作

抽象类:

​ 类前面有abstract关键字,那这个类就是一个抽象类

​ 抽象类里面可以没有抽象方法,有抽象方法的类必定是抽象类

抽象方法: 方法前面有abstract关键字; 抽象方法没有方法体,包括{}也没有

抽象类的子类必须重写抽象类里面的抽象方法,抽象类不能实例化,必须使用他的具体的实现类

接口:

​ interface来声明接口

​ 接口里面只能定义常量 和 抽象方法; 接口里面的抽象方法可以没有abstract关键字

接口不能直接使用,必须使用接口的实现类;

一个类可以实现接口,implements关键字,实现接口;必须要重写接口里面的抽象方法

继承只支持单根继承,一个子类只能继承一个父类;但是可以同时实现多个接口

接口可以弥补继承只能继承单个的不足

public class Student extends Person implements Player,Singer{}

抽象类和接口的区别:

  1. 抽象类侧重于属性,接口侧重于行为能力,约定
  2. 抽象类里面可以有普通方法,接口只能有常量和抽象方法
  3. 抽象类和接口都不能直接实例化,他们的子类或者实现类都必须重写里面的抽象方法

异常:

​ 一旦出现异常,程序会中断执行,后续代码执行不了

​ 编译期异常 和 运行期异常

​ Exception: 是所有异常的父类

​ 处理异常的方式:

  1. try catch

  2. try{}catch(){}finally{}

    finally: 表示最终无论都会执行的逻辑

  3. throws 异常类型; 方法的签名后面

产生一个异常对象:

​ throw 异常对象;

throw关键字一般和try catch或者throws搭配使用

集合: 可以存储各种数据类型(Object类型),里面内置了很多现成的方法

​ Collection (接口):

​ List (子接口) 有序的

​ 实现类: ArrayList LinkedList

​ Set(子接口) 无序的

​ 实现类: HashSet TreeSet(带排序功能的Set集合)

​ Map (接口) 里面放的是键值对:

​ 实现类: HashMap HashTable Properties(放的是键值对,可以持久化存储)

线程:

​ 定义方式: 继承Thread 和 实现Runnable,都必须重写run方法

  1. class 线程类 extends Thread{

    public void run(){}

    }

    new 线程类().start()

  2. class 线程类 implements Runnable{

    public void run(){}

    }

    new Thread(new 线程类()).start()

    run(): 线程体的主执行方法

    start(): 启动某个线程的方法

    sleep()

    1116 JavaWeb入门

    1. BS架构和CS架构

      BS: Brower Server 浏览器服务器结构;以浏览器为载体来访问web服务器端

      CS: Client Server 客户端服务器结构 腾讯QQ等客户端软件

      javaweb: 其实是面向BS架构的,本质上做得是web服务器端编程

    2. 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

  1. 什么是servlet?

​ servlet其实就是服务器端的小程序,或者就是一个容器,就是用来接收请求,执行相应的业务逻辑,最终产生响应给客户端浏览器

  1. 写一个servlet程序

  2. 部署到web服务器里面、

    使用的是tomcat服务器:

    直接解压到英文路径底下,软件工具最好不要放在中文路径底下

    创建web工程 勾选web application---->输入工程名

    配置tomcat服务器,一般来说配置一次即可

    创建第一个servlet,配置urlpatterns,对用的浏览器的访问路径

    启动tomcat服务器

    当代码改动过后,需要重启tomcat服务器

    重点核心:

    先把web环境搭起来: 1. 创建web项目 2. 关联配置tomcat服务器 3. 创建servlet 4. 通过浏览器来访问servlet,测试后台运行效果

登录的实现逻辑:

  1. 登录页面 login.html action="" action的属性值执向后台的LoginServlet的urlPatterns的值
  2. 后台登录的servlet LoginServlet
  3. 取参数 通过request对象来取值 request.getParameter(String name) 参数名必须和前台表单的name属性值保持一致
  4. 判断登录的处理逻辑
  5. 产生响应给客户端浏览器 登录成功/登录失败

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 连接 数据库

  1. 先创建数据库,表

  2. 导入mysql-connector-java的驱动包

    在web-inf,目录下面创建文件夹lib,吧mysql的驱动包直接复制粘贴到这个目录底下;

    还需要将lib目录引入到项目依赖里面

    点击右上角图表 project strutor---->project setting 下的modules---->点击右边depencies

    ----->点击+ 选择1. jars or directoies------->选择该项目下的lib目录即可----》ok ok

  3. 写jdbc连接数据库的流程

    创建实体类

    编写jdbc的实现逻辑

    ​ 数据库就是存储数据的仓库

     	1.  注册公司、工厂
     	1.  修路
     	1.  造车
     	1.  拉货
     	1.  查询 会有结果集  处理货物 ; 增删改 没有结果集
     	1.  货物处理掉,车砸了;路毁了
    
  4. 测试结果

今天作业:

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行

​ 3.改完server.xml一定要记得重新启动tomcat

注意: tomcat9中get请求不需设置,默认支持中文编码

响应response:

​ 不区分POST与GET的,再获取输出流之前设置响应对象的字符编码,一般写在响应的最上方
​ response.setCharacterEncoding(“中文编码”);

连接数据库实现登录功能

连接数据库实现注册功能

实现注册成功或者失败时候实现跳转

跳转的两种方式: 请求转发和重定向

  1. 请求转发:

    request对象的一个方法:

request.getRequestDispatcher(String path).forward(request,response);

浏览器地址栏不会发生改变, 跳转前后的两个逻辑能够实现数据共享,在服务器端实现跳转

  1. 重定向

    response对象的一个方法:

    response.sendRedirect(String path)

    浏览器地址栏会发生改变,跳转前后的2个页面数据不能共享,是在客户端跳转的

    就相当于在url里面重新敲了一个网址

作业:

  1. 吧登录和注册功能实现一下
  2. 理解请求转发和重定向的实现原理
  3. 连接数据库的增删改查一定要会写
  4. jsp语法预习一下

1119 JSP语法及增删改查

编程的三重境界:

  1. 照着写

  2. 稍微变通一下,活学活用

  3. 随心所欲,想怎么敲就怎么敲

    大前提: 需要不断练习,不断强化

经验论:

​ 经验是怎么形成的?

​ 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 登录注册增删改查的实现

容易碰到的问题:

  1. 数据库名在什么地方配: url : 3306/数据库名?参数
  2. 数据库连接密码一定要写成自己的数据库密码
  3. mysql驱动包一定要放在web-inf下的lib目录,没有的,需要手动创建
  4. mysql驱动包放到lib目录底下之后,还需要将lib目录添加到项目项目
  5. 查询所有数据需要先访问后台ListServlet,因为前台的数据是经过后台传过来的
  6. 报错提示: 4XX 客户端问题 5XX 后台服务器问题 404 浏览器路径不对 50X后台服务器代码报错了,看控制台里面的报错提示

删除功能:

?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经过多久之后自动失效

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: 格式化标签库:可以格式化日期等数据

	通用标签
		     
	条件标签
			       
	迭代标签
		

使用步骤:

  1. 引入jstl标签库的依赖,复制粘贴到web-inf/lib目录里面

    jstl-1.2.jar

  2. 引入jstl标签声明

    核心标签库:
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    格式化标签库:
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    
  3. 使用标签

1123 实现分页功能

实现分页效果:

  1. 思路的设计

    设计一个实体类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; 当前页面数据 需要连接数据库查询,需要根据 当前页 和 页面大小来查询

  2. 代码的实现

– 查询第一页 每页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 图书熟练

​ 上面字段必须要有,其他的字段自己根据需求自行设计

要求必须实现的功能点:

  1. 登录 注册功能

  2. 图书信息的增删改查功能

  3. 图书信息的查询需要分页来实现

  4. 图书的模糊查询功能(根据图书名称模糊查询)

  5. 页面布局需要 上左右布局方式

  6. 需要在首页显示当前登录的用户名

  7. 需要在首页显示当前系统登录的总人数

  8. 需要有退出系统功能

  9. 如果可以的话,最好添加或者注册的时候要字段验证功能

    可以有附加功能;根据实际需求可以自行添加,属于加分项

最后提交 按小组提交,每个小组交一份:

  1. 源代码

  2. 整体项目演示的效果录屏

  3. 小组名单(组长)及小组人员分工

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" %>


    Title
    
    


    

添加页面

。。。。。。。。。。

后台:

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页面直接使用标签库

你可能感兴趣的:(Java,java,servlet,jsp,jstl)

学生姓名