- JavaEE
JavaSE标准版本、JavaME嵌入式、JavaEE动态网站
JavaEE三大核心技术:Servlet,Filter、Listener
动态页面都运行在服务器中。
1.1.1访问一个页面的过程
1.1.2动态页面和静态页面
静态页面:客户端得到的,与服务器上一致,灵活不足,速度快
动态页面:页面需要在服务器上运行,同一页面根据不同用户不同请求可以运行出不同的结果。很灵活但是效率低。
前后端分离:前端只负责页面,后端只负责数据
1.1.3Web容器-服务器程序
Web容器就是运行在服务器中,为用户提供Web页面服务的软件。
例如:Apache,tomcat,JBoss,IIS
1.1.4Tomcat容器
Tomcat是最常用的
bin:二进制的,可执行程序
start-up.bat 运行Tomcat服务器程序
shutdown.bat 关闭Tomcat
conf:配置文件
lib:库
logs:日志
temp:临时文件
webapps:部署Web应用的目录,里面放的是一个个的web项目
work:工作目录,放jsp文件运行的中间文件
1.1.5IDEA创建tomcat项目
Java:放Java代码
Resources:放资源文件,通常都是一些配置文件
webapp:放jsp的动态页面
WEB-INF:当前项目需要依赖的库
web.xml:当前项目的配置文件,给Tomcat用
1.2Servlet
就是运行在JavaWeb服务器容器中的一种类,实际上就是一个动态页面。
Servlet如何执行?需要有一个url来指向这个servlet。
1.2.1Servlet接口
如果一个类,想成为一个Servlet,必须实现Servlet接口。
- init
对Servlet进行初始化,当Servlet对象创建之后,只会执行一次
- service
响应客户端的请求,客户端每一次访问,service方法都会执行一次
- destroy
对Servlet进行销毁,Tomcat正常关闭时,执行一次
前三个方法称为Servlet的生命周期
- getServletConfig
获取Servlet配置
- getServeletInfo
获取Servlet信息
1.2.2实现一个Servlet
1.创建一个类
2.实现Servlet接口及方法
1.2.3配置Servlet的方法
1.web.xml
<!--配置一个Servlet-->
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.situ.demo0424.MyServlet</servlet-class>
</servlet>
<!--配置url映射-->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/my</url-pattern>
</servlet-mapping>
2.注解
Web3.0版本才开始支持注解
@WebServlet(“路径”)
1.2.4页面的跳转
1.请求转发
特点:
- 使用request对象进行请求转发
- 浏览器只发送一次请求。页面的跳转是发生在服务器内部的。
- 浏览器的地址栏不会发生变化,显示的还是第一次请求的地址。
- 多个页面共享同一对request和response对象,可以使用request在多个页面中进行数据的传递
2.重定向
特点:
- 使用response对象进行重定向
- Response向客户端发送302HTTP状态码,浏览器拿到指令后,找到location里面的地址,重新向这个地址发送请求。有两次请求。
- 浏览器的地址栏会发生变化
- 有两个的单独的请求,生成两对独立的request和response对象,因此不能使用request对象在两个页面中进行数据的传递。
3.如何选择页面跳转的方式呢?
1)如果页面之间没有数据需要共享,使用重定向
2)如果页面之间需要共享数据,使用请求转发
1.2.5HTTP请求方式
get、post、put、delete、head、options、trace
在HTTP servlet的service方法中,会根据不同的请求方式来调用不同的do方法。
- get
- 在浏览器的地址栏中直接输入网址,访问。
- 超链接的跳转
- 表单的默认提交方式也是get
- 使用ajax或前端框架,默认情况下也都是get请求。
- post
- 当表单的method设置为post时,表单的提交就变成了postqin请求
- 当使用ajax或前端框架,设置了请求方式为post。
- get和post的区别
- get的参数是使用?&拼接在URL后面
post的参数放在HTTP请求的数据域中
- get的参数必须是字符串
post的参数可以是字符串,也可以是二进制。可以上传文件。
- get参数的长度是有限的,受浏览器url的限制。不同的浏览器url长度限制不一样
post的参数是没有限制的,只要服务器允许
- get相对不安全,post相对安全
1.2.6 Session
session是会话,它是一种请求保持技术。
请求保持:客户端浏览器,向服务器发出多次请求,服务器可以分辨出这是一个用户
- cookie
默认情况,cookie的有效时间会到会话结束(浏览器关闭)。
当设置了cookie的有效时间,即使关闭了浏览器,下次打开时依然有效。
服务器让客户端保存cookie:
服务器读取来自客户端的cookie:
- session
一个客户端与服务器之间在一段时间里连续多次的请求。
session将数据保存在服务器的内存中。
保存在session:
读取session:
session底层还是依赖cookie,更安全,把用户的信息都保存在了服务器当中。
session的常用方法:
setAttribute(属性名,属性值); 向session中保存一个属性值
getAttribute(属性名); 获取session中的指定属性
removeAttribute(属性名); 删除session中的指定属性
invalidate(); 销毁session对象,让session消失
session失效的三种形式
- 客户端的浏览器关闭,会导致Session失效。
因为sessionid,这个cookie的有效期就是浏览器的关闭。
- 服务器调用了session.invalidate(),原来的session对象就被销毁。
- 客户端与服务器之间,长时间没有请求。Session会超时过期。Tomcat下默认时间是30分钟。
- Cookie与sesion
- cookie的数据是保存在客户端浏览器中的,Session的数据是保存在服务器的内存中
- Cookie只能保存字符串的数据,Session可以保存对象
- Cookie安全性比较低,session安全性高一点。
- token
采用加密技术,将用户信息进行加密。以cookie的方式交给用户。
服务器拿到token时,通过解密算法就可以直接得到用户的信息。
1.3JSP
1.3.1什么是JSP
Java Server Page:用Java写的运行在服务器的页面。
JSP与Servlet一样,都是一种动态页面。
在Servlet中写HTML会很麻烦,JSP提供一种同时进行Java和前端代码编写的方式。
1.3.2Java的语法
前端代码
- 指令标签
<%@标签名 属性 = “值” %>
- page
作用:配置当前JSP页面的属性
Language:配置当前jsp采用的内嵌语言类型,通常就是Java
contenType:设置当前页面的内容类型,“text/html;charset=UTF-8” 相当于response.setContextType();
pageEncoding:设置页面的保存格式
import:引入外部的类,相当于Java中的import关键字
isErrorPage:当前的JSP是不是一个错误处理页面。可以使用exception对象
errorPage:当前页面的错误处理页面,当当前页面抛出异常时,由哪个页面进行处理
- include
作用:静态地引入外部的页面。
会在JSP页面进行翻译时,将外部页面的代码直接复制过来。
- taglib
作用:引入JSP的自定义标签库
JSTL中会用到
language:设置语言,通常为Java
contentType:
- 动作标签
<jsp:标签名 属性=”值”></jsp:标签名>
- forward
作用:在jsp页面中进行请求转发
- include
作用:动态的引入外部的页面
在jsp页面执行时,嵌入另一个jso页面执行的结果
- param
作用:可以在forward和include内部传递参数。
<div>${param.username}</div>
- 内嵌Java代码
- Java代码片段
<%
可以像在Java方法中编写Java代码
%>
- 输出表达式
将表达式的值输出到JSP页面中
<%=Java表达式%>
- 声明片段
<%!
可以像在Java类中一样编写代码
%>
1.3.3九大内置对象和四大作用域
1.九大内置对象(JSP的隐含对象)
在JSP中,不需要声明,不需要定义,就可以直接使用的对象
- request
请求对象,HttpServletRequest类型的
提供来自客户端的数据:url、参数、客户端操作系统、浏览器、IP
获取服务器的信息:获取session,……
request.setAttribute(属性名,值)
request.getAttribute(属性名)
request.removeAttribute(属性名)
- response
响应对象,HttpServletResponse类型的
向客户端返回数据
- session
会话对象,HttpSession类型的
表示一个客户端与服务器一段时间内的多次请求
session.setAttribute(属性名,值)
session.getAttribute(属性名)
session.removeAttribute(属性名)
- application
应用对象,ServletContext类型的,Servlet的上下文。
应用对象代表的就是当前的一个项目。在当前项目的所有页面中都可访问到这一个application对象
App.setAttribute(属性名,值)
App.getAttribute(属性名)
App.removeAttribute(属性名)
- page
表示是当前的JSP页面。相当于this
- pageContent
表示当前页面的上下文,可以获取其他的8个内置对象
- config
表示当前页面的配置信息。相当于Servlet的config
- out
输出对象,可以向当前的JSP页面中输出信息。
Write() 输出的数据不能是null,如果为null则抛出空指针异常。
append()
println()
- exception
异常对象,用来表示上一个页面抛出的异常。
只存在于错误处理页面当中,也就是page的isErrorPage设置为true的页面。
2.四大作用域
九大内置对象作用范围
- Page作用域-页面作用域
范围是当前的JSP页面,页面发生变化,对象就会失效
对象:paeg、pageContext、config、out、exception
- Request作用域-请求作用域
范围是一次请求,请求结束后对象就会失效。
对象:request对象、response对象
- Session作用域-会话作用域
范围是当前会话。
对象:Session对象
- Application作用域-应用作用域
应用作用域是范围最大的作用域,在整个项目中都有效。
对象:Application对象。
- JSP的需要编译,Tomcat必须知道JDK安装在哪里,必须配置JAVA_H0ME变量。
- JSP翻译和编译的中单文件在哪?
JSP会被翻译成一个Java的类,继承自HttpJspBase,又继承自
九大内置对象就是JSP翻译后的类中的jspService方法的参数和局部变量。
1.3.5EL表达式
1.express language表达式语言
向JSP页面中输出内容:
- Out对象
- 输出表达式<%=表达式%>
语法
${属性}
EL表达式,也是向页面中输出内容,写法更加的简单。
${对象,属性}
底层实际上是调用对象的get方法。
${集合[下标]}
2.EL表达式的隐含对象
pageScope
requestScope
sessionScope
applicationScope
param
cookie
当没有使用隐含对象时,优先从request中获取属性,如果取不到再去session中取,如果还没有,再去Application中取。如果都没有则什么都不输出。
1.3.6JSTL
JSP的标准
想查询一下所有的项目信息,并且显示出来
在JSP中内嵌Java代码会让页面结构很复杂
- 先引入包
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
放到pom.xml文件中
- 在JSP页面中,引入JSTL
- JSTL模块
- Core:核心模块,提供逻辑处理
- Fmt:format,格式化模块,提供日期、数字格式化方式
- Functions:函数模块,提供了常用的函数
- xml:xml格式的模块。基本不用
- sql:sql语句的模块。基本不用
1.4Servlet+JSP项目实现
1.4.1设计时,从上往下
1.4.2实现时,从下往上
1.数据库
根据功能创建好相应的数据表
2.实体类
entity包下的类
1)实体类名与数据表名一致。
2)实体类的属性与数据表的字段一致。
名字要一样
数据类型要匹配:不要使用基本数据类型,而是使用包类
时间类型->java.util.Date;decimal-> BigDecimal
3)封装:属性私有化,提供公共的Get和Set方法,lombok
4)实体类应该有无参构造方法(给反射创建对象),toString(方便打印)
3.持久层
1)定义持久层的接口
规定需要实现的方法,也就是对数据库的操作。
2)实现持久层的接口
定义类实现Dao层的接口,添加需要实现的方法。
声明DBUtil属性,帮助操作数据库。(合成复用)。
实现每一个方法:编写SQL,调用DBUtil的方法(增、删、改调用update、查调用query、queryOne)。
4.业务逻辑层
1)定义业务层的接口
规定需要实现的方法,具体操作业务、业务流程。
2)实现业务层的接口
定义类实现service层接口,添加需要实现的方法。
声明Dao层的接口对象,调用数据库的操作
实现每一个方法:1.参数验证;2.访问数据库;3.逻辑处理。
5.控制层
1)定义Servlet。
配置Servlet对应的路径。
2)实现doGet和doPost方法。
3)为了让一个Servlet能够处理多个操作,这些操作应该都是面向同一功能的。利用反射封装了一个BaseServlet类,根据action参数的值调用不同的方法。
4)添加Service层的属性
5)实现具体的方法
1.参数获取:request.getParameter(“参数名”)
2.调用业务(Service层)
3.返回数据(跳转页面):请求转发(request传递数据),重定向。
6.视图层
1)显示数据的页面
表格,JSTL+EL
2)提供操作的页面
表单,action提交的页面,method一般为post。
1.5Ajax
Ajax(Asynchronous异步的)使用JS和XML实现的异步请求。
XML:传递数据的格式,可扩展的标签语言
表示一个学生:tom,18岁
<student>
<name>tom<name>
<age>18<age>
</student>
JSON:一种更加简洁的数据格式,使用键值对表示数据
表示学生:tom,18
{“name”:”tom”,”age”:18}
1.5.1客户端JS
使用jQuery的ajax方法。
$.ajax();
$.get();
$.post();
$.ajax({参数});
核心参数:
1.url
Ajax请求的路径。
2.data
传递的参数,也是一个JS的对象
3.type
请求方式:get、post、put、delete。。。
4.dataType
url返回的数据格式,可以是xml,json,html。。。
5.success
请求返回成功时的回调函数,服务端返回了dataType对应的格式的数据。
函数的参数就是返回的数据。
6.error
请求失败时的回调函数
$.ajax({
url:’dept.action’,
data:{id:1},
type:’get’,
datatype:’json’,
success:function(result){},
error:function(){}
})
1.6 Filter
1.6.1Filter
1.6.2 Filter接口
init:过滤器进行初始化
dofilter:对请求进行过滤操作
放行 FilterChain.doFilter() 执行过滤器链中的其他的过滤器。
拦截
destroy:过滤器进行销毁
实现一个Filter
1.创建一个类,实现Filter接口
2.配置Filter
1)
2)注解:@WebFilter
1.6.3Filter应用场景
1.用户登录过滤
2.给所有页面添加编码的处理
给Request和Response对象添加编码的处理。
客户端传递的参数:
客户端返回的数据:
1.7Listener
1.7.1什么是Listener?
监听器
监听三个对象:Request对象、Session对象、Application对象
监听他们的生命周期:创建、销毁
监听他们的属性变化:setAttribute,removeAttribute
1.7.2六个接口
1.Request
ServletRequestListener 生命周期
requestInitialized:Request对象初始化完成
requestDestroyed:Request对象销毁完成
ServletRequestAttributeListener 属性变化
attributeAdded:添加属性setAttribute
attributeReplaced:修改属性setAttribute
attributeRemoveed:删除属性removeAttribute
2.Session
HttpSessionListener 生命周期
sessionCreated:Session对象创建
HttpSessionAttributeListener 属性变化
attributeAdded:添加属性setAttribute
attributeReplaced:修改属性setAttribute
attributeRemoveed:删除属性removeAttribute
3.Application
ServletContextListener 生命周期
Servlet