JavaWeb | 3 JavaWeb基础
XML 入门
简介
EXtensible Markup Language:可扩展标记语言
- 编写XML就是编写标签,与HTML非常类似,扩展名.xml
- 良好的人机可读性
hr.xml
<employee>
<name>张三</name>
<age>31</age>
<height>178</height>
</employee>
用途
XML文档语法规则
- 第一行必须是XML声明
- 有且只有一个根节点
- XML标签的书写规则与HTML相同
XML声明
说明XML文档的基本信息,包括版本号与字符集,写在XML第一行
<?xml version="1.0" encoding="UTF-8"?>
版本号:1.0
字符集:UTF-8,用于支持中文
XML标签书写规则
- 合法的标签名
<shop-cart><item>相册</item></shop-cart>
- 适当的注释与缩进
- 合理使用属性
- 处理特殊字符
- 特殊字符
标签体中,出现 “<
", ">
"特殊字符,会破坏文档结构。
解决方案:-
使用实体引用:XML支持五种
-
使用CDATA标签( 指,不应由XML解析器进行解析)
<![CDATA[......]]>
-
- 特殊字符
- 有序的子元素
在XML多层嵌套的子元素中,标签前后顺序应保持一致。
XML语义约束:DTD与XML Schema
XML文档结构正确,但可能不是有效的。语义约束:规定XML文档中允许出现哪些元素。有以下两种定义方式。
DTD
Document Type Defifnition,文档类型定义:一种简单易用的语义约束方式。文件扩展名.dtd
DTD 定义节点
可定义XML文档中允许出现的节点及数量,以hr.xml
为例:
- 定义节点:
/* 定义hr节点下只允许出现1个employee子节点 */
<!ELEMENT hr (employee)>
/* employee节点下必须包含以下四个节点,且按顺序出现 */
<!ELEMENT employee (name,age,salary,department)>
/* 定义name标签只能是文本,#PCDATA代表文本元素 */
<!ELEMENT name (#PCDATA)>
- 定义节点数量:如果子节点需要多次重复出现,则需要在子节点后增加相应的描述符
/* hr节点下最少出现1个employee子节点 */
<!ELEMENT hr (employee+)>
/* hr节点下可出现0……n个employee子节点 */
<!ELEMENT hr (employee*)>
/* hr节点下最多出现1个employee子节点 */
<!ELEMENT hr (employee?)>
XML引用DTD文件
使用!DOCTYPE>
标签,书写格式 <!DCOCTYPE 根节点 SYSTEM "dtd文件路径">
<!DCOCTYPE hr SYSTEM "hr.dtd">
XML Schema
- 比DTD更复杂,提供了更多功能
- 提供了数据类型、格式限定、数据范围等特性
- 是W3C标准
DOM文档对象模型
Dom4j与XPath表达式
Dom4j
- 一个易用、开源的库,用于解析XML。应用于Java平台,性能优异、功能强大、极其易使用
- 将 XML 视为
Document
对象 - 将 XML标签 定义为
Element
对象
利用 Dom4j 遍历 XML
略
利用 Dom4j 更新 XML
略
XPath
- XPath 路径表达式是 XML 文档中查找数据的语言
- 可极大提高在提取数据时的开发效率
- 本质是掌握各种形式表达式的使用技巧
XPath 基本表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
XPath 基本表达式案例
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点 |
/bookstore | 选取根元素bookstore |
bookstore/book | 选取 bookstore 的子元素的所有 book 元素 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置 |
bookstore//book | 选取 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置 |
//@lang | 选取名为 lang 的所有属性 |
XPath 谓语表达式
路径表达式 | 结果 |
---|---|
bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素 |
bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
bookstore/book[positipon() < 3] | 选取最前面的两个属于 bookstore 子元素的 book 元素 |
//title[@lang] | 选取拥有名为 lang 的属性的 title 元素 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为eng的 lang 属性 |
bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值需大于 35.00 |
bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值需大于 35.00 |
Jaxen介绍
- 一个Java编写的开源的XPath库。适应多种不同的对象模型,包括 DOM、XOM、Dom4j 和 JDOM
- Dom4j 底层依赖 Jaxen 实现 XPath 查询
- 下载地址:jaxen.codehaus.org
Servlet 入门
Broswer-Server(B/S)模式
软件结构发展史
- 单机时代:桌面应用
- 联机时代:Client-Server模式(C/S结构),即,客户端和服务器结构
- 优点:数据方便共享,安全性高
- 缺点:必须安装客户端,升级与维护困难
- 互联网时代:Broswer-Server模式(B/S结构),即,浏览器和服务器架构
- 优点:开发简单,无需安装客户端,数据易于共享
- 缺点:相较于C/S模式,执行速度与用户体验相对较弱
B/S模式执行流程
请求与响应
- 请求 Request :从浏览器发出给服务器的数据包
- 响应 Response :从服务器返回给浏览器的结果
J2EE
- Java 2 Platform Enterprise Edition:Java 2 企业版
- B/S 模式开发 Web 应用是 J2EE 最核心的功能
- J2EE 由 13 个功能模块组成
Apache Tomcat
- Apache 软件基金会旗下一款免费的开放原代码的 Web 应用服务器程序
- 是运行 Servlet (服务器小程序) 的容器
- J2EE 与 Tomcat 的关系
- J2EE 是一组技术规范与指南,具体实现由软件厂商决定
- Tomcat 是 J2EE Web(Servlet与JSP)标准的实现者
- J2SE是J2EE运行的基石,运行 Tomcat 离不开 J2SE
Servlet
- Server Applet,服务器小程序:用于生成动态 Web 内容
- 是 J2EE 最重要的组成部分
- Tomcat 提供硬件基础
- Servlet 提供软件实现
Servlet 开发技巧
标准Java Web工程结构
组织结构 | 描述 |
---|---|
tomcat安装目录/webapps/ | Tomcat应用根目录 |
/web应用目录/ | Java Web应用目录 |
/web应用目录/index.html .jsp | 默认首页 |
/WEB-INF | WEB应用的安全目录,用于存放配置文件 |
/WEB-INF/web.xml | web.xml 是“部署描述符文件”,是该Web项目核心配置文件 |
/WEB-INF/lib | 用于存放web应用依赖的jar文件 |
/META-INF/MANIFEST.MF | 包含Web应用的版本等信息 |
Servlet 开发步骤
- 创建Servlet类,继承HttpServelet
- 重写service方法,编写程序代码
- 配置web.xml,绑定URL
Servlet访问方法
- http://IP地址:端口/context-path/url-mapping
- 远程访问使用IP地址,本地访问localhost(127.0.0.1)
- context-path成为“上下文路径”,默认为工程名
请求参数
- 指浏览器通过请求向 Tomcat 提交的数据
- 通常是用户输入的数据,待 Servlet 进行处理
- 参数名1=值1
&
参数名2=值1&
参数名n - Servlet 接收请求参数
request.getParameter()
:接收单个参数request.getParameterValues()
:接收多个同名参数
Get 与 Post 请求方法
只是传输方式不同,数据内容是相同的:
-
Get:将数据通过在 URL 附加数据显性向服务器发送数据
http://localhost:8080/FirstServlet/sample?name=zhangsan
,加?区分url与参数 -
Post:将数据存放在请求体中隐性向服务器发送数据
http://localhost:8080/FirstServlet/sample
service
是请求处理的核心方法,无论是get或者是post都会被service()方法处理
Get与Post处理方式
- 所有请求:
service()
方法 - Get请求:
doGet()
方法 - Post请求:
doPost()
方法
Get与Post应用场景
- Get:不包含敏感信息的查询功能
- Post:安全性较高的功能、服务器的“写”操作,如,用户登录、用户注册、更新公司账目
Servlet 执行原理
Servlet 生命周期
- 装载 - web.xml
- 创建 - 构造函数
- 初始化 - init()
- 提供服务 - service()
- 销毁 - destroy()
使用注解简化配置
- Servlet 3.x 之后引入了“注解Annotation”特性
- 用于简化Web应用程序的配置过程
- Servlet核心注解:@WebServlet(有且只有一个)
启动时加载 Servlet
- web.xml使用
<load-on-startup>
设置启动加载 -
<load-on-startup>0~9999</load-on-startup> 0 的优先级最高
- 启动时加载在工作中常用于系统的预处理
具体使用方法:
创建新HttpServle
t类,并重写init()
方法。并选择以下方法中的一种进行配置:
- 在.xml文件中配置
<servlet> <servlet-name>create</servlet-name> <servlet-class>com.imooc.servlet.CreateServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> 由于不需要提供服务,在此不需要绑定 URL
- 使用注解
@WebServelet(urlPatterns="/unused",loadOnStartup=2) //优先级为2 public class AnalysisServlet extends HttpServlet{ @Override public void init() throws ServletException { 方法体; } }
JSP 入门
Servlet 的缺点
- 静态 HTML 与动态 Java 代码混合在一起,难以维护
- Servlet 利用
out.println()
语句输出,开发效率低下 - Eclipse 很难在开发过程中发现错误,调试困难
JSP 简介
Java Server Page,Java服务器页面:是J2EE 的功能模块,由 Web 服务器执行。作用是降低动态网页开发难度。
JSP 特点
- 使用简单,短时间学习便可上手使用
- 可将 Java 代码与 HTML 分离,降低开发难度
- 本质是 Servlet
JSP 运行要求
- 可正常运行的 Tomcat
- 所有 JSP 页面扩展名必须是 .jsp
- JSP 页面应放在 Web 应用程序目录下
JSP 基本语法
按功能分为以下四种:
- JSP代码块
- JSP生命构造块
- JSP输出指令
- JSP处理指令
JSP 代码块
- 用于在JSP中嵌入Java代码
- 语法:
<% Java代码 %>
<% System.out.println("Hello World!"); %>
JSP 声明构造块
- 用于声明变量或方法
- 语法:
<%! 声明语句 %>
<%! public int add(int a, int b){return a+b}; %>
JSP 输出指令
- 用于在JSP页面中显示Java代码执行结果
- 语法:
<%= Java代码 %>
<%= "<b>" + name "</b>" %>
JSP 处理指令
- 用于提供JSP执行过程中的辅助信息
- 语法:
<%@ JSP指令 %>
<%@ page import="java.util" %>
- 常用处理指令:
<%@ page %>
:定义当前JSP页面全局设置<%@ include %>
:将其他JSP页面与当前JSP页面合并<%@ taglib %>
:引入JSP标签库
JSP中注释的区别
<%-- 注释 --%>
:JSP注释//、/*...*/
:用于注释<% %>
Java代码,被注释代码不执行<!-- html -->
:HTML 注释,被注释的语句不会被浏览器解释
Servlet 与 JSP 进阶
Java Web 核心特性
HTTP 请求与响应
- HTTP请求的结构:包含三部分:请求行、请求头、请求体。(巧用请求头可开发多端应用)
- HTTP响应的结构:包含三部分:响应行、响应头、响应体
HTTP 常见状态码
状态码 | 错误描述 |
---|---|
200 | 服务器处理成功 |
301、302 | 请求重定向 |
400 | 无效的请求 |
401 | 未经过授权 |
403 | 服务器拒绝访问 |
404 | 无法找到文件 |
500 | 内部服务器错误 |
503 | 服务器超负载或正在停机维护,无法处理请求 |
ContentType的作用
决定浏览器采用何种方式对响应体进行处理
MIME类型 | 描述 |
---|---|
text/plain | 纯文本 |
text/html | HTML文档 |
text/xml | XML文档 |
application/x-msdownload | 需要下载的资源 |
image/jpeg image/gif image/… | 图片资源 |
请求转发与重定向
多个 Servlet (JSP) 之间跳转有两种方式:
request.getRequestDispatcher().forward()
:请求转发。服务器跳转,只会产生一次请求response.sendRedirect()
:响应重定向。浏览器端跳转,会产生两次请求。
设置请求自定义属性
请求允许创建自定义属性
- 设置请求属性:
request.setAttribute(属性值,属性名)
- 获取请求属性:
Object attr = request.getAttribute(属性名)
浏览器 Cookie
- 是浏览器保存在本地的文本内容
- 常用于保存登录状态、用户资料等小文本
- 具有时效性,Cookie内容会伴随请求发送给Tomcat
Session 用户会话
- 用于保存与“浏览器窗口”对应的数据
- 其数据存储在 Tomcat 服务器的内存中,具有时效性
- 通过浏览器的 Cookie 的 SessionId 值提取用户数据
Session 常用方法
request.getSession()
:获取Session对象get/set/removeAttribute()
:获取/设置/删除Session属性setMaxInactiveInterval
:设置Session超时时间
Session 的原理
Servlet 核心对象
ServletContext
Servlet上下文对象,是Web应用全局对象。
- 一个Web应用只会创建一个ServletContext对象
- ServletContext随着Web应用启动而自动创建
Java Web 三大作用域对象
HttpServletRequest
:请求对象HttpSession
:用户会话对象ServletContext
:web应用全局对象
Web应用的中文乱码由来
Tomcat默认使用字符集ISO-8859-1,属于西欧字符集。解决乱码的核心思路是将ISO-8859-1转化为UTF-8。Servlet中请求与响应都需要设置UTF-8字符集。
web.xml 常用配置
- 修改web应用默认首页
- Servlet 通配符映射及初始化参数
- 设置404、500等状态码默认页面
JSP 九大内置对象
内置对象 | 描述 | 名称 |
---|---|---|
request | 请求对象 | HttpServletRequest |
response | 响应对象 | HttpServletResponse |
session | 用户会话 | HttpSession |
application | 应用全局对象 | ServletContext |
out | 输出对象 | PrintWriter |
page | 当前页面对象 | this |
pageContext | 页面上下文对象 | PageContext |
config | 应用配置对象 | ServletConfig |
exception | 应用异常对象 | Throwable |
Tomcat常用配置
- 修改Web应用端口号
- 修改ContextPath上下文路径
- 设置应用自动重载
Java Web打包与发布
- 采用 war 包进行发布
- 发布路径为 {TOMCAT_HOME}/webapps
- Eclipse 支持 war 包导出
JSTL 与 EL 表达式
EL的表达式
Expression Language,表达式语言:用于简化JSP的输出。
基本语法
${表达式}
<h1>学生姓名: ${student.name}</h1>
作用域对象
EL表达式内置四种作用域对象。
忽略书写作用域对象时,EL则按作用域从小到大依次尝试获取。
作用域对象 | 描述 |
---|---|
pageScope | 从当前页面取值 |
requestScope | 从当前请求中获取属性值 |
sessionScope | 从当前会话中获取属性值 |
applicationScope | 从当前应用中获取全局属性值 |
EL表达式输出
${title}
${requestScope.student.name}
${emp.salary + 300}
${1 <= 3 && 2 > 4}
输出参数值:EL内置param
对象来简化参数的输出。语法${param.参数名}
JSTL标签库
JSP Standard Tag Library,JSP 标准标签库:用于简化JSP开发,提高代码的可读性和可维护性。
JSTL 由 SUN(Oracle) 定义规范,由Apache Tomcat 团队实现。
JSTL标签库种类
按功能可分为5类
类别 | 库名 |
---|---|
核心标签库 | core |
格式化输出标签库 | fmt |
SQL操作标签库 | sql |
XML操作标签库 | xml |
函数标签库 | functions |
JSTL核心库
下载:http://tomcat.apache.org
JSTL v1.2.5 组件介绍:
作用域对象 | 描述 |
---|---|
taglibs-standard-spec-1.2.5.jar | 标签库定义包(必须) |
taglibs-standard-impl-1.2.5.jar | 标签库实现包(必须) |
安装:
- 将Jar文件复制到工程的
WEB-INF/lib
目录(推荐) - 将Jar文件复制到Tomcat安装目录的
lib
目录
引用:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL核心标签库在taglibs-standard_impl.jar由META-INF/c.tld定义
判断标签:
<c:if>
:单分支判断<c:choose>
、<c:when>
、<c:otherwise>
:多分支判断
遍历集合:
<c:forEach>
:用于遍历集合中的每一个对象
<c:forEach var="p" items="${persons}" varStatus="idx">
第${idx.index + 1}位 <br>
姓名:${p.name} 性别:${p.sex} 年龄:${p.age}
</c:forEach>
fmt 格式化标签库
URL:http://java.sun.com/jsp/jstl/fmt
- 格式化日期标签
<fmt:formatDate value = "" pattern = ""/>
- 格式化数字标签
<fmt:formatNumber value = "" pattern = ""/>