整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端基础:HTML


ntroduction

HTML 是一种描述网页语言, 指的是超文本标记语言 (Hyper Text Markup Language)。其中,超文本指的是网页上可以包含图片,视频,连接信息。标记也叫做标签,所以标签书写的是<内容>。语言就是一种交流工具,HTML 是用户与浏览器之间交互工具。

简单说,HTML 是由浏览器解析执行的,它不会将 HTML 标签展示出来,而是会解析 HTML 标签,以特定效果展示出来。

Syntax

  1. HTML 可以直接使用文本编辑器来编写
  2. HTML 文件它的后缀名是 .htm 或 .html
  3. <html> 标签它代表当前页面是一个 HTML
  4. <head> 标签中可以声明 HTML 页面的相关信息
  5. <body> 标签中它主要是用于显示页面信息
  6. 标签要有开始,有结束。开始标签与结束标签中的内容是标签的内容,如果没有标签内容,可以让标签自关闭 <br/>。
  7. 大多数标签它具有属性,属性值要使用引号引起来。
  8. HTML 本身是不区分大小写的。
<html>
    <head>HEAD</head>
    <body>BODY</body>
</html>

Tools

可以使用 JetBrains WebStorm 或者 VS Code 进行开发。


HTML Tags

文件标签

<html> 代表当前书写的是一个 HTML 文档

<head> 存储的本页面的一些重要的信息,它不会显示

标签下有一个子标签 <title> 它是用于定义页面的标题的

<body> 书写的内容会显示出来,属性:1. text 用于设置文字颜色;2. bgcolor 用于设置页面的背景色;3. background 用于设置页面的背景图片

排版标签

HTML 注释

<!-- 注释不会在浏览器中显示 -->

<br/> 标签

br 标签就是一个换行功能标签

<p> 标签

在 p 标签中的内容会在开始与结束之间产生一个空白行并且它会自动换行

常用属性 align 的作用是设置段落中的内容对齐方式,可取值有 left right center

<hr> 标签

hr 标签会在页面上产生一个水平线

常用属性:

align:可取值有 left right center 代表水平线位置

size:代表水平线高度(厚度)

width:代表水平线宽度

color:水平线的颜色

关于 HTML 中标签属性

两种方式:

  1. 直接设置值,默认单位是 px (像素) <HR WIDTH="200">
  2. 可以设置百分比 <HR WIDTH="35%">

<div> 标签

Div 是一个块标签

Div 与 CSS 结合,会更好对页面进行排版

<span> 标签

Span 标签也是一个块标签Div 与 span 区别:Div 会自动换行,我们也叫这样的标签为行级元素Span 标签它不会自动换行,我们也叫它为行内元素

字体标签

<font> 标签

Font 标签可以设置字体,字的大小及颜色

常用属性:

Face:用于设置字体,例如 宋体 隶书 楷体

Size:用于设置字的大小

Color:用于设置字的颜色

我们所看到的屏幕上所有的颜色都是由红、绿、蓝这三种基色调混合而成的。每一种颜色的饱和度和透明度都是可以变化的,用 0~255 的数值来表示。如纯红色表示为 (255,0,0),十六进制表示为 #FF0000。按这种表达方式,理论上我们可以得到 256 * 256 *256=16777216 种颜色。

  1. 使用十六进制方式,取值范围 #000000 ~ #FFFFFF (黑色到白色)。当颜色值为 #cc3300 时,也可以使用 #c30 这种简化的方式来表示。
  2. RGB 颜色表示法:RGB(x,y,z),x、y、z 是 0 ~ 255 之间的整数。
  3. 在线颜色选择器:http://www.86y.org/code/colorpicker/color.html


标题标记

<h1> 最大 <h6> 最小,它们代表的是标题,可以使用 <b> <i> 对文字设置加粗或倾斜

注意:在 HTML 中允许标签进行嵌套的,但是一般都包裹嵌套,而不可以进行交叉嵌套

清单标记(列表标记)

有序清单:

<!-- 有序列表 I II III-->
<ol type="I" start="3">
    <li>张三</li>
    <li>李四</li>
    <li>王五</li>
</ol>
<!-- 无序列表 -->
<ul type="square">
    <li>Java</li>
    <li>Python</li>
    <li>C#</li>
</ul>

图形标签

<img> 可以让我们在网页引入一张图片

常用属性

  1. src 代表的图片的路径
  2. width 图片的宽度
  3. height 图片的高度
  4. border 用于设置图片的边框
  5. alt 如果图片不可以显示时,默认显示的文本信息
  6. align 图片附件文字的对齐方式,取值有 :left right middle top bottom

超连接标签

<a> 标签可以实现跳转到其它页面操作。超链接内容不仅可以是文本,也可以是图片等信息

常用属性

  1. href 代表的要跳转的路径
  2. name 属性可以在本页面设置一个锚点
  3. target 这个属性规定在何处打开这个链接文档,可取值:_blank _self _parent _top framename

表格标签

<!-- 学习表格标签 -->
<table border="2" align="center" width="400px">
    <caption>学生成绩单</caption>
    <tr>
        <th>姓名</th>
        <th>语文成绩</th>
        <th>数学成绩</th>
        <td colspan="2" align="center"><b>操作</b></td>
    </tr>
    <tr align="center">
        <td>张三</td>
        <td>99</td>
        <td>100</td>
        <td>修改</td>
        <td>删除</td>
    </tr>
    <tr align="center">
        <td>李四</td>
        <td>90</td>
        <td>66</td>
        <td>修改</td>
        <td>删除</td>
    </tr>
</table>

表单标签

通过表单可以将要提交的数据提交到指定的位置

<!-- 表单:用户注册案例 -->
<form name="form1" action="user/login" method="POST">
    <table border="1" width="64%" align="center">
        <tr>
            <td>用户名:</td>
            <td>
                <input type="text" name="username">
            </td>
        </tr>
        <tr>
            <td>密码:</td>
            <td>
                <input type="password" name="password">
            </td>
        </tr>
        <tr>
            <td>性别:</td>
            <td>
                <input type="radio" name="sex" checked="checked">男
                <input type="radio" name="sex" >女
            </td>
        </tr>
        <tr>
            <td>地址:</td>
            <td>
                <select name="province">
                    <option value="0">--请选择省--</option>
                    <option value="10001">广东</option>
                    <option value="10002">上海</option>
                    <option value="10003">山东</option>
                </select> 省
                <select name="city">
                    <option>--请选择市--</option>
                    <option value="1000301">广州市</option>
                    <option>深圳市</option>
                    <option>东莞市</option>
                </select> 市
            </td>
        </tr>
        <tr>
            <td>编程语言:</td>
            <td>
                <input type="checkbox" name="language" checked="checked">Java
                <input type="checkbox" name="language">Python
                <input type="checkbox" name="language">Go
            </td>
        </tr>
        <tr>
            <td>照片:</td>
            <td>
                <input type="file" name="image">
            </td>
        </tr>
        <tr>
            <td>自我介绍:</td>
            <td>
                <textarea name="remark" rows="5" cols="100"></textarea>
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" value="注册"> 
                <input type="reset" value="取消"> 
            </td>
        </tr>
    </table>
</form>

框架标签

通过框架标签可以定制 HTML 页面布局

在 HTML 页面上去描述框架信息时,不可以将 <frameset> 写在 <body> 标签中

framesetTest.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>HTML 框架标签</title>
    </head>
    <!-- rows 定义了三行:第一行 100 像素,第三行:100 像素;第二行:剩下的像素 -->
    <frameset rows="100, * , 100"> 
        <frame name="topModule" src="./top.html"></frame>
        <frameset cols="100, * ">
            <frame name="menuModule" src="./menu.html"></frame>
            <frame name="contentModule" src="./content.html"></frame>
        </frameset>
        <frame name="footModule" src="./foot.html"></frame>
    </frameset>
</html>

top.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>top</title>
    </head>
    <body>
        <div>头部信息</div>
    </body>
</html>

foot.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>footL</title>
    </head>
    <body>
        <div>底部信息</div>
    </body>
</html>

menu.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>menu</title>
    </head>
    <body>
        <div>菜单信息</div>
    </body>
</html>

content.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>content</title>
    </head>
    <body>
        <div>内容显示区</div>
    </body>
</html>

其它标签与特殊字符

<meta> 标签

<meta> 标签必须写在 <head> 标签之间

  1. 它可以对页面进行描述及热词设置,可以方便搜索引擎查找页面
  2. 通过 meta 标签设置 http 响应信息
  3. 通过 meta 标签可以设置页面的编码,<meta http-equiv="Content-Type" content="text/html; charset=gbk">
  4. 通过 meta 标签来设置页面加载后在指定的时间后跳转到指定的页面,<meta http-equiv="refresh" content="5; url=http://www.baidu.com">

<link>标签

使用 link 标签来导入 CSS

特殊字符

详情查看菜鸟教程:https://www.runoob.com/charsets/ref-html-ascii.html


​HTML DOM

Introduction

DOM, Document Object Model -- 文档对象模型,是 HTML 和 XML 文档的编程接口,以树结构表达 HTML 文档。

DOM 是 W3C(万维网联盟)的标准。

DOM 定义了访问 HTML 和 XML 文档的标准。

W3C DOM 标准被分为 3 个不同的部分:

  • 核心 DOM - 针对任何结构化文档的标准模型
  • XML DOM - 针对 XML 文档的标准模型
  • HTML DOM - 针对 HTML 文档的标准模型

DOM Node

DOM 是被视为节点树的 HTML。

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

HTML DOM 将 HTML 文档视作树结构,这种结构被称为节点树。

节点树中的节点彼此拥有层级关系。常用父(parent)、子(child)和同胞(sibling)等术语来描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)。
  • 每个节点都有父节点、除了根(它没有父节点)。
  • 一个节点可拥有任意数量的子节点。
  • 同胞是拥有相同父节点的节点。

DOM 方法 & 属性

HTML DOM 方法是可以在节点(HTML 元素)上执行的动作。

HTML DOM 属性是可以在节点(HTML 元素)设置和修改的值。

可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。方法是能够执行的动作(比如添加或修改元素)。属性是能够获取或设置的值(比如节点的名称或内容)。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>DOM</title>
    </head>
    <body>
        <div id="div1">
            <p id="p1">Hello</p>
            <p id="p2">Hello</p>
        </div>
        <script>
            // 先获取 P 元素
            var element = document.getElementById("p1")
            // 直接修改 p 元素的内容
            element.innerHTML = "此时已是修改后的内容"

            // 修改 p2 标签的样式
            var ele = document.getElementById("p2")
            ele.style.color="blue"
            ele.style.fontFamily="宋体"
            ele.style.fontSize="larger"

            // 添加元素
            // 创建一个p元素
            var elementP = document.createElement("p")
            // 创建一个内容
            var nodeText = document.createTextNode("新加的 P 元素")
            // 把文字内容添加到p元素中
            elementP.appendChild(nodeText)
            // 把新创建的p元素添加div1元素中
            var div1 = document.getElementById("div1")
            div1.appendChild(elementP)

            // 插入添加新的元素
            // 创建一个新的元素
            var eleP = document.createElement("p")
            // 创建一个内容
            var noText = document.createTextNode("在 P1 元素前添加的新元素")
            // 把文字内容添加到 p 元素中
            eleP.appendChild(noText)
            // 把新创建的 p 元素添加 div 1 元素中
            var parentDiv1 = document.getElementById("div1")
            // 获取指定被添加的元素
            var p1 = document.getElementById("p1")
            // 在元素前添加;参数说明:1.要添加的元素;2.在那个元素之前添加(指定一个元素)
            parentDiv1.insertBefore(eleP, p1)

            // 删除元素
            // 获取父元素
            var pdiv1 = document.getElementById("div1")
            var removep1 = document.getElementById("p1")
            // 使用父元素删除该元素
            pdiv1.removeChild(removep1)
        </script>
    </body>
</html>

DOM 事件

HTML DOM 允许 JavaScript 对 HTML 事件作出反应。当事件发生时,可以执行 JavaScript,比如发生用户点击一个 HTML 元素的事件。

如需在用户点击某个元素时执行代码,可以把 JavaScript 代码添加到 HTML 事件属性中:onclick=JavaScript

HTML 事件的例子:

  • 当用户点击鼠标时
  • 当网页已加载时
  • 当图片已加载时
  • 当鼠标移动到元素上时
  • 当输入字段被改变时
  • 当 HTML 表单被提交时
  • 当用户触发按键时
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>DOM 事件</title>
        <!-- JavaScript 代码必须写在 script 中 -->
        <script>
            function onLoadFun(){
                alert("已载入...");
            }
            // 文本框失去焦点事件
            function onBlurFun(){
                alert("此方法是文本框失去焦点事件,用来校验此文本框输入数据的")
            }
            // 表单被提交时执行事件
            function onSubmitFun(){
                alert("此表单已提交,这个方法也可以来作为数据校验的");
            }
            // 元素被改变时触发事件
            function onChangeFun(){
                alert("文本框元素已输入新的数据")
            }
            // 当鼠标悬停在某一个元素上时执行的方法
            function onMouseOverFun(element){
                element.innerHTML = "鼠标已停在H1元素上了"
            }
            // 当鼠标离开某一个元素时执行事件
            function onMouseOutFun(element){
                element.innerHTML = "鼠标已离开H1元素上了..."
            }
        </script>
    </head>
    <!-- 需求:当页面被载入时,执行一个代码,弹框提示已载入 -->
    <body onload="onLoadFun()">
        <!-- 需求:在一个表单中有用户名录入的文本框,当输入完文本框的时候进行名称校验,提交的时候弹框显示 -->
        <form onsubmit="onSubmitFun()">
            用户名:<input id="username" name="username" onchange="onChangeFun()" >
            <br/>
            <button type="submit">提交</button>
        </form>
        <!-- 需求:有一个 H1 标签元素,当鼠标移动到 H1 元素上时,修改文字,当鼠标移出元素时执行事件 -->
        <h1 onmouseover="onMouseOverFun(this)" onmouseout="onMouseOutFun(this)">我是一个标题</h1>
    </body>
</html>


想了解更多,欢迎关注我的微信公众号:Renda_Zhang

今日内容:

1. Servlet

2. HTTP协议

3. Request


一、Servlet补充内容:

1.1 Servlet的体系结构:

Servlet -- 接口

|

GenericServlet -- 抽象类

|

HttpServlet -- 抽象类


1.2 GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可


1.3 HttpServlet:对http协议的一种封装,简化操作

1. 定义类继承HttpServlet

2. 复写doGet/doPost方法

1.2 Servlet相关配置

1.2.1 urlpartten:Servlet访问路径

1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})

2. 路径定义规则:

1. /xxx:路径匹配

2. /xxx/xxx:多层路径,目录结构

3. *.do:扩展名匹配


二、HTTP:

2.1 概念:Hyper Text Transfer Protocol 超文本传输协议

* 传输协议:定义了,客户端和服务器端通信时,发送数据的格式

* 特点:

1. 基于TCP/IP的高级协议

2. 默认端口号:80

3. 基于请求/响应模型的:一次请求对应一次响应

4. 无状态的:每次请求之间相互独立,不能交互数据


* 历史版本:

* 1.0:每一次请求响应都会建立新的连接

* 1.1:复用连接


2.2 请求消息数据格式

2.2.1 请求行:

请求方式 请求url 请求协议/版本

GET /login.html HTTP/1.1


2.2.2 请求方式:

* HTTP协议有7中请求方式,常用的有2种

* GET:

1. 请求参数在请求行中,在url后。

2. 请求的url长度有限制的

3. 不太安全

* POST:

1. 请求参数在请求体中

2. 请求的url长度没有限制的

3. 相对安全

2.2.3 请求头:客户端浏览器告诉服务器一些信息

请求头名称: 请求头值

* 常见的请求头:

1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息

* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题


2. Referer:http://localhost/login.html

* 告诉服务器,我(当前请求)从哪里来?

* 作用:

1. 防盗链:

2. 统计工作:

2.2.4 请求空行

空行,就是用于分割POST请求的请求头,和请求体的。

2.2.5 请求体(正文):

* 封装POST请求消息的请求参数的


2.2.6 请求消息举例:

POST /login.html HTTP/1.1

Host: localhost

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate

Referer: http://localhost/login.html

Connection: keep-alive

Upgrade-Insecure-Requests: 1

username=zhangsan


三、Request:

3.1 request对象和response对象的原理

1. request和response对象是由服务器创建的。我们来使用它们

2. request对象是来获取请求消息,response对象是来设置响应消息

3.2 request对象继承体系结构:

ServletRequest -- 接口

| 继承

HttpServletRequest -- 接口

| 实现

org.apache.catalina.connector.RequestFacade 类(tomcat)


3.3 request功能:

3.3.1 获取请求消息数据

1. 获取请求行数据

* GET /day14/demo1?name=zhangsan HTTP/1.1

* 方法:

1. 获取请求方式 :GET

* String getMethod()

2. (*)获取虚拟目录:/day14

* String getContextPath()

3. 获取Servlet路径: /demo1

* String getServletPath()

4. 获取get方式请求参数:name=zhangsan

* String getQueryString()

5. (*)获取请求URI:/day14/demo1

* String getRequestURI(): /day14/demo1

* StringBuffer getRequestURL() :http://localhost/day14/demo1

* URL:统一资源定位符 : http://localhost/day14/demo1

* URI:统一资源标识符 : /day14/demo1

6. 获取协议及版本:HTTP/1.1

* String getProtocol()

7. 获取客户机的IP地址:

* String getRemoteAddr()

2. 获取请求头数据

* 方法:

* (*)String getHeader(String name):通过请求头的名称获取请求头的值

* Enumeration<String> getHeaderNames():获取所有的请求头名称

3. 获取请求体数据:

* 请求体:只有POST请求方式,才有请求体,

在请求体中封装了POST请求的请求参数

* 步骤:

1. 获取流对象

* BufferedReader getReader():获取字符输入流,只能操作字符数据

* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

2. 再从流对象中拿数据

3.3.2 其他功能:获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数:

1. String getParameter(String name):根据参数名称获取值 username=zs

2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game

3. Enumeration<String> getParameterNames():获取所有请求的参数名称

4. Map<String,String[]> getParameterMap():获取所有参数的map集合


* 中文乱码问题:

* get方式:tomcat 8 已经将get方式乱码问题解决了

* post方式:会乱码

* 解决:在获取参数前,设置request的编码为

request.setCharacterEncoding("utf-8");

3.3.3 请求转发:一种在服务器内部的资源跳转方式

1. 步骤:

1. 通过request对象获取请求转发器对象:

RequestDispatcher getRequestDispatcher(String path)

2. 使用RequestDispatcher对象来进行转发:

forward(ServletRequest request, ServletResponse response)


2. 特点:

1. 浏览器地址栏路径不发生变化

2. 只能转发到当前服务器内部资源中。

3. 转发是一次请求


3.3.4. 共享数据:

* 域对象:一个有作用范围的对象,可以在范围内共享数据

* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

* 方法:

1. void setAttribute(String name,Object obj):存储数据

2. Object getAttitude(String name):通过键获取值

3. void removeAttribute(String name):通过键移除键值对


3.3.5. 获取ServletContext:

* ServletContext getServletContext()


四、案例:用户登录

* 用户登录案例需求:

1.编写login.html登录页面

username & password 两个输入框

2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表

3.使用JdbcTemplate技术封装JDBC

4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您

5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误



* 分析


* 开发步骤

1. 创建项目,导入html页面,配置文件,jar包

2. 创建数据库环境

CREATE DATABASE day14;

USE day14;

CREATE TABLE USER(

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(32) UNIQUE NOT NULL,

PASSWORD VARCHAR(32) NOT NULL

);


3. 创建包cn.itcast.domain,创建类User

package cn.itcast.domain;

/**

* 用户的实体类

*/

public class User {

private int id;

private String username;

private String password;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

@Override

public String toString() {

return "User{" +

"id=" + id +

", username='" + username + '\'' +

", password='" + password + '\'' +

'}';

}

}

4. 创建包cn.itcast.util,编写工具类JDBCUtils

package cn.itcast.util;


import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;

import javax.xml.crypto.Data;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.Properties;

/**

* JDBC工具类 使用Durid连接池

*/

public class JDBCUtils {

private static DataSource ds ;

static {

try {

//1.加载配置文件

Properties pro = new Properties();

//使用ClassLoader加载配置文件,获取字节输入流

InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");

pro.load(is);

//2.初始化连接池对象

ds = DruidDataSourceFactory.createDataSource(pro);

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 获取连接池对象

*/

public static DataSource getDataSource(){

return ds;

}

/**

* 获取连接Connection对象

*/

public static Connection getConnection() throws SQLException {

return ds.getConnection();

}

}

5. 创建包cn.itcast.dao,创建类UserDao,提供login方法

package cn.itcast.dao;


import cn.itcast.domain.User;

import cn.itcast.util.JDBCUtils;

import org.springframework.dao.DataAccessException;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.JdbcTemplate;

/**

* 操作数据库中User表的类

*/

public class UserDao {

//声明JDBCTemplate对象共用

private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

/**

* 登录方法

* @param loginUser 只有用户名和密码

* @return user包含用户全部数据,没有查询到,返回null

*/

public User login(User loginUser){

try {

//1.编写sql

String sql = "select * from user where username = ? and password = ?";

//2.调用query方法

User user = template.queryForObject(sql,

new BeanPropertyRowMapper<User>(User.class),

loginUser.getUsername(), loginUser.getPassword());

return user;

} catch (DataAccessException e) {

e.printStackTrace();//记录日志

return null;

}

}

}

6. 编写cn.itcast.web.servlet.LoginServlet类

package cn.itcast.web.servlet;


import cn.itcast.dao.UserDao;

import cn.itcast.domain.User;

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;

@WebServlet("/loginServlet")

public class LoginServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//1.设置编码

req.setCharacterEncoding("utf-8");

//2.获取请求参数

String username = req.getParameter("username");

String password = req.getParameter("password");

//3.封装user对象

User loginUser = new User();

loginUser.setUsername(username);

loginUser.setPassword(password);

//4.调用UserDao的login方法

UserDao dao = new UserDao();

User user = dao.login(loginUser);

//5.判断user

if(user == null){

//登录失败

req.getRequestDispatcher("/failServlet").forward(req,resp);

}else{

//登录成功

//存储数据

req.setAttribute("user",user);

//转发

req.getRequestDispatcher("/successServlet").forward(req,resp);

}

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

this.doGet(req,resp);

}

}


7. 编写FailServlet和SuccessServlet类

@WebServlet("/successServlet")

public class SuccessServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取request域中共享的user对象

User user = (User) request.getAttribute("user");

if(user != null){

//给页面写一句话

//设置编码

response.setContentType("text/html;charset=utf-8");

//输出

response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");

}

}



@WebServlet("/failServlet")

public class FailServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//给页面写一句话

//设置编码

response.setContentType("text/html;charset=utf-8");

//输出

response.getWriter().write("登录失败,用户名或密码错误");

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request,response);

}

}




8. login.html中form表单的action路径的写法

* 虚拟目录+Servlet的资源路径


9. BeanUtils工具类,简化数据封装

* 用于封装JavaBean的

1. JavaBean:标准的Java类

1. 要求:

1. 类必须被public修饰

2. 必须提供空参的构造器

3. 成员变量必须使用private修饰

4. 提供公共setter和getter方法

2. 功能:封装数据



2. 概念:

成员变量:

属性:setter和getter方法截取后的产物

例如:getUsername() --> Username--> username



3. 方法:

1. setProperty()

2. getProperty()

3. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

这里是云端源想IT,帮你轻松学IT”

嗨~ 今天的你过得还好吗?

睡眠等同于希望

每次醒来都是一个新的开始

一个新的希望


- 2024.03.22 -


在Web开发的世界中,CSS(层叠样式表)是构建视觉吸引力和定义网页布局的不可或缺的工具。

掌握如何恰当地引入CSS样式以及理解它们的优先级规则,对于前端开发者来说至关重要。今天,我们就来深入探讨CSS的四种引入方式,以及选择器的优先级之谜,了解常用的CSS样式及使用方法!



一、CSS四种样式引入方式

CSS(层叠样式表)为网页提供了丰富的样式定义,允许开发者通过多种方式将样式应用到HTML文档中。以下是四种主要的CSS引入方式:


1.1 行内样式

这是最直接也最简单的方法,通过在HTML元素的style属性中直接编写CSS规则。

示例:

<p style="color: red; font-size: 20px;">这是一段红色的文字。</p>


这种方式的优点是简单快捷,但缺点是它使得HTML代码与样式混合,不够纯净,且不利于样式的复用和维护。


1.2 内嵌样式

在一个HTML文档中使用<style>标签将CSS规则嵌入到HTML的head部分。这种方式适用于定义特定于某一页面的样式。

示例:

<head>
<style>
body {background-color: powderblue;}
h1 {color: blue;}
p {color: red;}
</style>
</head>
<body>
<h1>This is a heading</h1>
<p>This is a paragraph.</p>
</body>



1.3 外部样式

这是最常用的方法,它通过<link>标签将外部的CSS文件链接到HTML文档中。这种方法的优势在于可以在多个页面间共享同一个样式文件,有助于保持代码的整洁和一致性。

示例:

<head>
<link rel="stylesheet" type="text/css" href="mystyle.css">
</head>
<body>
<h1>This is a heading</h1>
<p>This is a paragraph.</p>
</body>
其中,mystyle.css的内容可能如下:
body {background-color: powderblue;}
h1 {color: blue;}
p {color: red;}


1.4 导入样式

使用@import语句在CSS文件中导入另一个CSS文件。尽管这种方法可以分离样式表,但它通常不被推荐使用,因为其加载时序可能会影响页面渲染效率。

示例:

@import url('https://fonts.googleapis.com/css?family=Roboto');
body {
font-family: 'Roboto', sans-serif;
}


1.5 样式单优先级

作用域范围:外部样式表>内部样式表>行内样式表


优先级:

  • 行内样式表>内部样式表>外部样式表
  • 相同的样式作用在同一个标签上:就近原则;不同的样式作用在同一个标签上:叠加。
  • 加载外部样式表或者内部样式表时候,需要注意加载顺序:加载html文件是从上向下加载的,也就是后面加载的样式会覆盖前面的样式。


二、CSS常用样式

2.1 字体样式

normal - 文字正常显示

italic - 文本以斜体显示

oblique - 文本为“倾斜”(倾斜与斜体非常相似,但支持较少)

font-weight 属性指定字体的粗细

示例:

<!DOCTYPE html>
<html>
<head>
<style>
.sp1{
color: darkorange;
font-size: 20px;
font-weight: bolder; /* bolder 字体是否加粗*/

font-style: italic; /* italic 字体是否倾斜*/

font-family: "宋体"; /* 设置字体样式*/
}

.sp2{
/* 简写 */
/* 顺序不能能变:style-weigth-size-family */
font:italic bolder 15px 宋体 ;
color:rgb(28, 235, 97);
}
</style>
<body>
<span>
编程学习,从云端源想开始!
</span><br>
<span>
让知识触手可及
</span>
<p>让知识触手可及</p>
</body>
</html>



2.2 文本样式

color: 字体颜色

text-align: center; - - 文本对齐方式

text-decoration:none; - - 文本的线

text-shadow: pink 5px 5px 2px; - - 文本的阴影 【阴影颜色-水平方向的偏移量-垂直方向的偏移量-模糊距离】

line-height: - - 行高 (文本在标签内所占的高度)

width:

height:

border: 1px #ffffff solid; - - 盒子边框【边框粗细-颜色-边框线样式】

示例:

<style>
.p{
color: rgb(0, 255, 21); /* 字体颜色 */
text-align: center; /* 文本对齐方式 */
text-decoration:none; /* 文本的线 */
text-shadow: pink 5px 5px 2px; /* 文本的阴影 【阴影颜色-水平方向的偏移量-垂直方向的偏移量-模糊距离】*/
line-height: 400px; /* 行高 (文本在标签内所占的高度)*/
width: 400px;
height: 300px;
border: 1px rgb(76, 14, 223) solid; /* 盒子边框【边框粗细-颜色-边框线样式】 */
}
</style>
</head>

<body>
<p>欢迎来到云端源想!</p>
<a href="https://www.baidu.com"></a>
</body>


2.3 背景样式

width: 500px;

height: 1200px;

background-color: pink; - - 背景颜色

background-image: url(…/img/background.jpg); - - 背景图片

background-repeat: no-repeat; - - 背景图片是否平铺

background-position: left top; - - 指定背景图片的位置

background-attachment: fixed; - - 背景图片是否随着标签滚动 【fixed-固定 scroll-滚动】

示例:

<style>
.d{
width: 500px;
height: 1200px;
background-color: pink; /* 背景颜色 */
background-image: url(../img/background.jpg); /* 背景图片 */
background-repeat: no-repeat; /* 背景图片是否平铺 */
background-position: left top; /* 指定背景图片的位置 */
background-attachment: fixed; /* 背景图片是否随着标签滚动 【fixed-固定 scroll-滚动】 */
}
</style>
</head>
<body>
<div>

</div>


2.4 列表样式

<!DOCTYPE html>
<html>
<head>
<style>
li{
background-color: lemonchiffon;
/*列表样式:常用取值:none-无样式 square-正方形 circle-空心圆 decimal-数字*/
list-style-type: circle;
/*列表样式为自定义图片*/
list-style-image: url(../img/2.jpg);
/*列表样式的放置位置*/
list-style-position: inside;
/*列表样式缩写*/
list-style: square url(../img/2.jpg) inside;
/*常用的列表样式*/
list-style: none;
}
</style>
</head>
<body>
<ul>
<li>列表项1</li>
<li>列表项2</li>
<li>列表项3</li>
</ul>
</body>
</html>


2.5 边框样式

<!DOCTYPE html>
<html>
<head>
<style>
.border{
/*边框宽度*/
border-width: 2px;
/*边框颜色*/
border-color: red;
/*边框样式:solid 实线 dotted 点线 dashed 虚线*/
border-style: dashed;
/*边框样式缩写:样式 颜色 宽度*/
border:solid green 5px;
/*边框可以为4个方向分别设置*/
border-top: dashed black 4px;
border-right: dashed #FF00FF 4px;
border-bottom: dotted darkblue 4px;
border-left: solid fuchsia 5px;
/*没有边框*/
border: none;
/*常用的细边框样式*/
border: solid 1px #ccc;
}
</style>
</head>
<body>
<div class="border">这是一个带有边框的元素</div>
</body>
</html>


2.6 盒子模型

所有的html元素可以看做是盒子,在css中,"box model"是用来设计和布局时使用。

CSS盒子模型本质是一个盒子,封装周围的html元素,它包括:边框、边距、填充、实际内容。

盒子模型允许我们在其他元素和周围元素边框之间的空间放置元素。

  • margin:外边距,清除边框外区域,外边距是透明的。
  • border:边框,围绕在内边距和内容外的边框。
  • padding:内边距,清除内容周围区域内边距是透明的。
  • content:内容,显示文字和图像。

想要快速入门前端开发吗?推荐一个前端开发基础课程,这个老师讲的特别好,零基础学习无压力,知识点结合代码,边学边练,可以免费试看试学,还有各种辅助工具和资料,非常适合新手!点这里前往学习哦!云端源想

示例:

<head>
<meta charset="UTF-8">
<title></title>
<style>
/* border:边框,分4个方向,同理margin、padding也分为四个方向
* margin:元素与元素之间对的距离
* padding:内容与边框之间的距离
* 设置的时候顺序:上 右 下 左
*/
.div{
border: solid red 10px;
/*四个方向上的元素与元素之间的距离都是50px*/
margin: 50px;
/*两个值的时候:第一个参数表示上下距离都是50px,第二个参数表示左右距离都是100px*/
margin: 50px 100px;
padding: 50px;
/*
一个元素真正的宽度=width+左右padding值+左右的border值
一个元素的真正高度=height+上下的padding值+上下的border值
* */
}
</style>
</head>
<body>
<div>111111111112222222222223333333333333333</div>
</body>

1)盒子的宽高

元素的实际宽度和高度:

  • 计算一个元素在实际在页面占据的总宽度=元素宽度+左填充+右填充+左边框+右边框+左边距+右边距
  • 元素实际在页面占据的总高度=元素高度+顶部填充+底部填充+上边框+下边框+上边距+下边距



2)设置宽度=元素实际宽度,box-sizing属性。

<head>
<meta charset="UTF-8">
<title></title>
<style>
/* box-sizing:确认元素的大小
content-box: 实际宽度=width+左右的psdding值+上下的border值
实际高度=height+上下的padding值+上下的border值
border-box:实际宽度=width;实际高度=height
padding和border不会影响元素的实际宽高
* */
.box{
width: 100px;
height: 200px;
border: 5px solid;
padding: 5px;
box-sizing: content-box;
}
</style>
</head>
<body>
<div>你好中国</div>
</body>


CSS的世界博大精深,以上只是冰山一角,希望通过这些基础的常用样式可以帮助你快速进入CSS世界的大门。


掌握CSS的引入方式和选择器优先级是构建高效、可维护网站的关键。通过这些知识,你可以更好地管理和优化你的样式代码,创造出既美观又专业的网页设计。现在,准备好迈入CSS的世界,开启你的创意之旅吧!


我们下期再见!


END

文案编辑|云端学长

文案配图|云端学长

内容由:云端源想分享