JavaWeb基础(尚硅谷)
jerry
2020-11-19
JavaWeb基础(尚硅谷)
Servlet(尚硅谷)
Servlet技术
什么是Servlet
1.Servlet是JavaEE规范之一, 规范就是接口
2.Servlet是JavaWeb三大组件之一, 三大组件分别是Servlet程序, Filter过滤器,
Listener监听器
3.Servlet是运行在服务器上的java小程序, 可以接受客户端的请求, 并响应数据给客户
端
创建Servlet程序项目
创建一个类实现Servlet接口
WEB-INF/web.xml配置Servlet信息
新建一个Servlet工程模块(Tomcat, Web Application)
例
例
注意
<url-pattern>配置要以"/"开头, 一般以类名前一个单词配置访问地址
url地址定位
http://localhost:8080/servlet/hello
/servlet 工程路径
/hello 资源路径
Servlet的生命周期
1.执行Servlet构造器方法
2.执行init初始化方法
3.执行service方法
4.执行destroy
第一次访问, 创建Servlet程序会调用
每次访问都会调用
在web工程停止时调用
Servlet请求的分发处理
例
通过继承HttpServlet实现Servlet程序(原理)
在实际项目开发中, 都是使用继承HttpServlet类的方式实现Servlet程序
步骤
1.创建一个类继承HttpServlet类
2.重写doGet或doPost方法
3.到web.xml中配置Servlet程序的访问地址
自动实现了请求分发处理, 不需要自己写
IDEA菜单生成Servlet程序
new → Create Servlet
web.xml
<servlet>自动生成了, 还需要配置<servlet-mapping>
实现Servlet程序
Servlet类的继承关系
Serlvet接口
GenericServlet类
HttpServlet类
自定义的Servlet程序
ServletConfig类
ServletConfig类是Servlet程序的配置信息类
ServletConfig类的三个作用
1.获取程序的别名servlet-name的值
2.获取初始化参数<init-param>
3.获取ServletContext对象
servletConfig.getServletName()
servletConfig.getInitParameter("参数名")
servletConfig.
getServletContext()
其他
Servlet程序和ServletConfig对象都是Tomcat负责创建,
Servlet程序默认是第一次访问时创建, ServletConfig是每个Servlet程序创建时就
创建一个对应的ServletConfig对象
ServletContext类
ServletContext是一个接口, 表示Servlet上下文对象, 一个web工程只有一个
ServletConttext对象实例
什么是ServletContext
ServletContext是一个域对象(可以像Map一样存取数据的对象)
域对象
存数据: setAttribute()
取数据: getAttribute()
删除数据: removeAttribute()
ServletContext类的四个作用
1.获取web.xml中配置的上下文参数<context-param>
2.获取当前的工程路径, 格式: /工程路径
3.获取工程部署后在服务器硬盘上的绝对路径
4.像Map一样存取数据
getInitParameter("Param")
servletContext.getContextPath()
getRealPath("/")
Http协议
什么时HTTP协议
协议 : 指双方或多方约定好, 大家都要遵守的规则
HTTP协议, 指客户端和服务器之间通信时, 发送的数据, 需要遵守的规则
HTTP协议中的数据又叫报文
请求的HTTP协议格式
请求行
请求的方式
请求的资源路径[+?+请求参数]
请求的协议的版本号
GET
HTTP/1,1
请求头
key: value
组成
不同的键值对, 表示不同的含义
POST请求
请求行
请求头
请求体
===>>> 就是发送给服务器的数据
空行
提交内容格式
name=value&name=value
常用请求头
Accept:表示客户端可以接收的数据类型
Accpet-Languege:表示客户端可以接收的语言类型
Host:表示请求时的服务器ip和端口号
User-Agent:表示客户端浏览器的信息
结构
form标签是post请求
响应的HTTP协议
响应行
响应的协议和版本号
响应状态码
响应状态描述符
响应头
key: value
空格
响应体
结构
结构例
常见响应码
200
302
404
500
表示请求成功
表示请求重定向
表示请求服务器已经收到了, 但是请求地址错误(你要的数据不存在)
表示服务器收到请求, 但是服务器内部错误(代码错误)
MIME类型说明
MIME是HTTP协议中的数据类型, 格式是"大类型小类型", 并与某一种文件的扩展名
相对应
什么是MIME
Mupltipurpose internet Mail Extensions, 多功能Internet邮件扩充服务
常见MIME类型
超文本标记语言文本
普通文本
RTF 文本
GIF图形
JPEG图形
au声音文件
MIDI音乐文件
RealAudio音乐文件
MPEG文件
AVI文件
Gzip文件
TAR文件
.html ,.htm
.txt
.rtf
.gif
.jpeg,.jpg
.au
mid,.midi
.ra,.ram
.mpg,.mpeg
.avi
.gz
.tar
text/html
text/plain
application/rtf
image/gif
image/jpeg
audio/basic
audio/midi,audio/x-midi
audio/x-pn-realaudio
video/mpeg
video/x-msvideo
application/x-gzip
application/x-tar
HTTPServletResquest类
作用
每次有请求进入服务器, Tomcat服务器把HTTP协议信息解析好封装到Request对
象中, 传递到service方法(doGet和doPost)中给我们使用.
通过HttpServletRequest对象, 可以获取到所有请求信息
HttpSrevletRequest类常用方法
getRequestURI()
获取请求的资源路径
getRequsetURL()
获取请求的同意资源定位符(绝对路径)
getRemoteHost()
获取客户端的ip地址
getHeader()
获取请求头
getParameter()
获取请求的参数
getParameterValues()
获取请求的参数(多个值的时候使用)
getMethod()
获取请求的方式GET或POST
setAttribute(key, value)
设置域数据
getAttribute(key)
获取域数据
getRequestDispatcher()
获取请求转发对象
例
Servlet请求参数
获取请求的参数值
java
例
html
其他
解决post请求中文乱码
request
.setCharacterEncoding
("UTF-8");
请求的转发
什么是请求的转发
服务器收到请求后, 从一次资源跳转到另一个资源的操作叫请求转发
请求转发的特点
浏览器地址没有变化
是一次请求
共享Request域中的数据
可以转发到WEN-INF
不可以访问资源以外的资源
使用
注意
必须以"/"开头, 斜杆前路径为http://ip:port/工程名, 映射到web目录
例
Servlet1
1.request.setAttribute("key", "value");
2.RequestDispatcher reqd = request.getRequestDispatcher(/servler); //资源名
3.reqd.forward(request, respond)
Servlet2(接收)
request.getAttribute("key");
base标签作用
设置页面相对路径工作时参考的地址
Web中的相对路径和绝对路径
相对路径
.
当前目录
..
上一级目录
资源名
当前目录/资源名
绝对路径
http://ip:port/工程名/资源路径
web中
"/"
的不同意义
被浏览器解析是: http://ip:port
Web中的路径
被服务器解析: http://ip:port/工路径
特殊情况: response.sendRediect("/"), 发送给浏览器解析, 得到 http://ip:port
HTTPServletResponse类
作用
和HttPServletRequest类一样, 每次请求进来, Tomcat都会创建一个Response对
象传递给Servle程序使用
HttpServletResponse表示所有响应的信息, 可以设置返回给客户端的信息
输出流的说明
字节流
字符流
getOutStream()
getWriter()
常用于下载(传递二进制数据)
常用于回传字符串(常用)
两个流同时只能使用一个
两个流
往客户端回传字符串数据
例
请求重定向
客户端发送请求, 服务端叫客户端去新地址访问(之前的地址被废弃), 叫请求重定向
response.setStatus(302)
色湖之响应状态码302, 表示重定向(以搬迁)
response.setHeader("Location", "http://.....")
设置响应头, 说明新地址在哪里
重定向特点
实现
浏览器地址会发生变化
两次请求
不共享Request域中数据
不能web工程WEB-INF目录下的资源
可以访问工程外的资源
方案二(推荐使用)
response.sendRedirect(http://...)
方案一
书城项目
javaEE三层架构
视图层(Web层)
Service业务层
Dao持久层
1.获取请求参数, 封装成为Bean对象
2.调用Service层处理业务
3.响应数据给客户端, 请求转发, 重定向
1.处理业务逻辑
2.调用持久层保存到数据库
只负责跟数据库交互, CRUD操作 (Create, Read, Update, Delete)
客户端(浏览器)
http://ip:port/工程路径/资源路径
数据库
Mysql, Oracle, DB2, SqlServer
功能操作
相关技术
Servlet程序
Webwork
Strutus1.x
Strutus2.x
SpringMVC
相关技术
Spring框架
相关技术
JDBC
DbUtils
JdbcTemplate
Mybatis
Hiberante
JBA
功能操作
1.项目结构
2.搭建书城项目环境
分层作用
为了解耦, 降低代码的耦合度, 方便后期的维护升级
目录结构
web层
service层
com.bookstore.web/servlet/controller
com.bookstore.service
com.bookstore.service.impl
Service接口包
Service接口实现类
dao持久层
com,bookstore.dao
Dao接口包
com.bookstore.dao.impl
Dao接口实现类
实体bean对象
com.bookstore.entity/domain/bean
JavaBean类
测试包
com.bookstore.test/junit
工具类
com.bookstore.utils
3.创建数据库(user用户表)
sql
4.编写数据库对应的JavaBean对象
6.编写Dao持久层
5.编写工具类
JdbcUtils
user类: pojo/User.java
7.编写Service业务层
编写BaseDao
用Dbutils类实现数据库的增删查改功能
用Druid实现创建数据库Connection和close()功能
编写UserDao接口
规范UserDaoImpl实现类的方法
编写UserDaoImpl
最终实现User对象与数据库交互操作的类, 继承BaseDao, 实现UserDao接口
Druid
编写UserDaoTest测试类
测试UserDaoImpl类的功能是否正常
编写UserService接口
规范登录, 注册, 检查用户名等功能
编写UserServiceImple
实现UserService接口的功能
编写UserServiceTest测试类
测试
8.编写Web层
实现用户注册功能
用户输入, 提交(submit), 把参数发送给服务器, 注册保存
RegistServlet程序
1.获取请求的参数
2.检查验证码是否正确
3.检查用户名是否可用
4.调用Service保存到数据库
不正确跳回注册页面
正确跳到注册成功页面
JDBC
Tomcat(尚硅谷)
JavaWeb的概念
什么是JavaWeb
指所有通过Java语言编写的可以通过浏览器访问的程序的总称叫JavaWeb
基于请求和响应来开发的
请求是指客户端给服务器发送数据, 加请求Request
响应是指服务器给客户端回传数据, 叫响应Response
Web资源的分类
静态资源
动态资源
html, css, js, txt, mp4, jpg图片
jsp页面, Servlet程序
常用的Web服务器
Tomcat
Jboss
GlassFish
Resin
WebLogic
Apache提供的一种Web服务器, 提供对jsp和Servlet的支持, 他是一种轻量级的
JavaWeb容器(服务器)(使用最广泛)
遵从JavaEE规范的, 开放源代码, 纯Java的EJB服务器, 支持所有的JavaEE规范
Oracle开发的JavaWeb服务器, 商业服务器, 达到产品服务级, 应用很少
CAUCHO公司的产品, 是个非常流行的服务器, 对jsp和servlet提供良好的支持, 性
能也比较优良, 自身采用Java语言开发(收费, 应用较多)
Oracle的产品, 目前(收费服务器中)应用最广泛的Web服务器, 支持JavaEE, 适合大
型项目(收费, 用的不多, 适合大公司)
Tomcat的使用
安装
官网
目录
bin
存放可执行程序
conf
存放Tomcat服务器配置文件
lib
存放Tomcat服务器的jar包
logs
存放运行输出的日志
temp
存放运行是产生的临时数据
webapps
用来存放部署的Web工程
work
Tomcat工作时的目录, 存放运行时jsp翻译为servlet的源码, 和session的钝化(把对
象写到磁盘上)目录
启动
下载zip安装包并解压
1.执行bin目录下的startup.bat文件
测试Tomcat是否启动成功
http://localhost:8080
或真实ip:8080
startup.bat启动失败常见原因
java环境没有配置好
启动方式
2.用命令行窗口在bin目录下执行: catalina run
停止
停止方式
1.关闭Tomcat窗口或Ctrl+C
2.bin目录下的shutdown.dat
修改Tomcat的端口
conf目录下的server.xml
修改Connector标签的port属性, 重启Tomcat
部署Web工程到Tomcat
创建工程在Webapps目录下
方式一
方式二
在conf\Catalina\localhost 工程访问名.xml
配置 工程访问名.xml
< Context path="/工程访问名" docBase="工程目录路径"/>
如path="a"
localhost:8080/a 表示访问docBase目录下的工程
访问 : IP地址:8080/工程名
IDEA整合Tomcat服务
Setting→Build,Execution,Deployment→Application Servers
配置Tomcat安装路径
Run→Edit Configuration,添加Tomcat Server,
IDEA2020配置
创建动态web工程
创建好工程模块后, 右键Add Framework→勾选Web Application
动态Web工程目录简介
web
用来存放web工程的资源文件, html, css, js等
WEB-INF
受服务器保护的目录, 浏览器无法直接访问此目录的内容
web.xml
整个动态web工程的配置部署描述文件, 可以在这里配置很多web工程主件, 如
servlet, filter过滤器, Listener监听器, Session超时等
lib
存放 第三方jar包
在idea中部署工程到Tomcat运行
确认Deployment(部署)中有要部署的模块
JRE栏要设置个jdk目录
其他
Tomcat实例使用细节
Application context : 工程访问路径
frame deactivation(钝化)
可选择有修改时热部署(内容即使更新到页面)
钝化为金属的化学反应, 应该理解为框架内容"生锈了", 有更新了, 太久了, 中文没有
准确直译
Configuration 的Tomcat设置
XML(尚硅谷)
XML介绍
什么是XML
Extensible Markup Language可扩展标记语言
作用
可用于保存数据
作为项目或模块的配置文件
可以作为网络传输数据的格式(还是以JSON为主)
XML语法
直接举例
....
XML文档必须有根元素
根元素就是没有父标签的元素(顶级元素), 只能有唯一一个
XML的特殊字符
如"<"是< ">"是 >
<![CDATA[这里输入特殊字符]]>
例 : <![CDATA[<<<>>>]]>
XML解析
html和xml都是标记行文档, 都可以使用w3c指定dom技术来解析
需要知道的历史
JDK早期提供了两种解析技术, DOM和Sax(Simple API for XML)(都以过时)
第三方解析
jdom
dom4j
pull
在dom的基础上进行封装
在jdom的基础上又进行封装
主要用在Android开发, 跟sax类似, 都是事件机制解析xml文件
dom4j解析技术
dom4j官网(下载jar包, java文档)
例
使用
1.获得document对象
用SAXReader类 read()方法
创建一个SaxReader输入流, 读取xml文件,
2.通过Document对象获取根元素
getRootElement()
3.通过根元素获取指定标签对象
elements("标签名"), 返回List<Element>
4.遍历List, 将每个标签转换为java类
getText()获取标签中的文本内容
elementText("price")直接获取指定标签名的文本内容
attributeValue("sn"); 获取指定属性内容
asXML() 把标签对象. 转换为标签字符串
jsp(尚硅谷)
简介
什么是jsp
java server pages, java的服务器页面,是一种动态网页开发技术。它使用JSP标签在
HTML网页中插入Java代码
作用
代替Servlet程序回传html页面的数据(Servlet回传页面数据操作繁琐, 开发维护成
本高)
好像都说jsp过时了, 了解就行
jsp页面的本质
第一次访问jsp页面时, tomcat服务器会把jsp页面翻译成为一个java源文件, 并且对
他进行编译成.class字节码程序.
jsq头部的page指令
打开java源文件发现里面的内容, 跟踪源代码发现, HttpJspBase类, 直接地继承
HttpServlet, jsp翻译出来的java类, 简介继承了HttpServlrt, 也就是说, 翻译出来的
是一个Servlet
总结: jsp就是Servlet程序
page指令可以修改jsp页面中的一些重要的属性, 或者行为
language属性
contentType属性
pageEncoding属性
import属性
autoFlush属性
buffer属性
errorPage属性
isErrorPage属性
session属性
extends属性
属性
jsp中常用的脚本
表示jsp翻译后是什么文件, 暂时只支持java
表示jsp返回的数据类型是什么, 也是源码中的response.setContentType()参数值
表示当前jsp页面文件本身的字符集
表示java源代码中一样, 用于导包, 异类
设置当out输出流缓冲区满了之后, 是否自动刷新缓冲级区, 默认值是true
设置out缓冲区的大小, 默认是8kb
设置jsp页面运行时出错, 自动跳转去的页面路径
设置当前jsp页面是否时错误信息页面, 默认false, 如果是true可以获取默认信息
设置访问当前jsp页面, 是否会创建HttpSession对象, 默认是true
设置jsp翻译出来的java类默认继承谁
jsp常用的三种语法
声明脚本(极少使用)
格式: <%! 声明java代码%>
可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块, 内部类
练习
声明类属性
声明static静态代码块
声明方法
声明内部类
例
表达式脚本(常用)
格式: <%=表达式%>
作用: 在jsp页面上输出数据
特点:
练习
输出类型
输出浮点型
输出字符串
输出对象
所有的表达式脚本搜会本翻译成为out,print()输出到页面上
所有表达式脚本都会被翻译到_jspService方法中
哟与表达式脚本中翻译的内容都在_jspService()方法中, 所以_jspService()方法中
的对象都可以直接使用
例
代码脚本
格式: 代码脚本的格式 <%java语句%>
代码脚本的作用是: 可以在jsp页面中, 编写我们自己需要的功能(写的是java语句)
练习
代码脚本--if语句
代码脚本--for循环语句
翻译后java文件中_jspService方法内的代码都可以写
作用
特点
代码脚本翻译后都在_jspService方法中()
所有_jspSevice()方法中现有对象都可以直接使用
可以由多个代码脚本快组合完成java语句
代码脚本还可以和表达式脚本一起组合使用, 在jsp页面上输出数据
jsp中的三种注释
html注释
java注释
jsp注释
<%--能注释掉jsp页面中所有代码--%>
jsp内置对象
内置对象: 指Tomcat在翻译jsp页面成为Servlet源代码后, 内部提供九大对象
request
请求对象
response
响应对象
pageContext
jsp的上下文对象
session
会话对象
application
ServletContext对象
config
ServletConfig对象
out
jsp输出流对象
page
指向当前jsp的对象
九大对象
exception
异常对象
四个域对象
pageContext (PageContextImpl类)
request (HttpServletRequest类)
session (HttpSession类)
application (SevletContext类)
当前_jsp页面范围内有效
一次请求内有效
一个绘画范围内有效 (打开浏览器访问服务器, 知道关闭服务器)
整个web工程范围内部都有效(只要web工程不停止, 数据都在)
四个域对象功能都一样, 能像Map一样存取数据的对象, 不同的是他们对数据的存取
范围
有效范围例
scope.jsp
scope2.jsp
四个域对象
使用优先顺序(范围从小到大)
pageContext → request → session → application
out输出
response中表示响应, 用于设置返回给客户端的内容, out也是客户端输出使用的
例
jsp代码执行完后
执行out.flush()操作, 会把out缓冲区中的数据追加写入到response缓冲区末尾
然后会执行response的刷新操作, 把全部数据写个客户端
jsp翻译后, 底层源码都是使用out来进行输出, 所以统一使用out输出, 避免打乱页面
输出内容的布局
和response.getWriter()输出区别
执行过程
out.print()可以输出任意数据(最后还是转为字符串用write()输出)
out.write()可以输出字符串
深入源码, 浅出结论
在jsp页面中, 可以统一使用out.print()输出
jsp常用标签
静态标签
动态标签
一个页面
网站导航条, 菜单, 轮播广告, 用户登录信息, 天气信息,, 等等
页面主体内容
加入我们, 友情链接, 联系我们, 版权归属....等等
<%@ include file="/"%>
file属性指定要包含的jsp页面
"/"表示为http://ip:port/工程路径/
特点
静态包含不会翻译被包含的jsp页面
静态包含其实是被包含的jsp页面的代码拷贝到包含的位置执行输出
例
<jsp:include page="/"></jsp:include>
page 属性: 指定要包含的jsp页面的路径
特点
动态包含会把包含的jsp页面也翻译成java代码
main.jsp把自己的request, response, out对象传递给了footer.jsp页面去使用
JspRuntimeLibrary.include(request, response, "footer.jsp", out, false)
底层代码使用此方法调用被包含的jsp页面执行输出
例
动态包含还可以传递参数
例
请求转发
<jsp:forward page="scope2.jsp"></jsp:forward>
请求转发的使用说明
1.获取请求的参数(Servlet程序)
2.发sql语句到数据库去查询学生信息(Sevlet程序)
4.遍历查询到的结果输出给客户端, 显示(JSP程序)
3.保存查询到的学生信息到request域中, 请求转发到jsp程序
Listener监听器
什么是Listener
Listener监听器是JavaWeb的三大组件之一.JavaWeb三大组件分别是: Servlet程
序, Filter过滤器, Listener监听器
Listener是JavaEE的规范, 就是接口
监听器的作用是, 监听某件事务的变化, 然后通过回调函数, 反馈给客户(程序)去做一
些响应的处理
ServletContextListener监听器
监听Servlet对象的创建和销毁, ServletContextListener在web工程启动时创建, 在
web工程停止时销毁
两个方法
contextInitialized()
在ServletContext对象创建之后马上做初始化
contextDestroyed()
在ServletContext对象销毁时调用
使用步骤
1.编写一个类实现ServletContextListener
2.实现其两个回调方法
3.到web.xml配置监听器
EL(尚硅谷)
什么是EL表达式
Expression Language. 表达式语言
作用
替代jsp页面中的表达式脚本在jsp页面中进行数据的输出
比jsp表达式脚本要简介很多
格式
${表达式}
输出null值时时空串, jsp则会输出"null"字符串
搜索四个域的顺序
pageContext→request→session→application
注意:
session保存的数据在浏览器关闭后才销毁
例
从小到大的顺序
输出复杂的Bean对象
例
EL找的时getter方法, 不是属性
关系运算
${ 3==3 }
运算
逻辑运算
${ 22==22 && 12>11}
!=, > ,<, >=, <=
&&(与), ||(或), !(非),
算数运算
+, -, *, /, %
都是java的运算符
empty运算
判断一个数据是否为空(空对象)
${ empty "Str"}
三元运算
表达式 ? 值1 : 值2
点运算,中括号运算
${map.key}
${map[key.1]}
可以输出key值里含有特殊字符的值
EL的11个隐含对象
pageContext
可以获取jsp中的九大内置对象
pageScope
可以获取pageContext域中的数据
requestScope
可以获取Request域中的数据
sessionScope
可以或Session域中的数据
applicationScope
可以SevletContext域中的数据
param
获取请求参数的值
paramValues
获取请求参数的值, 获取多个值的时候使用
header
获取请求头的信息
headeValues
获取请求头的信息, 可以获取多个值的情况
cookie
获取当前请求的Cookie信息
intParam
可以获取在web.xml中配置的<context-param>的上下文参数
四个特定域中的属性
11个隐含对象
pageScope
requestScope
sessionScope
applicationScope
可以获取pageContext域中的数据
可以获取Request域中的数据
可以或Session域中的数据
可以SevletContext域中的数据
作用
选择性的输出域中的数据(而不是默认的搜索域顺序)
${session.key1}
PageContext
使用
协议
服务器ip
服务器端口
获取工程路径
获取请求方法
获取客户端ip地址
获取会话的id编号
例
其他隐含对象示例
${param}
获取所有url请求参数的值
${param.参数名}
http://ip:port/工程名/资源路径?参数名=值1&参数名2=值2
只获得参数值, (一个参数名有多个值用数组)
${paramValues.参数名[0]}
${header}
${header['User-Agent']}
获得请求头信息
${headerValues['User-Agent'][0]}
${cookie}
只获得值数组
${cookie.JSESSIONID.name}
获得cookie名称
${cookie.JSESSIONID.value}
获得cookie值
${initParam}
输出web.xml中<context-param>的上下文参数
${initParam.key值}
JSTL标签库
什么JSTL标签库
JSP Standard Tag Library, JSP标准标签库, 可以替换代码脚本, 使得jsp页面更加简
洁
五组标签库
核心标签库(重点)
格式化
函数
数据库(不使用)
XML(不使用)
使用步骤
1.导入jstl的jar包
maven依赖
2.使用taglib指令引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
set标签
可以往域里面保存数据
作用
属性
<c:set ></c:set>
scope属性
设置保存到那个域
默认值: pageContext
var
设置key
value
设置值
idea遇到问题
解决办法
无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://
java.sun.com/jstl/core]
参考
例
if标签
<c:if scope="request" var="key" test=""></c:if>
用来做if判断
test
教程里的例子
属性
<:choose>, <c:when>, <c:otherwise>
多路判断
例
otherwise标签表示剩下的情况
标签里不要使用html注释, 要使用jsp注释
注意
<c:forEach>标签
属性
begin
开始遍历的索引(默认0)
end
结束的索引
var
表示遍历的变量
遍历1到10
例
遍历Object数组
遍历Map集合
遍历List集合
根据标记文件中的tld或attribute指令,attribute items不接受任何表达式**
参考
解决办法
item
表示遍历的集合
step
表示遍历的步长值(每次遍历增加的索引)
varStatus
表示当前遍历到的数据的状态
getCurrent()
表示当前遍历到的数据
getIndex()
表示遍历的索引
getcount()
表示遍历的个数
isFirst()
当前数据是否是第一条
isLast()
当前数据是否是最后一条
getBegin()
getEnd()
getStep()
获取begin属性值
获取end属性值
获取step属性值
文件的上传下载
文件上传简介
用form标签, method=post请求
form标签的encType属性值需为multipart/form-data值
在form标签中使用input type=file添加上传文件
编写服务器代码(Servlet程序)接受, 处理上传数据
http协议内容
encType=mutipart/form-data : 表示提交的数据以多段的形式进行拼接, 然后以二
进制流形式发送给服务器
Content-Type
boundary : 表示每段数据的分隔符, 分隔符由浏览器随机生成
上传用到的类和方法
导入commons-fileupload.jar
需要依赖commons.io.jar, 所以要导入两个jar包
两个jar包常用的类
ServletFileUpload类
用于解析上传的数据
isMultipartContent()
判断上传的数据格式是否是多段的(不是的无法解析)
parseRequest()
解析上传的数据, 得到List<FileItem>(多个表单项)
isFormField()
判断当前表单项是否是普通表单项, 返回false是上传的文件类型
getFieldName()
获取表单项的name属性值
getString()
获取当前表单项的值
getName()
获取上传的文件名
write()
将上传的文件写到本地硬盘
FileItem
遇到的Http500错误
java.lang.ClassNotFoundExection
解决 : 把依赖的jar包放入Tomcat安装目录的lib里
文件下载实现
步骤
1.获取要下载的文件名
2.读取要下载的文件内容
4.把下载的文件内容回传给客户端
3.通过响应头告诉客户端返回的数据类型, 收到的数据是用于下载使用的
问题
右键New没有Create Servlet选项
解决: 在Project structure 里的Module里把src设为source路径
中文下载名乱码问题
URLEncoder.encode("中文名.jpg", "UTF-8")
url编码是把汉字转换成%xx%xx%xx的格式
Base64编解码操作
Chrome, IE解决
火狐解决
不同浏览器要用不同的编码适配, 加个判断是什么样的浏览器
判断是否是火狐浏览器
Cookie
什么是Cookie
Cookie是服务器通过客户端保存键值对的一种技术
客户端有了Cookie后, 每次请求都发送给服务器
每个Cookie的大小不能超过4kb
创建Cookie
步骤
1.创建Cookie对象
2.通知客户端添加Cookie
new Cookie("key", "value")
response.addCookie(Cookie)
例
获取Cookie
Servlet程序获取Cookie
getName()
获取key名
getValue()
获取Value值
CookieUtils类
获取指定cookie
Cookie值修改
方案一
1.创建key值同名的Cookie对象
2.调用response.addCookie(Cookie)
方案二
1.找到要修改的Cookie对象
2.调用setValue()方法赋予新的Cookie值
3.调用response.addCookie()通知客户端保存修改
4.例
注意
Cookie的value值不应包含空格或标点符号等特殊字符, 若使用二进制值可能需要
BASE64编码
Cookie生命控制
setMaxAge()
正确: 表示在指定的秒数后过期
负数(默认值-1): 浏览器关闭Cookie就会被删除
Cookie的path属性
过滤发送给服务器的Cookie
path属性: 发送请求地址在path路径子目录下的Cookie
response.setPath()
练习
免用户名登录
客户端
服务器
login.jsp页面
LoginServlet程序
获取正确用户名密码
把用户名保存为Cookie发送给服务器
Session
什么是Session
Session就是一个接口(HttpSession)
Session就是一个会话, 用来维护客户端和服务器之间的一种关系
每个客户端都有一个Session会话
Session 会话用来保存用户登录之后的信息
Session的创建和获取
request.getSession()
获取Session对象, 第一次调用会创建Session对像
isNew()
getId()
判断是否是刚创建的对象
获取会话的唯一id值
Session域中存储数据
request.getSession()
.getAttribute("key")
获取域中数据
request.getSession().
setAttribute("key", "value")
往域中保存数据
Session超时的控制
request.getSession().
setMaxInactiveInterval()
设置最长不活动时间(超时销毁), 单位秒, 如果设为负数则永不超时(不建议)
request.getSession()
.getMaxInactiveInterval()
获取超时时长
web.xml设置默认超时时长
例
session.invalidate()
让Session会话马上超时
浏览器和Session之间关联的技术
客户端没有Cookie
发送请求给服务器, 服务器getSession()创建Session对象, 创建Session对象的同时
都会创建Cookie, 且key永远时JSESSIONID, value值就是Session对象的id值 ,
setCookie响应给客户端
客户端有了Cookie后
每次请求都会把Session的id以Cookie的形式发送给服务器 → 服务器getSession
从一堆Session对象中找到创建好的Session(对应该客户端), 并返回
Filter
什么是Filter过滤器
JavaWeb三大组件之一(Servlet程序, Listener监听器, Filter过滤器)
Filter过滤器是JavaEE规范, 就是接口
作用: 拦截请求, 过滤响应
拦截常见应用
权限检查
日志操作
事务管理
......
Filter过滤器基本使用
Web工程下要有一个admin目录, 该目录的资源都是用户登录后才允许访问
要求
判断Session中是否包含有用户登录信息
判断是否登录
步骤
实现过滤方法doFilter()
Filter接口方法
doFilter()
用于拦截请求, 可以做权限检查
init()
destroy()
web.xml配置
用户登录和检查
步骤
编写一个类实现Filter接口
实现过滤方法doFilter()
配置web.xml
编写一个类实现Filter接口(javax.servlet)
访问拦截路径里的资源就会先运行doFilter()方法
LoginServlet
思路
访问拦截路径里的资源
doFilter()方法执行
判断username=null跳回登录界面(login.jsp)
username!=null继续执行访问资源
登陆界面发送用户名密码
正确, setSession("username"), 下一次访问资源时即可正常访问
错误, 跳回登录界面
Filter生命周期
1.构造器方法
2.init初始化方法
3.doFilter()方法
4.detroy销毁
web工程启动时执行
每次拦截请求时就会执行
执行web工程时执行
FilterConfig类
Filter过滤器的配置文件类
Tomcat创建Filter时, 会同时创建一个FilterConfig类, 包含Filter配置文件的配置信
息
获取去Filter过滤器的配置内容
获取filter-name
获取<Filter>里的<init-param>初始化参数
获取ServletContext对象
getFilterName()
getInitParameter()
getServletContext()
FilterChain多个过滤器执行细节
Chain(链条), FilterChain就是过滤器链, 多个过滤器执行
FilterChain.doFilter()
执行下一个Filter过滤器(如果有)
执行目标资源(如果没有)
多个Filte过滤器执行顺序
web.xml配置文件里谁先配置, 就谁先执行
如果是注解配置, 按类名字母顺序执行
特点
1.所有Filter和目标资源默认都在同一个线程中
2.多个Filter共同执行时, 都使用同一个Request对象
Filter的拦截路径
精确匹配
目录匹配
后缀名匹配
<url-pattern>/target.jsp</url-pattern>
<url-pattern>/admin/*</url-pattern>
<url-pattern>*.html</url-pattern>
JSON
什么是json
JavvaScript Object Notation, 一种轻量级(与xml比)的数据交换格式, 易于人阅读
和编写, 很多语言都提供了对json的支持
json的定义
json由键值对组成, 并且由花括号包围包围, 每个键由引号引起来, 键和值之间使用
冒号分隔 , 多组键值对之间用逗号进行分隔
例
json的访问
jsonObj.key1
json是一个对象, 其key相当于属性
json的两个常用方法
说明
JSON.stringiy()
JSON.parse()
把json对象转为字符串
把json字符串转换成为json对象
要操作json中的数据时, 需要json对象格式
在客户端于服务器之间进行数据交换的时候, 使用json字符串
例
JavaBean对象和json的相互转换
导入gson jsr包
Gson类方法
toJson()
JavaBean对象 转Json字符串
fromJson((str, 对象.class),)
Json字符串转对象
List集合于json的相互转换
List集合转json字符串
例
toJson()
json对象转List集合
1.编写一个类继承TypeToken(Gson提供的类)
例
2.fromJson(str, new TypeToken<List<Person>>(){}.getType())
map集合和json的相互转换
json对象转map集合
编写一个类继承TypeToken(Gson提供的类)或使用匿名内部类
例
fromJson()
map集合转json字符串
toJson()
AJAX
Asynchronous Javascript And XML(异步JavaScript和XML), 是一种创建交互式
网页应用的网页开发技术
ajax是一种浏览器通过js异步发起请求. 局部更新页面的技术.
什么是AJAX请求
Ajax请求示例
步骤
1.创建XMLHttpRequest
2.调用open()设置请求参数
4.调用send()发送请求
3.绑定onreadystatechange事件, 处理请求完成后的操作
获取服务器的响应
使用XMLHttpRequest对象的responseText或responseXML属性
onreadystatechange事件
每当readyState属性改变时, 就会调用该函数
readyState属性值
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接受
3: 请求处理中
4: 请求已完成, 且响应已就绪
status属性
200: "OK"
404: 未找到页面
当readyState==4并且status==200才调用
例
ajax.html
AjaxServlet.java
Ajax请求特点
Ajax请求的局部更新 浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容
jQuery中的Ajax请求
实际开发很少写原生Ajax代码, 一般通过jQuery或一些框架实现Ajax请求
$.ajax()方法
url
type
data
success
dataType
请求的地址
请求的类型, GET或POST
发送给服务器的数据
请求响应, 响应回调的函数
响应的数据类型
格式
key=value&key1=value1
{key:value}
$.get()和$.post()方法
常用数据类型: text, xml, json
例
1.url
2.data
是$.ajax()基础上的进一步封装
请求的url地址
3.callback
4.type
返回数据类型, 有xml,html, json, text, _default
载入成功时的回调函数
发送的数据
说明
要按顺序传这四个参数, post与get使用完全一样
例
参数
参数
$.getJSON()
参数
url
data
callback
请求的url地址
发送给服务器的数据
载入成功的回调函数
说明
比$.get()少了type参数, 使用方法一样
表单序列化 serialize()
获取表单中的所有表单项的内容, 并以name=value&name=value的形式进行拼接
$("#formId").serialize()
作用
可直接加载url后面,发送给服务器 注意url后面要有个"&"
i18n国际化(了解)
什么是i8n国际化
在不同的国家显示不同的语言, 但一般真的有国际化需求的公司采用的方案都是不
同国家单独创建不同的网页
Internationalization(国际化), 以i开头, n结尾, 中间有18个字母
国际化三素
Locale对象
Locale表示不同的时区, 位置, 语言
zh_CN
中国, 中文
en_US
英文, 美国
Properties属性配置文件
国际化配置文件命名规则
baseName_locale.properties
如 : i18n_zh_CN.proerties
ResourceBundle资源包
ResourceBundle.getBundle()
根据给定的baseName和Locale读取相应的配置文件, 得到文字信息
国际化基础示例
通过请求头实现国际化
使用JSTL标签库fmt实现国际化
例
1.使用标签设置Locale信息
<fmt:setLocale value="${param.locale}"/>
2.使用标签设置baseName
<fmt:setBundle basename="i18n" />
3. 使用标签输出国际化信息
<fmt:message key="username”/>
步骤
属性表示判断的条件(使用EL表达式输出)
Session销毁
Created With
MindMaster