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 的不同范围的作用
MyBatis
是一款优秀的持久层框架,用于简化 JDBC 开发
什么是持久层?
负责将数据保存到数据库的那一层代码
JavaSE的三层架构:表现层、业务层、持久层
快速入门
mybatis_demo
IDEA 也可以配置数据库链接
- 基本步骤
Mapper代理开发
- 定义域SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同目录下
- 设置SQL映射文件的namespace属性为Mapper接口全限定名
- 在Mapper接口种定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
- 编码
- 通过 SqlSession 的 getMapper 方法获取 Mapper 接口的代理对象
- 调用对应方法完成 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标准:网页的三部分
- 结构 :HTML
- 表现 :CSS
- 行为: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 : 在空白页面打开
列表标签
- 有序列表长这样
- 无序列表长这样
可以在标签里加属性修改样式,但不建议修改,一般用 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的三种方式
- 内联样式 :在标签内部使用style属性,属性值是css属性键值对
<div style="color:res">Hello CSS</div>
2.内部样式 : 定义<style>
标签,在标签内部定义 css 样式
<style type="text/css">
div{
color:res;
}
</style>
- 外部样式 :定义 link 标签,引入外部的 css 文件
<link res="stylesheet" href="demo.css">
- demo.css
div{
color:res;
}
CSS选择器
概念
选择器是选取需设置样式的元素 ( 标签 )
div{
color:red;
}
分类
- 元素选择器
元素名称{color:red;}
body{
backgroud-color:red;
}
- id选择器
#id属性值{color:red;}
#name{color:red;}
<div id="name"> Tom </div>
- 类选择器
.class属性值{color:red;}
.test{color:red;}
<div class="test">Test</div>
JavaScript
什么是 JS ?
- 是一门跨平台、面向对象的脚本语言,来控制网页的行为,可与网页交互
JS 引入方式
- 内部脚本:将JS代码定义在 HTML 页面中
在 HTML 中,JS 代码必须位于
<script> </script>
之间
<script>
alert("Hello JS");
</script>
Tips :
- HTML 中任意地方都可以放,并且可放置任意数量
- 一般置于
<body>
元素的底部,可以改善显示速度,因为脚本执行会拖慢显示速度
- 外部脚本 :将 JS 代码定义在外部 JS 文件中,然后引入到 HTML 页面中
- 外部文件 :demo.js
alert("Hello js");
- 引入
<script src="../js/demo.js"></script>
Tips:
- 外部脚本不能包含
<script>
标签 <script>
标签不能自闭和
JS 基础语法
书写语法
- 区分大小写
- 结尾分号可有可无
- 注释同 JAVA
输出语句
- 使用 window.alert() 写入警告框
- 使用 document.write() 写入 html 输出
- 使用 console.log() 写入浏览器控制台
变量
- js 使用 var 关键字来声明变量
- js 是一门弱类型语言,变量可以存放不同类型的值
- ECMAScript 6 新增了 let 关键字来定义变量用于定义局部变量
只在let出现的代码块内有效
- ECMAScript 6 新增了 const 常量
常量不可修改
五种原始类型
- number :数字
- string : 字符串、字符(没有char)
- boolean
- null
- undefined :未初始化时,默认赋值为 undefined
使用 typeof 可以获取变量的数据类型 alert(typeof(age))
typeof(null) = object 这是 js 最原始的一个错误
运算符
和 JAVA 基本一样
== 和 === 的区别
- 对 ==
先判断类型是否一样,不一样则进行类型转换
再进行比较
- 对 ===
不进行类型转换 直接比较
类型转换
转 number
- string
如果字符串的内容不是数字,转换的值会是 NaN
对 var str = +"123"
是赋值 正 的 "123",会判断这是一个 number,而不是 加 "123"
一般不这样转换,一般使用 parseInt
- boolean
true == 1,false == 0
转 boolean
- number
0 转成 false 其他数字会转为 true
- string
空字符串转为 false,其他转为 true
- 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();
- alert()
弹出一个带有消息和确认按钮的对话框
- confirm()
弹出一个带有消息以及确认、取消按钮的对话框
- setInterval
按照指定的周期(以毫秒计)来调用函数以及表达式
- setTimeout()
在指定的毫秒数后调用函数或计算表达式
history
window.history.方法() 或者 history.方法()
- back()
加载history列表中的前一个 URL
- forward()
加载 history 列表中的下一个 URL
location
window.location.方法() 或者 location.方法()
- href
设置或者返回完整的 url
DOM
js 通过 DOM,就可以对 HTML 进行操作了
- 改变 HTML 元素的内容
- 改变 HTML 元素的样式
- 对 HTML DOM 事件做出反应
- 添加和删除 HTML 元素
Element
使用Document对象的方法来获取 Element 对象
- getElementById : 根据 id 属性值获取,返回一个 Element 对象
- getElementsByTagName : 根据标签名称获取,返回 Element 对象数组
- getElementsByName : 根据 name 属性值获取,返回 Element 对象数组
- getElementByClassName : 根据 class 属性值获取,返回 Element 对象数组
事件监听
- 事件就是 发生在 HTML 元素上的 “事情”
- 按钮被点击
- 鼠标移动到元素上
- 按下键盘按键
- js可以在事件被侦测到时执行代码
事件绑定
- 通过 HTML 标签中的事件属性进行绑定
<input type="button" onclick="on()" value="a BUTTON">
<script>
function on(){
alert("Click");
}
</script>
- 通过 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个
定义
- 直接量
var reg = /^\w{6,12}$/;
- 创建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
请求数据格式
- 分为三部分
- 请求行 :如 GET /a/b HTTP/1.1
GET 是请求方式,/a/b 是请求资源路径,HTTP/1.1表示协议版本
-
请求头 :第二行开始,格式为KEY:VALUE
-
请求体 :POST请求的最后一部分,存放请求参数
常用的请求头
GET和POST的区别
- GET的请求参数放在请求行中,POST的请求参数放在请求体中
- GET的请求参数有大小限制,POST没有
响应数据格式
- 三部分
- 响应行 :如 HTTP/1.1 200 OK
HTTP/1.1 表示协议版本,200表示响应状态码,OK表示状态码描述
- 响应头 :第二行开始,格式为KEY:VALUE
- 响应体 :最后一部分,存放响应数据
TONMCAT
开源免费的轻量级Web服务器
也被成为Web容器、Servlet容器,Servlet依赖Tomcat运行
Web服务器
-
Web服务器是一个应用程序
- 对HTTP协议的操作进行封装,让web开发更加便捷。
- 主要功能是 “提供网上信息浏览服务”。
基本使用
-
启动 bin\startup.bat
-
关闭
- 强制关闭 :直接 x 掉运行窗口
- 正常关闭 :bin\shutdown.bat 或者 ctrl + c
-
配置
- 修改启动端口号 :conf/server.xml
-
启动时可能出现的问题
- 端口号冲突 :找到并关闭对应程序
- 启动窗口一闪而过 :检查 JAVA_HOME
部署项目
- 将项目放置到 webapps 目录下,即可完成部署
- 一般 JavaWeb 项目会被打爆成 war 包,然后将 war 包放到 webapps目录下
tomcat 会自动解压 war 文件
Servlet
一门动态web资源开发技术
快速入门
- 创建 web 项目,导入 Servlet 依赖坐标
- 创建 :定义一个类,实现 Servlet 接口,并重写接口中的所有方法
- 配置 :在类上使用 @WebServlet 注解配置该类的访问路径
- 访问 :启动 Tomcat,浏览器输入 URL 访问该 Servlet
Servlet 执行流程‘
- Servlet 由 web 服务器创建并调用
Servlet 生命周期
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 使用方法
- 继承 HttpServlet
- 重写 dopost 和 doget 方法
Servlet urlPattern 配置
- 一个 Servlet 可以配置多个访问路径
@WebServlet(urlPatterns = {“/demo1,"/demo2"})
- 配置规则
/
和/*
的区别
/
会替代tomcat中的DefaultServlet,当匹配不到 url 的时候会访问这个 Servlet
/*
表示所有 url 都可以访问到这个 Servlet
- 优先级 :精确路径 -> 目录路径 -> 扩展名路径 ->
/*
->/
xml 配置方式编写 Servlet
- Servlet 3.0后开始支持注解配置,3.0前只支持 XML 配置文件的配置方式
- 步骤
- 编写 Servlet 类
- 在 web.xml 中配置该 Servlet
Request & Response
Requesr :获取请求数据
Response :设置响应数据
Request
- Tomcat需要解溪请求数据,封装为request对象,并且创建request对象传递到service方法中
设置、获取数据
- setAttribute("key":value);
- getAttribute("key");
解决表单乱码问题
原因 UTF-8 编码格式发送 但是 Tomcat 默认 URL 解码
Tomcat8 之后设置默认解码格式为 UTF-8
-
POST
- 设置输入流的编码
request.setCharacterEncoding("UTF-8");
-
GET / POST
- 解码成 bytes 数组再重新UTF-8编码 ( 这样同样可以解决 POST 方法的乱码问题 )
String name = request.getParameter("name"); name = new String(name.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
获取请求数据
通用方式获取请求参数
- 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
Response完成重定向
重定向 : 一种资源跳转方式
对应状态码 :302
- 实现方式
resp.setStatus(302);
resp.setHeader("Location","资源B的路径");
//简化方式
response.sendRedirect("/DEMO/ResponseDemo2");
//动态获取虚拟目录
String contextPath = response.getContextPath();
response.sendRedirect(context + "/ResponseDemo2");
-
重定向特点
- 浏览器地址栏路径发生变化
- 可以重定向到任意位置的资源
- 两次请求不能在多个资源使用request共享数据
-
路径问题
- 浏览器使用 :需要加虚拟目录
- 服务端使用 :不需要加虚拟目录
Response响应字符数据
-
使用
- 通过Response对象获取字符输出流
PrintWriter writer = resp.getWriter();
- 写数据
writer.write("test");
- 设置响应类型( 以html为例 )
response.setHeader("content-type","text/html") //或者 response.setContentType("text/html;charset=utf-8"); //这种方式可以解决中文乱码问题
Response响应字节数据
-
使用
- 获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
- 写
outputStream.write(字节数据)
Fliter
快速入门
-
定义类,实现 Fliter 接口,并重写其所有方法
-
配置 Fliter 拦截路径
- @WebFliter("/*")
这个表示应用范围是所有页面
-
做出操作后要记得放行( 放行前逻辑(处理 request),放行,放行后逻辑(处理response) )
chain.doFliter(request,response);
执行细节
- 放行后访问资源,访问结束后还会回到 Fliter
- 回到 Fliter 之后会执行放行之后的逻辑
过滤器链
- 一个web网页可以配置多个过滤器,这多个过滤器称为过滤器链
- 过滤器执行顺序按照过滤器的自然排序,谁排在前面就执行谁
比如 Afliter > Bfliter
JSP
- 一种动态的网页技术,既可以定义静态的 HTML、CSS、JS 内容,也可以定义 JAVA 代码
- JSP 本质上就是一个 Servlet
简单来说,JSP 就等于 HTML + JAVA
快速入门
- 导入jsp坐标
- 创建jsp文件
- 编写 HTML 标签和 JAVA 代码
JSP脚本
- <%......%> 内容会直接放到 _jspService() 方法中
- <%=....%> 内容会放到out.print()中,作为参数
- <%!.....%> 内容会放到 _jspService() 方法之外,被类直接包含
EL表达式
- 用于简化 JSP 的代码
- 会从四大域中逐个查找
$
- ${brand} : 获取域中储存的 key 为 brand 的数据
JavaWeb中的四大域对象
从小到大
- page : 当前页面有效
- request : 当前请求有效
- session : 当前会话有效
- application : 当前应用有效
JSTL 标签
- JSP 标准标签库,使用 JSTL 标签来取代 JSP 页面上的 JAVA 代码
快速入门
-
导入坐标
-
在文件上方写上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 步长
<c:forEach items="容器名称" var="临时变量名称">
<!--操作逻辑-->
</c:forEach>
<!--例子-->
<c:forEach item="${students}" var="student">
<h1>
${student.name}
</h1>
<h2>
${student.number}
</h2>
</c:forEach>
MVC 三层架构
- MVC 好处
- 职责单一,互不影响
- 有利于分工协作
- 有利于组件重用
三层架构
-
表现层
-
业务逻辑层
-
数据访问层