JavaWeb

JavaWeb

Maven基本使用

项目的导入

常用命令

  • compile : 编译
  • clean : 清理
  • test : 测试
  • package : 打包
  • install : 安装

mvn compile

执行对 java 文件的编译

mvn clean

执行对 编译文件的删除

mvn package

对项目的打包,输出 war 文件

mvn test

执行 test 目录下的文件

mvn install

将当前的项目安装到本地仓库

Maven 生命周期

同一生命周期内,执行后面的命令会自动执行前面的命令

1.

pre-clean -> clean -> post-clean

2.

compile -> test -> package -> install

3.

pre-site -> site -> post-site

Maven 坐标

什么是坐标

坐标是资源的唯一标识

使用坐标来定义项目或引入项目中需要的依赖

坐标的主要组成

groupId:

定义当前项目隶属组织名称

artifactId:

定义当前Maven项目名称

version:

定义当前版本号

依赖管理

pom文件配置来引入需要的依赖jar包

快捷方式 alt + i (默认是 alt + insert)

可以在 maven 官方网站来查找所需要的 jar 包

<dependencies>
	<dependency>
		<groupId>mysql</groupIdj>
		<artifactId>mysql-connertor-java</artifactId>
		<version>5.1.37</version>
		<scope>test</scope>		作用范围
	<dependency>
<dependencies>

scope 的不同范围的作用

image-20220205233048413

MyBatis

是一款优秀的持久层框架,用于简化 JDBC 开发

什么是持久层?

负责将数据保存到数据库的那一层代码

JavaSE的三层架构:表现层、业务层、持久层

快速入门

mybatis_demo

IDEA 也可以配置数据库链接

  • 基本步骤

image-20220221123402530

Mapper代理开发

  1. 定义域SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同目录下
  2. 设置SQL映射文件的namespace属性为Mapper接口全限定名
  3. 在Mapper接口种定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
  4. 编码
    1. 通过 SqlSession 的 getMapper 方法获取 Mapper 接口的代理对象
    2. 调用对应方法完成 sql 的执行

基础安全防范

  • {} 和 ${} 的差别

举个例子

select * from tb_user where name = #{name};
//这样传入的就是字符串
//如当name = jack 时,该语句等价于
select * from tb_user where name = "jack";
    
//对于&{}传入的就是指令了,如
select * from ${tb_name};
//当打开表名称为tb_user时,该语句就等价于
select * from tb_user;
  • 不难看出 #{} 传入的参数会被 "" 包裹,看成字符串,这样就避免了sql注入等简单的攻击手段
  • 但是对于${} 传入的参数就会当成指令执行,使用的时候就要注意防止恶意攻击问题

模糊搜索

  • 搜索名字中包含 name 的所有学生并返回结果 List

HTML

超文本

标记语言:由标签构成的语言

大小写不敏感 :标签是不区分大小写的

不区分 " " & ' '

语法松散

W3C标准:网页的三部分

  1. 结构 :HTML
  2. 表现 :CSS
  3. 行为:JS

快速入门

<!--DEMO1-->
<html>
    <head>
        <title> test </title>
    </head>

    <body>
        一入键圈深似海,钱包空空
        <!--改变颜色-->
        <font color = "pink"> 再说一次,一入键圈深似海 </font>
        <!--"red" 等价与 'red' 不区分单/双引号-->
    </body>
</html>

基础标签

标签 概述
<meta charset = "UTF-8"> 定义字符标准
<h1> --- <h6> 标题,h1最大、h6最小
<font> 定义文本的字体、颜色、尺寸
<b> 定义粗体文本
<i> 定义斜体文本
<u> 定义文本下划线
<center>(后面都是 css 实现) 定义文本居中
<p> 定义段落
<br> 定义拆行(看的出来
<hr> 定义水平线
<!--DEMO2-->

图片、音频、视频标签

标签 描述
<img> 图片
<audio> 音频
<video> 视频

img

  • src : 规定显示图像的 URL
  • height : 高度 (可以用像素或者百分比)
  • width : 宽度(可以用像素或者百分比)

audio (MP3、WAV、OGG)

  • src
  • controls : 显示播放控件

video (MP4、WebM、OGG)

  • src
  • controls
  • height
  • width
<html>
    <head>
        <meta charset="UTF-8">
        <title> test3 </title>
    </head>
    <body>
        <img src = "假装.jpg" width="50%" height="300">

        <audio src="假装.mp3" controls = "controls"></audio>

        <!--controls不写也行-->
        <audio src="假装.mp3" controls></audio>

        <video src="假装.mp4" controls width="50%" height="300"></video>
    </body>
</html>

超链接标签

  • <a> 描述 :定义超链接,用于连接到另一个资源
    • href : 指定访问资源的 URL
    • target : 指定打开资源的方式
      • _self : 默认值,当前页面打开
      • _blank : 在空白页面打开

列表标签

  1. 有序列表长这样
  • 无序列表长这样

可以在标签里加属性修改样式,但不建议修改,一般用 css 美化

标签 描述
<ol> 有序
<ul> 无序
<li> 列表项

有序列表

<ol>
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ol>

无序列表

<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ul>

表格标签

按行构建

头单元格是 th 其他是 td

用 align 控制位置

标签 描述
<table> 定义表格
<tr> 定义行
<td> 定义单元格
<th> 定义表头单元格

table

  • border :规定表格边框的宽度
  • width :规定表格的宽度
  • cellspacing :规定单元格之间的空白

tr

  • align(排列) :定义表格行的内容对齐方式

td

  • rowspan :规定单元格可横跨的行数
  • colspan :规定单元格可横跨的行数
<html>
    <head>
        <meta charset="UTF-8">
        <title> test 5 </title>
    </head>
    <body>
        <center>
            <table width="50%" border="1" cellspacing="0">
                <tr height="50">
                    <th>People</th>
                    <th>Desc</th>
                </tr>
    
                <tr align="center">
                    <td>Tom</td>
                    <td>SeBi</td>
                </tr>
    
                <tr align="center">
                    <td>Sam</td>
                    <td>SeBiToo</td>
                </tr>
            </table>
        </center><hr>

        <center>
            <table width="50%" border="1" cellspacing="0">
                <tr height="50">
                    <!--列合并是横向合并,该行的格数减少-->
                    <th colspan="2">People</th>
                </tr>

                <tr align="center">
                    <!--行合并是纵向合并-->
                    <!--该行的格数不变,被影响的其他行格数减少-->
                    <td rowspan="2">Tom</td>
                    <td>SeBi</td>
                </tr>
    
                <tr align="center">
                    <td>SeBiToo</td>
                </tr>
            </table>
        </center>
    </body>
</html>

homework1

布局标签(CSS 结合使用)

div

<div> 标签影响的内容会占满一整行

span

<span> 标签影响的内容只会占内容所占的空间

表单标签(数据交互)

负责数据采集功能,是一个很重要的标签

标签 描述
<form> 定义表单
<input> 定义表单项,通过type属性控制输入形式
<label> 为表单项定义标注
<select> 定义下拉列表
<option> 定义下拉列表的列表项
<textarea> 定义文本域

form

  • action :规定提交表单时向何处发送数据,URL

表单数据想要提交必须有 name 属性,提交的是键值对

  • method :规定用于发送给表单数据的方式 (默认 get)
    • get :浏览器会将数据直接附在表单的 action URL 之后,大小有限制
    • post :浏览器会将数据放到http请求消息体当中,大小无限制

表单项标签

input

通过type属性控制输入形式

  • text

默认值,定义单行的输入

  • password

定义密码字段

  • radio

定义单选按钮

  • checkbox

定义复选框

  • file

定义文件上传按钮

  • hidden

定义隐藏的输入字段

  • submit

提交按钮

  • reset

重置按钮

  • button

可自定义的按钮

select

定义下拉列表 , <option> 定义项

textarea

文本域,就是一个大的文本框

实操

梗小鬼罢了

<html>
    <head>
        <meta charset="UTF-8">
        <title> test7 </title>
    </head>
    <body>
        <center>
            <form action="#" method="post">
                <input type="hidden" id="1" value="XIXIXINanamiXIXIXI">
                <!--点击文字也可以选中输入框,要做标注关联-->
                <label for="username">用户名:</label>
                <input type="text" name="UserName" id="username"><br>
    
                <label for="password">密码:</label>
                <input type="password" name="PassWord" id="password">
                <br>
                <hr>
                <!--关联的单选 name 要相同-->
                Are u Robot? 
                <input type="radio" name="Check" value="T" id="YES"><label for="YES"> Yes </label>
                <input type="radio" name="Check" value="F" id="NO"> <label for="NO"> No</label><br>
                <hr>
    
                <p>
                    How many airpods do u want > 扣1送雷克顿原味 > 选择你的英雄
                </p>
                <!--name 要相同-->
                <p>
                    <input type="checkbox" name="lan" value="1" id="kd1"><label for="kd1">Nana7Mi </label>
                    <input type="checkbox" name="lan" value="2" id="kd2"><label for="kd2">7MiNana</label>
                </p>
                
                <p>
                    <b><u><i>提交罪证!做卡卡国的英雄!   --->   </i></u></b>
                    <input type="file" name="evidence" value="狠狠锁住">
                </p>
                
                <p>
                    奖励一个耳机
                    <select name="Joke">
                        <option value="Fake_L"> airpods L </option>
                        <option value="Fake_R"> airpods R </option>
                        <option value="Fake_NULL!"> airpods NULL </option>
                    </select>
                </p>
    
                <p>
                    If u wanna say something -> 
                    <textarea name="Useless"></textarea>
                </p>
    
                <input type="submit" value="To Be Hero">
                <input type="reset" value="Or To Be Coward!!!">
                <input type="button" value="Then Who U Are">
            </form>
        </center>
    </body>
</html>

CSS

CSS引入l的三种方式

  1. 内联样式 :在标签内部使用style属性,属性值是css属性键值对

<div style="color:res">Hello CSS</div>

2.内部样式 : 定义<style>标签,在标签内部定义 css 样式

<style type="text/css">
	div{
		color:res;
	}
</style>
  1. 外部样式 :定义 link 标签,引入外部的 css 文件

<link res="stylesheet" href="demo.css">

  • demo.css
div{
		color:res;
}

CSS选择器

概念

选择器是选取需设置样式的元素 ( 标签 )

div{
    color:red;
}

分类

  1. 元素选择器
元素名称{color:red;}

body{
	backgroud-color:red;
}
  1. id选择器
#id属性值{color:red;}

#name{color:red;}
<div id="name"> Tom </div>
  1. 类选择器
.class属性值{color:red;}

.test{color:red;}
<div class="test">Test</div>

JavaScript

什么是 JS ?

  • 是一门跨平台、面向对象的脚本语言,来控制网页的行为,可与网页交互

JS 引入方式

  1. 内部脚本:将JS代码定义在 HTML 页面中

在 HTML 中,JS 代码必须位于 <script> </script> 之间

<script>
	alert("Hello JS");
</script>

Tips :

  • HTML 中任意地方都可以放,并且可放置任意数量
  • 一般置于 <body> 元素的底部,可以改善显示速度,因为脚本执行会拖慢显示速度
  1. 外部脚本 :将 JS 代码定义在外部 JS 文件中,然后引入到 HTML 页面中
  • 外部文件 :demo.js
alert("Hello js");
  • 引入
<script src="../js/demo.js"></script>

Tips:

  1. 外部脚本不能包含 <script> 标签
  2. <script>标签不能自闭和

JS 基础语法

书写语法

  1. 区分大小写
  2. 结尾分号可有可无
  3. 注释同 JAVA

输出语句

  1. 使用 window.alert() 写入警告框
  2. 使用 document.write() 写入 html 输出
  3. 使用 console.log() 写入浏览器控制台

变量

  • js 使用 var 关键字来声明变量
  • js 是一门弱类型语言,变量可以存放不同类型的值
  • ECMAScript 6 新增了 let 关键字来定义变量用于定义局部变量

只在let出现的代码块内有效

  • ECMAScript 6 新增了 const 常量

常量不可修改

五种原始类型
  1. number :数字
  2. string : 字符串、字符(没有char)
  3. boolean
  4. null
  5. undefined :未初始化时,默认赋值为 undefined

使用 typeof 可以获取变量的数据类型 alert(typeof(age))

typeof(null) = object 这是 js 最原始的一个错误

运算符

和 JAVA 基本一样

== 和 === 的区别
  1. 对 ==

先判断类型是否一样,不一样则进行类型转换

再进行比较

  1. 对 ===

不进行类型转换 直接比较

类型转换

转 number
  1. string

如果字符串的内容不是数字,转换的值会是 NaN

对 var str = +"123"

是赋值 正 的 "123",会判断这是一个 number,而不是 加 "123"

一般不这样转换,一般使用 parseInt

  1. boolean

true == 1,false == 0

转 boolean
  1. number

0 转成 false 其他数字会转为 true

  1. string

空字符串转为 false,其他转为 true

  1. null && undefined

都转为 false

流程控制

和 JAVA 一样

if , while ,do...while 等

函数

js 通过 function 定义

//形参不需要类型,因为 js 是弱类型语言
//同样的,返回值类型也不需要定义类型

//定义方法 1
function add(a,b){
    return a + b;
}

//定义方法 2
var add = function(a,b){
    return a + b;
}

//js 中,函数调用可以传递任意个参数
let result = add(1,2,3);

JavaScript 对象

Array

var arr = new Array(1,2,3);
//两种定义方式
var arr2 = [1,2,3];

//可以变长
var arr3 = [1,2,3];
arr3[10] = 11;
//arr3[9] = undefined

//可以便类型
arr3[11] = "HELLO";
  • length :获得的是长度,不是元素个数
var arr = [1,2,3];
arr [5] = "HELLo";
alert(arr.length);
//输出的是6
  • push :添加元素
  • splice :删除元素

String

var str = new String("Hello");
//两种定义方式
var str2 = "HELLO";
  • length
  • indexOf()
  • charAt()

自定义对象

/*
var 对象名字 = {
	属性名字 : 值
	函数名字 : function(){}
}
*/

var temp = {
    name : "Tom",
    age : "11",
    eat : function(){
        alert("Eating");
    }
};

alert(temp.name);
temp.eat();

BOM

  • windown 打开的一个窗口就是一个 window 对象
  • Navigator 浏览器就是一个 Navigator 对象
  • Screen 屏幕这个对象
  • History 历史记录对象
  • Location 地址栏对象

window

直接使用window,window. 可以省略

比如 window.alert();

  1. alert()

弹出一个带有消息和确认按钮的对话框

  1. confirm()

弹出一个带有消息以及确认、取消按钮的对话框

  1. setInterval

按照指定的周期(以毫秒计)来调用函数以及表达式

  1. setTimeout()

在指定的毫秒数后调用函数或计算表达式

history

window.history.方法() 或者 history.方法()

  1. back()

加载history列表中的前一个 URL

  1. forward()

加载 history 列表中的下一个 URL

location

window.location.方法() 或者 location.方法()

  • href

设置或者返回完整的 url

DOM

js 通过 DOM,就可以对 HTML 进行操作了

  • 改变 HTML 元素的内容
  • 改变 HTML 元素的样式
  • 对 HTML DOM 事件做出反应
  • 添加和删除 HTML 元素

Element

使用Document对象的方法来获取 Element 对象

  1. getElementById : 根据 id 属性值获取,返回一个 Element 对象
  2. getElementsByTagName : 根据标签名称获取,返回 Element 对象数组
  3. getElementsByName : 根据 name 属性值获取,返回 Element 对象数组
  4. getElementByClassName : 根据 class 属性值获取,返回 Element 对象数组

事件监听

  • 事件就是 发生在 HTML 元素上的 “事情”
    • 按钮被点击
    • 鼠标移动到元素上
    • 按下键盘按键
  • js可以在事件被侦测到时执行代码

事件绑定

  1. 通过 HTML 标签中的事件属性进行绑定
<input type="button" onclick="on()" value="a BUTTON">
<script>
    function on(){
        alert("Click");
    }
</script>
  1. 通过 DOM 元素进行绑定( 推荐使用 )
<input type="button" id="temp" value="a a BUTTON">
<script>
    document.getElementById("temp").onclick=function(){
        alert("Click2");
    };
</script>

常见事件

  • onblur

元素失去焦点

一般是点击文本框是获得焦点,取消选择为失去焦点

  • onfocus

获得焦点

  • onchange

文本内容被改变

  • onclick

被点击

  • onkeydown

某个按键被按下

  • onmouseover && onmouseout

鼠标经过、移开

  • onsubmit

确认按钮被点击

功能实践 ---> 表单验证

crl + f 快捷修改

正则表达式

语法

  • ^ 表示开始
  • $ 表示结束
  • [] 代表某个范围内的单个字符,如 [0-9] 单个数字字符
  • . 代表任意单个首字符,除了换行和行结束符
  • \w 代表单词字符:字母、数字、下划线,相当于 [A-za-z0-9_]
  • \d 代表数字字符:相当于 [0-9]

量词

  • + 至少一个
  • * 零个或多个
  • ? 零个或一个
  • [x] x个
  • {m,} 至少m个
  • {m,n} 至少m个,至多n个

定义

  1. 直接量

var reg = /^\w{6,12}$/;

  1. 创建RegExp对象

var reg = new RegExp("^\w{6,12}&");

方法

  • test(str) :判断指定字符串是否符合规则,返回 T or F

Web核心

JavaWeb技术栈

  • B/S 架构 : Browser/Server,浏览器/服务器架构

好处:易于维护升级,不用更新客户端

  • 静态资源:HTML、JS等,负责页面展现
  • 动态资源:Servlet、JSP等,负责逻辑处理
  • 数据库:负责储存数据
  • HTTP协议:定义通信规则
  • Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据

HTTP

请求数据格式

  • 分为三部分
  1. 请求行 :如 GET /a/b HTTP/1.1

GET 是请求方式,/a/b 是请求资源路径,HTTP/1.1表示协议版本

  1. 请求头 :第二行开始,格式为KEY:VALUE

  2. 请求体 :POST请求的最后一部分,存放请求参数

常用的请求头

image-20220212095633031

GET和POST的区别

  1. GET的请求参数放在请求行中,POST的请求参数放在请求体中
  2. GET的请求参数有大小限制,POST没有

响应数据格式

  • 三部分
  1. 响应行 :如 HTTP/1.1 200 OK

HTTP/1.1 表示协议版本,200表示响应状态码,OK表示状态码描述

  1. 响应头 :第二行开始,格式为KEY:VALUE
  2. 响应体 :最后一部分,存放响应数据

所有的响应代码

TONMCAT

开源免费的轻量级Web服务器

也被成为Web容器、Servlet容器,Servlet依赖Tomcat运行

Web服务器

  • Web服务器是一个应用程序

    1. 对HTTP协议的操作进行封装,让web开发更加便捷。
    2. 主要功能是 “提供网上信息浏览服务”。

基本使用

  • 启动 bin\startup.bat

  • 关闭

    1. 强制关闭 :直接 x 掉运行窗口
    2. 正常关闭 :bin\shutdown.bat 或者 ctrl + c
  • 配置

    • 修改启动端口号 :conf/server.xml
  • 启动时可能出现的问题

  1. 端口号冲突 :找到并关闭对应程序
  2. 启动窗口一闪而过 :检查 JAVA_HOME

部署项目

  • 将项目放置到 webapps 目录下,即可完成部署
  • 一般 JavaWeb 项目会被打爆成 war 包,然后将 war 包放到 webapps目录下

tomcat 会自动解压 war 文件

Servlet

一门动态web资源开发技术

快速入门

  1. 创建 web 项目,导入 Servlet 依赖坐标
  2. 创建 :定义一个类,实现 Servlet 接口,并重写接口中的所有方法
  3. 配置 :在类上使用 @WebServlet 注解配置该类的访问路径
  4. 访问 :启动 Tomcat,浏览器输入 URL 访问该 Servlet

Servlet 执行流程‘

image-20220214093936182

  • Servlet 由 web 服务器创建并调用

Servlet 生命周期

image-20220214094216918

Servlet 方法

  • void init(ServletConfig config)

初始化方法,在Servlet被创建的时候调用,只执行一次

  • void service(ServletRequest req,ServletResponse res)

提供服务方法,每次Servlet 被访问都会调用

  • void destroy()

销毁方法,销毁时调用

  • ServletConfig getServletConfig()

获取ServletConfig对象

  • String getServletInfo()

获取 Servlet 信息

Servlet体系结构

我们将来开发 B/S 架构的 web 项目,都是针对 http 协议的

所以我们自定义 Servlet 会继承 HttpServlet

  • HttpServlet 使用方法
  1. 继承 HttpServlet
  2. 重写 dopost 和 doget 方法

Servlet urlPattern 配置

  • 一个 Servlet 可以配置多个访问路径

@WebServlet(urlPatterns = {“/demo1,"/demo2"})

  • 配置规则

image-20220214110922010

//* 的区别

/会替代tomcat中的DefaultServlet,当匹配不到 url 的时候会访问这个 Servlet

/* 表示所有 url 都可以访问到这个 Servlet

  • 优先级 :精确路径 -> 目录路径 -> 扩展名路径 -> /* -> /

xml 配置方式编写 Servlet

  • Servlet 3.0后开始支持注解配置,3.0前只支持 XML 配置文件的配置方式
  • 步骤
  1. 编写 Servlet 类
  2. 在 web.xml 中配置该 Servlet

Request & Response

Requesr :获取请求数据

Response :设置响应数据

Request

  • Tomcat需要解溪请求数据,封装为request对象,并且创建request对象传递到service方法中
设置、获取数据
  • setAttribute("key":value);
  • getAttribute("key");
解决表单乱码问题

原因 UTF-8 编码格式发送 但是 Tomcat 默认 URL 解码

Tomcat8 之后设置默认解码格式为 UTF-8

  1. POST

    • 设置输入流的编码

    request.setCharacterEncoding("UTF-8");

  2. GET / POST

    • 解码成 bytes 数组再重新UTF-8编码 ( 这样同样可以解决 POST 方法的乱码问题 )
    String name = request.getParameter("name");
    name = new String(name.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
    
获取请求数据

image-20220214144757514

通用方式获取请求参数
  • GET 方式

String getQueryString()

  • POST 方式

BufferedReader getReader()

提供的获取内容的方法

  • Map<String,String[]> getParameterMap()

获取所有参数Map集合

  • String[] getParameterValues(String name)

根据KEY获取VALUE数组

  • String getParameter(String name)

获取单个VALUE

Request请求转发
  • 请求转发 (forward) : 一种在服务器内部的资源跳转方式
    • 浏览器地址栏路径不发生变化
    • 只能转发到当前服务器的内部资源
    • 一次请求可以在转发的资源间使用request共享数据
  • 实现方式( 资源A到资源B )
req.getRequestDispatcher("资源B路径").forward(req,res);
//WebAppProject\src\main\java\com\web\ServletDemo7.java
  • 请求转发资源见共享数据 :使用Request对象

    • void setAttribute(String name,Object o)

    存放数据到 request 域中

    • Object getAttribute(String name)

    根据 key 获取 value

    注意存放到request域里面的数据不能用getParameter获取

    只能用该方法获取

    两者区别:
    ①getParameter()获取的是客户端设置的数据。
    getAttribute()获取的是服务器设置的数据。
    ②getParameter()永远返回字符串
    getAttribute()返回值是任意类型

    //另一个class中添加了 "msg":"hah"
    
    String test = request.getParameter("msg");
    System.out.println(test);//获取不到
    Object msg = request.getAttribute("msg");
    System.out.println(msg);
    
    • void removeAttribute(String name)

    根据 key 删除该键值对

Response

image-20220215194114182

Response完成重定向

重定向 : 一种资源跳转方式

对应状态码 :302

  • 实现方式
resp.setStatus(302);
resp.setHeader("Location","资源B的路径");

//简化方式
response.sendRedirect("/DEMO/ResponseDemo2");

//动态获取虚拟目录
String contextPath = response.getContextPath();
response.sendRedirect(context + "/ResponseDemo2");
  • 重定向特点

    1. 浏览器地址栏路径发生变化
    2. 可以重定向到任意位置的资源
    3. 两次请求不能在多个资源使用request共享数据
  • 路径问题

    • 浏览器使用 :需要加虚拟目录
    • 服务端使用 :不需要加虚拟目录
Response响应字符数据
  • 使用

    1. 通过Response对象获取字符输出流

    PrintWriter writer = resp.getWriter();

    1. 写数据

    writer.write("test");

    1. 设置响应类型( 以html为例 )
    response.setHeader("content-type","text/html")
    //或者
    response.setContentType("text/html;charset=utf-8");
    //这种方式可以解决中文乱码问题
    
Response响应字节数据
  • 使用

    1. 获取字节输出流

    ServletOutputStream outputStream = resp.getOutputStream();

    outputStream.write(字节数据)

Fliter

快速入门

  1. 定义类,实现 Fliter 接口,并重写其所有方法

  2. 配置 Fliter 拦截路径

    • @WebFliter("/*")

    这个表示应用范围是所有页面

  3. 做出操作后要记得放行( 放行前逻辑(处理 request),放行,放行后逻辑(处理response) )

chain.doFliter(request,response);

执行细节

  • 放行后访问资源,访问结束后还会回到 Fliter
  • 回到 Fliter 之后会执行放行之后的逻辑

过滤器链

  • 一个web网页可以配置多个过滤器,这多个过滤器称为过滤器链

image-20220226165207066

  • 过滤器执行顺序按照过滤器的自然排序,谁排在前面就执行谁

比如 Afliter > Bfliter

JSP

  • 一种动态的网页技术,既可以定义静态的 HTML、CSS、JS 内容,也可以定义 JAVA 代码
  • JSP 本质上就是一个 Servlet

简单来说,JSP 就等于 HTML + JAVA

快速入门

  1. 导入jsp坐标

image-20220226175611892

  1. 创建jsp文件
  2. 编写 HTML 标签和 JAVA 代码

JSP脚本

  1. <%......%> 内容会直接放到 _jspService() 方法中
  2. <%=....%> 内容会放到out.print()中,作为参数
  3. <%!.....%> 内容会放到 _jspService() 方法之外,被类直接包含

EL表达式

  • 用于简化 JSP 的代码
  • 会从四大域中逐个查找

$

  • ${brand} : 获取域中储存的 key 为 brand 的数据

JavaWeb中的四大域对象

从小到大

  1. page : 当前页面有效
  2. request : 当前请求有效
  3. session : 当前会话有效
  4. application : 当前应用有效

JSTL 标签

  • JSP 标准标签库,使用 JSTL 标签来取代 JSP 页面上的 JAVA 代码

快速入门

  1. 导入坐标

  2. 在文件上方写上JSP指令

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

if

<c:if test="判断语句">
	<!--操作逻辑-->
</c:if>

<!--例子-->
<c:if test="${statu==1}">
	<h1>
        正常
    </h1>
</c:if>

forEach

  • 除了 iteams 和 var 还有一个 varStatus 属性
  • 比如 varStatus="status";
    • status.index从0开始计数
    • status.count从1开始计数
  • begin 从哪里开始
  • end 到哪里结束
  • step 步长
  • image-20220226192910088
<c:forEach items="容器名称" var="临时变量名称">
	<!--操作逻辑-->
</c:forEach>

<!--例子-->
<c:forEach item="${students}" var="student">
	<h1>
       	${student.name}
    </h1>
    <h2>
        ${student.number}
    </h2>
</c:forEach>

MVC 三层架构

image-20220226194715313

  • MVC 好处
    • 职责单一,互不影响
    • 有利于分工协作
    • 有利于组件重用

三层架构

  • 表现层

  • 业务逻辑层

  • 数据访问层

image-20220226195520035

posted @ 2022-02-06 03:39  Xuuxxi  阅读(36)  评论(0编辑  收藏  举报