文章目录
- 软件架构
- HTML
- URL-pattern编写方式
- CSS
- Servlet
- 会话技术
-
- cookie技术
- session技术
- JSP
-
- 脚本:
-
- jsp程序段:
- jsp声明:
- jsp表达式:
- JSP内置对象
- JSP指令
- JSP动作
- JDBC
-
- 抽取jdbc工具类:JDBCUtils
-
- 数据库连接池
- MVC
-
- EL表达式
- Filter
- Listener
软件架构
使用Java基于互联网项目的语言开发 : 1. C/S: Client/Server 客户端/服务器端 * 用户本地有客户端程序,远程有服务器端程序 * QQ * 优:用户体验好 * 缺陷:开发、安装、部署、维护麻烦 2. B/S: Brower/Server 浏览器/服务器端 * 用户通过不同的网站访问不同的服务器端程序只需要一个浏览器 * 优发、安装、部署、维护方便 * 缺乏:过度应用会影响用户体验;硬件要求高
资源分类:
-
静态资源:利用静态网页开发技术发布的资源 特点:所有用户访问的结果都是一样的 HTML:构建基本网页,显示页面内容 CSS :美化页面,布局页面 JAVAScript:控制页面元素, 用户要求静态资源,服务器将直接向浏览器发送静态资源,浏览器内置的静态资源分析引擎可以显示静态资源
-
动态资源:利用动态网页技术发布的资源 特点:所有用户访问的结果可能不同 JSP, Servlet,php 用户要求动态资源,服务器将动态资源转换为静态资源,然后发送给浏览器
HTML
Hyper Text Markup Language 超文本标记语言 超文本:网状文本以超链接的形式组织各种空间的文本信息 标记语言:由标签组成的语言<标签名称>HTML XML 标记语言不是编程语言,没有逻辑 语法: 1) HTML的后缀名是.html或.htm 2) 标签: 封锁标签:开始标签,结束标签;< html> < /html> 自闭症和标签:开始和结束标签;< br> 3)标签可以嵌套:正确嵌套 < a > < b >< /b >< /a> 4)属性可以在开始标签中定义,属性由键对组成,需要引号(单双都可以) 5)html标签不区分大小写,但建议使用小写
<html> <head> <title>title</title> </head> <body> <font color='red'> hello world</font><br> <font color='bule'> hello world</font> </body> </html> 标签: <head> <meta charset = "UTF-8">//指定中文
<title> title</title>
</head>
-
:最基本的标签 html:html文档的艮标签 head:头标签,指定html文档的属性,引入外部的资源 title:标题 body:体标签 <!doctype html>:
-
:与文本相关的标签
注释:<!-- 注释 -->
<h1> to<h6>:标题标签 加黑加粗,h1~h6逐渐字号减小
<p>:段落标签 自行加换行
<br>:换行
<hr>:显示一条水平线,自闭和标签
<hr color ="red" width ="200" size= "10" align = "left">
颜色 宽度 宽度 对其方式
<b>:加粗
<i>:斜体
<font>:字体标签; color颜色 size大小 face字体
<center>:文本居中
color:
*英文单词,red,green,blue
*rgb(值1,值2,值3) 0~255;rgb(0,0,255)
*#值1值2值3:00~FF之间;#FF00FF
width:
*数值:width=“20” 单位,默认是px(像素)width = “50%”
空格: 
- :展示图片
<img src="SJ/云1.jpg" align = "right" alt = "大云" width ="500" high="300"/>
相对路径:以 ./ 开头的路径;当前目录
../ 代表上一级目录
- :
有序列表:<ol><li> </li> </ol>
<!--有序列表-->
早上起床
<ol type="1" start = "5">
// 1,2,3 开始从5开始
<li>睁眼</li>
<li>看手机</li>
<li>洗脸</li>
</ol>
无序列表:<ul><li></li></ul>
<!--无序列表-->
<ul type="square">
//type类型 disc 圆点 square方框 circle圆圈
<li>睁眼</li>
<li>看手机</li>
<li>洗脸</li>
</ul>
- : 定义一个超链接:< a> < /a> href :跳转到的URL target:指定打开资源的方式 _blank:在空白页面打开 _self:在当前页面打开
<a href="http://www.baidu.com">点我</a> //没有设置target则默认在当前页面打开
<a href="http://www.baidu.com" target="_blank"> 点我</a>//在空白页面打开URL
<a href="./列表标签.html" target="_blank"> 点我</a> //空白页面打开该目录下的列表标签
<a href="http://www.baidu.com"><img src="SJ/云1.jpg"></a>//点击图片之后跳转到新的链接地址
-
:由于其本身没有样式,所以在CSS时方便修改使用 span:文本信息在一行展示,行内标签,内联标签 div:每一个div会占满一行,块级标签
-
: < header> < header> :页眉 < footer> < /footer>:页脚
-
:表格中没有列的概念 定义多少行 行内定义多少个单元格
<table> </table>:定义表格
width:宽度
border:边框
cellpadding:定义内容和单元格之间的距离
cellspacing:定义单元格之间的距离,如果指定为0,则单元格之间的线会合为一条
bgcolor:背景色
align:对齐方式
<tr> </tr>:定义行
bgcolor:背景色
align:对齐方式
<td> </td>:定义单元格
<td colspan="2">//合并
colspan:合并行
rowspan:合并列
<th> </th>:定义表头单元格
<caption>:表格标题
<thead>:表示表格的头部分
<tbody>:表示表格的体部分
<tfoot>:表示表格的脚部分,最下边
<table border="2" cellpadding="0" cellspacing="0"> //加的边框
<tr> //定义的表行
<td>编号</td> //每个的单元格
<td>姓名</td>
<td>成绩</td>
<th>编号</th> //每个的单元格
<th>姓名</th>//th默认加粗居中
<th>成绩</th>
</tr>
</table>
- : 表单:用于采集用户输入的数据,用于和服务器进行交互 < form>< /form> :
action | 提交数据的URL |
method | 指定提交方式 |
post | 1)不会再地址栏中显示,会封装在请求体中 2)请求参数的大小没有限制3)较为安全 |
get | 1)请求参数会在地址栏中显示2)请求参数长度有限3)不太安全 |
表单项中的数据想要被提交,必须指定name属性 表单项标签: input: 可以通过type取值 改变元素样式
- type: **text:文本输入框,默认值
placeholder:指定输入框的提示信息; 当输入框的内容发生变化(有数据输入),则提示信息会自动消失
**password:密码输入框
**radio: 单选框
1.要想让多个属性实现单选的效果,则必须让name属性值一致
2.一般会给每一个单选框提供value属性,指定其被提交的值
不写value则选择后只会出现on 而不知道选了什么
3.checked:默认被选中
**checkbox:复选框
1 .一般会给每一个单选框提供value属性,指定其被提交的值
不写value则选择后只会出现on 而不知道选了什么
2.checked:默认被选中
** file:文件选择框
**hidden:隐藏域
**按钮
1.submit:
2.button:普通按钮
3.image:图片,可提交信息
**email:邮箱
**number: 只能输入数字
**color:颜色
**date:日期 ,描述日期到那一天
**datetime-local:描述日期到分
*lable:指定输入项的文字描述信息
**lable 的for属性会和Input的id属性对应;如果对应了,则点击lable区域,会让input输入框获取焦点
select:下拉列表
<select name="province"> //加上name之后才能提交上去
<option value="陕西”> 陕西</option> //加上value才能知道提交的是什么
</select>
textarea:文本域
cols:指定列数
rows:指定行数
URL-pattern编写方式
- <a href = "/项目名/资源路径"> </a>
- <form action = "/项目名/资源路径"> </form>
- 重定向:response.sendRedirect("/项目名/资源路径");
- 转发:request.getRequestDispatcher("/资源路径").forward(request,response);
- servlet路径
<servlet>
<servlet-name> hello </servlet-name>
<servlet-class> com.helloservlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> hello </servlet-name>
<url-pattern> /hello </url-pattern>
</servlet-mapping>
- Cookie设置path
cookie.setPath("/资源路径");
- ServletContext
ServletContext application = config.getServletContext();
application.getRealPath("/资源路径");
2.1 可以编写多个url-pattern 2.2 精确匹配 < url-pattern> /hello < /url-pattern> < url-pattern> /system/hello < /url-pattern>
CSS
页面的美化和布局控制 1.概念:Cascading Style Sheets 层叠样式表 *层叠:多个样式可以作用在同一个html的元素上,同时生效 2.好处: 1.功能强大 2.将内容和样式控制分离 *降低聚合度 *分工协作更容易 *提高开发效率 3 .css的使用 1)内联样式: *在标签内使用style属性指定CSS代码 *不常用 *作用域在当前这行标签中 < div style=“color:red;”>hello class< /div> 2)内部样式: *在head标签里,定义style标签,style标签的标签体内容就是css代码 *作用域在当前这个页面中
<head>
<style> div{
color:blue; } </style>
</head>
<div>hello class</class>
3)外部样式://css资源文件要和html在同一个包下 1.定义CSS的资源文件 2.在head标签里,定义link标签,引入外部资源文件 *作用域在所有页面中 a.css文件: //单独的css包中的文件
div{
color:green;
}
<head>
<link rel="stylrsheet" href="css/a.css">
</head>
<div>hello css</div>
3.可以用style @去引用文件
<style> @import "css/a.css"; </style>
4.css语法: #格式:
选择器{
属性名1:属性值1;
属性名2:属性值2;
.......
}
#选择器:筛选具有相似特征的元素 #每一对属性需要使用 ; 隔开,最后一对属性不需要
Servlet
HTTP协议 Hyper Text Transfer Protocol 超文本传输协议 特点: 基于TCP/IP的高级协议 默认端口号是:80 基于请求/响应模型:一次请求一次响应 无状态的:每次请求之间相互独立,不能交互数据 请求消息数据的格式: 请求行 请求方式 请求URL 请求协议 GET /login.html HTTP/1.1 请求方式: HTTP协议中有7中请求方式,常用的有两种 *GET: 1.请求参数在请求行中,url后面 2.请求的url长度有限制 3.不太安全 *POST: 1.请求参数在请求体中 2.请求的url长度没有限制 3.安全 请求头 请求空行 请求体
Request:
- 获取请求参数
String getParmeter(String name) username=zs&password=123
String getParmeterValues(String name) hobby=sing&hobby=dance
请求转发
request.getRequestDispatcher("/login.jsp").forward(request,response);
请求重定向
response.sendRedirect("/welcome?username=zhangs&password=123")
URL 参数名 参数值
会话技术
1.会话:一次会话中包含多次请求与响应 功能:在一次会话的范围内的多次请求间,共享数据 2.方式: 1.客户端会话技术:Cookie 2.服务器端会话技术:Session
cookie技术
1、有效时间决定cookie的位置 1.1(默认)浏览器的缓存中 1.2 设置了缓存时间[ setMaxAge() ] 之后在客户端的硬盘文件中 2、Cookie和路径是有关系的 3、response.addCookie() 将Cookie发送给浏览器 4、request.getCookies() 获取提交的Cookie 5、浏览器禁用Cookie
-
: cookie可以保存会话状态,将数据保存在客户端 cookie可以保存在浏览器的缓存中,浏览器关闭cookie消失 cookie也可以保存在客户端的硬盘文件中,浏览器关闭cookie还在,除非cookie失效
-
: 保留购物车商品的状态在客户端上 十天内免登录。。。。
-
默认情况下,服务器发送的Cookie给浏览器之后,浏览器将Cookie保存在缓存中,只要不关闭浏览器,Cookie永远存在,并且有效。当浏览器关闭之后,缓存中的Cookie被清除。 可以通过设置Cookie的有效时长,以保证Cookie保存在硬盘文件中,但是这个有效时长必须是>0的, Cookie的有效时长>0,则该Cookie会被保存在客户端硬盘文件中,有效时长过去之后,则硬盘文件当中的Cookie失效
-
setMaxAge(int seconds) //秒为单位 正数:将cookie数据写入到客户端硬盘的文件中,持久化存储,cookie存活时间 负数:默认值 0:删除cookie信息 在浏览器客户端无论是硬盘文件中还是缓存中保存的cookie,什么时候会再次发送给服务器呢?
- 浏览器会不会提交发送这些Cookie给服务器,和请求路径有关系
- 请求路径和Cookie是紧密关联的
- 不同的请求路径会发送不同的Cookie 默认情况下Cookie和
可以指定路径
-
浏览器禁用Cookie
- 服务器发送过来的Cookie,浏览器不接收
- 服务器还是会发送Cookie,只不过浏览器不接收
*创建cookie对象,绑定数据
Cookie cookie = new Cookie(String name,String value)
*指定路径
cookie. setPath("/king")
*发送cookie对象
response.addCookie(Cookie cookie)
*获取cookie,拿到数据
Cookies[] cookies = request.getCookies();
if(cookies!=null)
{
for(Cookie cookie:cookies)
{
String cookiename = cookie.getName();
String cookieValue = cookie.gatValue();
System.out.println(cookiename+" = "+cookieValue);
}
}
- 实现原理 基于响应头set-cookie和请求头cookie实现
- 细节 1)一次可不可以发送多个cookie 创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可 2)cookie存中文 tomcat 8之前 不能直接存储中文 tomcat 8之后 可存中文 3)cookie共享问题 3.1)多个web项目,cookie的共享问题 setPath(String path):默认是当前虚拟目录 要共享,将path设为:“/” setPat(“/”); 3.2)不同的tomcat服务器间cookie共享 setDomain(String path):设置一级域名相同,多个服务器之间cookie可共享 setDomain(“.baidu.com”),tieba.baidu.com和news.baidu.com中的cookie可以共享
- 特点 1.存储数据在客户端 2.浏览器对于单个cookie的大小有限制 以及 对一个域名下的总cookie数量也有限制
session技术
- 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中的HttpSession
* 获取HttpSession对象:
HttpSession session = request,getSession();
* 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name,Object value)
void removeAttribute(String name)
- session的实现是依赖于cookie的
- session被销毁 1.服务器关闭 2.session对象调用invalidate() 3.session默认失效时间 30min
- 特点 1.session用于存储一次会话的多次请求的数据,存在服务器端 2.session可以存储任意类型,任意大小的数据
<%@ page session = "flase"%> //默认是true
HttpSession session = request.getSession(false); //有session用session,没有session也不创建新的session
数据存储地址 | 数据大小 | 安全性 | |
---|---|---|---|
session | 服务器端 | 没有限制 | 安全 |
cookie | 客户端(浏览器端) | 有大小限制 | 相对不安全 |
JSP
概念:Java Server Pages:Java服务器端页面 即可以定义HTML标签,又可以编写Java代码
脚本:
jsp程序段:
<% 代码 %>:定义的Java代码,在service方法中,可以定义什么,该脚本中就可以定义什么
注意:
1)不能在jsp程序段中定义函数方法,也不能定义静态语句块
2)程序段中的大括号对可以跨多个程序段
3)程序段中的变量要先定义后使用
jsp声明:
<%! 代码 %>:定义的Java代码在jsp转换后的Java类的成员位置
注意:
1)jsp声明中定义的变量是网页级的,系统会优先执行
2)可以定义访问权限控制符,也可以定义方法,可以定义静态语句块
3)jsp声明中只能做定义,不能实现控制逻辑,|| 不能在其中使用out.print()做输出操作
jsp表达式:
<%= 变量/返回值/表达式 %>:结果输出到客户端,
注意:
1)不能以“ ;”结尾
2)不能出现多条语句
3)表达式中的内容一定是字符串类型,或者能够通过toString()函数转换成字符串的形式
没有写到<% %>中的代码均被解释为html 注释: html注释:只能注释html片段 < !-- --> jsp注释:可以注释所有内容 < %-- --%>
JSP内置对象
不需要创建和获取,可以直接使用的对象 一共有9个内置对象 out : 1.字符输出流对象。可以将数据输出到页面上。和response.getWritter()一样 2.对应用服务器上的输出缓冲区进行管理
out.print(); //输出后不换行
out.println(); //输出时换行,但在网页上不换行,网页上换行要用<br>
out.close(); //关闭输出流 强制终止当前页面的剩余部分向浏览器输出
out.flush(); //输出缓冲区中的数据
out.clear(); //清除缓冲区中数据,不把数据写到客户端去
out.clearBuffer(); //清除缓冲区中数据,并写到客户端去
int getRemaining(); //获取缓冲区中没有被占用的空间的大小
int getBufferSize(); //获取缓冲区大小
> response.getWritter()和out.write()区别:
> 在给客户端做出真正的响应之前,先找response缓冲区数据,再去找out缓冲区数据
> response.getWritter()数据输出永远在out.write()之前
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | pageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
session | HttpSession | 一次会话的多个请求 |
request | HttpServletRequest | 一次请求访问的多个资源(转发 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(servlet)的对象 |
out | jspWriter | 输出对象 |
config | ServletConfig | servlet的配置对象 |
exception | Throwable | 异常对象 |
JSP指令
- 作用:配置jsp页面,导入资源文件
- 格式: < %@ 指令名称 属性名1 = 属性值1 属性名2 = 属性值2.。。%>
- 分类:
- :配置jsp页面 => contentType:等同于response.setContentType() 1.设置响应体的MIME类型以及字符集 2.设置当前jsp页面的便码(低级开发工具要使用pageEncoding属性设置当前页面的字符集) => import:导包 => errorPage:当前页面发生异常后,会自动跳转到指定的错误页面 => isErrorPage:表示当前页面是否是错误页面 true:是错误页面,可以使用内置对象exception false:不是错误页面,默认值,不可使用内置对象exception
<%@ page pageEncoding = "utf-8" isErrorPage = "true"%>
<%@ import = "java.util.Date"%> //要调用exeception获取信息必须要先在page栏设置该页面是错误页面
<%@ errorPage = "/error.jsp"%>
<%
String message = exception.getMessage(); //获取错误信息
out.println(message); //输出错误信息
%>
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); //格式化时间
Date now = new Date();
out.println("now = "+sdf.format(now));
%>
-
:页面包含的,导入页面的资源文件 静态联编 <%@ include file = "hello.jsp %> 在编译的时候会被编译在一个文件的service方法中 想要两个文件数据不共享则不能定义相同的变量名 对于包含很多页面的系统或站点,很多页面的头部、尾部、或者左侧等部分都是相同的,为减少工作量,可以将相同的部分分别定义为多个页面,其他需要这些部分的页面我们就可以通过include将这些部分包含起来
-
: 导入资源 ,(标签库) <% taglib prefix = “c” uri =“htttp:/java.sun.com/jsp/jst1/core” %> prefix:前缀,自定义的
JSP动作
forward
<jsp:forward page = "/next.jsp"></jsp:forward>
include 动态联编
<jsp:include page = "/next.jsp"></jsp:forward>
两个文件编译之后生成两个.java,不能共享变量 若在两个文件之间需要共享同一变量,此时只能使用静态联编 若在两个文件之间存在同名变量,且不能混淆,此时只能使用动态联编
JDBC
-
概念: Java database connectivity、 Java数据库连接 实质:官方(sun公司)定义了一套操作所有关系型数据库的规则(接口),各个数据库厂商实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
-
步骤: 导入驱动jar包 复制jar包 右键-> Add As Library 注册驱动 获取数据库连接对象 Connection 定义sql 获取执行sql语句的对象 Statement 执行sql 接收返回结果 处理结果 释放资源
-
对象:
DriverManager:驱动管理对象
注册驱动
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
Class.forName("com.mysql.jdbc.Driver");
获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1" ,"root","010517");
localhost:本机
Connection:数据库连接对象
1.获取执行sql的对象
Statement createStatement()
PreparedStatement preparedStatement(String sql)
2.管理事务
开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
Statement:执行sql对象 1.执行sql
int executeUpdate(String sql):执行DML(insert,update,delete),DDL(create,drop)语句
返回值:影响的行数,可以通过影响的行数判断DML语句是否执行成功 >0则成功
ResultSet executeQuery(String sql):执行DQL(select)语句
ResultSet:结果集对象,封装结果
boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据)
如果是,则返回fal