后端基础
一、JavaWeb发展史(了解)
-
Servlet:Java程序输出HTML+CSS+js
-
→ JSP :HTML嵌入Java程序(本质——翻译成Servlet
(3P)ASP PHP JSP -
→ 规范开发模型 MVC设计模式
vue层(用户可见html+css+js)+controller层(提交至该层)+model层(操作数据库后返回给c-v) -
→ modelⅠ模型 JSP+JavaBean(封装数据entity+封装业务Dao)
( JavaBean有属性有方法的类——拆开——entity+Dao)
vo与用户关联的对象 po与数据库关联的对象(=entity=bean=javabean) dto数据在传输过程中的模型 -
→ modelⅡ模型 JSP+Servlet+JavaBean(v-c-m)
-
→ 框架开发
【框架对原有技术封装,并未改变技术】 传统模型:thymeleft…(JSP)+spring MVC(Servlet)+Mybatis(JavaBean) → **spring框架集成** 前后端分离:[Vue ... ] + [springMVC(Servlet)+ Mybatis(JavaBean) → spring框架集成] SSM=spring MVC + spring + Mybatis spring boot
浏览器B 发送请求给 controller层-Servlet 提交给model层-JavaBean,与数据库进行沟通。 entity 在servlet、Dao(JavaBean)、JSP三者之间进行数据传递。请求从Servlet 发到Dao,Dao操作数据库,从数据库返回数据给Servlet ,Servlet 把数据传给JSP,JSP通过脚本把数据迭代生成一个包含HTML、JavaBean、JSP的text文本并且发送给浏览器
浏览器B 发送请求到HTML页面,Nginx服务器把HTML返回,此时浏览器可以得到页面。B解析时通过Ajax把请求发送给后端-servlet,servlet将其传给JavaBean-Dao操作数据库,从数据库返回数据给Servlet ,servlet以JSON字符串将数据传回B。
二、XML(now还可用于配置文件,正在被注解代替)
了解:
框架mybatis、spring、tomcat、maven的pom文件 中配置文件会用到XML,技术已经被取消许多功能已经有替代品。
Ajax,x指的是XML。收到的文件可以收到两种格式text和xml,现在一般只用text,xml的内容被JSON字符串代替
(1)WHAT
-
XML 指可扩展标记语言(EXtensible Markup Language)。
-
特点:
1> XML 是一种很像HTML的标记语言。(XHTML = XML + HTML)
2>XML 的设计宗旨是传输数据(JSON)、存储数据(SQLite),而不是显示数据。
3> XML 标签没有被预定义。您需要自行定义标签。(DTD约束、Schema约束)
4> XML 是独立于软件和硬件的信息传输工具。“平台无关、语言无关”开始用于解决平台与语言之间的连接。现在被JSON代替
5> XML 和 HTML 之间的差异
6> XML 不是 HTML 的替代。 -
XML 和 HTML 为不同的目的而设计:
XML 被设计用来传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
xml样式
<notes>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</notes>
XML 允许创作者定义自己的标签和自己的文档结构。
(2)语法
约束(同HTML)
- XML 文档必须有一个根元素
- XML 元素都必须有一个关闭标签
- XML 标签对大小写敏感,建议小写
- XML 元素必须被正确的嵌套
- XML 属性值必须加引号
1.XML 声明
XML 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:
<?xml version="1.0" encoding="utf-8"?>
//以上实例包含 XML 版本,UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。
2. 所有的 XML 元素都必须有一个关闭标签
在 HTML 中,某些元素不必有一个关闭标签:
<p>This is a paragraph.
<br>
在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签:
<p>This is a paragraph.</p>
<br />
注释:从上面的实例中,您也许已经注意到 XML 声明没有关闭标签。这不是错误。声明不是 XML 文档本身的一部分,它没有关闭标签。
3. XML 标签对大小写敏感
XML 标签对大小写敏感。标签 与标签 是不同的。
必须使用相同的大小写来编写打开标签和关闭标签:
<Message>这是错误的</message>
<message>这是正确的</message>
注释:打开标签和关闭标签通常被称为开始标签和结束标签。不论您喜欢哪种术语,它们的概念都是相同的。
4. XML 必须正确嵌套
在 HTML 中,常会看到没有正确嵌套的元素:
<b><i>This text is bold and italic</b></i>
在 XML 中,所有元素都必须彼此正确地嵌套:
<b><i>This text is bold and italic</i></b>
在上面的实例中,正确嵌套的意思是:由于 元素是在 元素内打开的,那么它必须在 元素内关闭。
5. XML 属性值必须加引号
与 HTML 类似,XML 元素也可拥有属性(名称/值的对)。
在 XML 中,XML 的属性值必须加引号。
请研究下面的两个 XML 文档。 第一个是错误的,第二个是正确的:
<note date=12/11/2007>
<to>Tove</to>
<from>Jani</from>
</note>
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
在第一个文档中的错误是,note 元素中的 date 属性没有加引号。
6. 实体引用
在 XML 中,一些字符拥有特殊的意义。如果您把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。这样会产生 XML 错误:
<message>if salary < 1000 then</message>
为了避免这个错误,请用实体引用来代替 “<” 字符:
<message>if salary < 1000 then</message>
在 XML 中,有 5 个预定义的实体引用:
注释:在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。
7. <![CDATA[]]>大段文本引用。
字符串显示,不是标签显示的方法
<message>
<![CDATA[<a href="htp://www.baidu.com">百度</a>]]>
</message>
8. XML 中的注释
在 XML 中编写注释的语法与 HTML 的语法很相似。
<!-- This is a comment -->
在 XML 中,空格会被保留
HTML 会把多个连续的空格字符裁减(合并)为一个。
(3)XML校验
1、DTD验证
通过 DTD 验证的XML是"合法"的 XML。保证标签正确使用
1)内部使用:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note //唯一根节点————note必有4个———to、from、heading、body
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Dont forget me this weekend!</body>
</note>
2)外部使用:(多外部)
DTD文件Note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
XML文件note.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
2、Schema验证(用到更多,但较复杂) 略
校验、标签提示
3、DTD和Schema的区别
DTD的局限性
DTD不遵循XML语法
DTD数据类型有限,字符串
DTD不可扩展
DTD不支持命名空间(命名冲突)
Schema的新的特性
Schema基于xml语法
Schema可以用能处理xml文档的工具处理
Schema大大扩充了数据类型,可以自定义数据类型
Schema支持属性组
Schema约束的元素
Schema元素 (只要是schema约束,都以schema元素作为根节点)
(4)解析
如何对xml文件进行解析
1、DOM解析
DOM(Document Object Model) 它是 W3C 组织推荐的处理 XML 的一种方式。它会将整个XML使用类似树的结构保存在内存中,再对其进行操作,所以它需要等到XML完全加载进内存才可以进行操作。
缺点:耗费内存,当解析超大的XML时慎用。
优点:可以方便的对XML进行增删改查的操作。
在Java SE的API提供了org.w3c.dom包里面有Node接口,此接口中提供了很多增删改查节点的方法,而所有文档树的对象都实现这个接口。
//创建解析器:
SAXReader reader = new SAXReader();
//利用解析器读入xml文档:
Document document = reader.read(new File("input.xml"));
//获取文档的根节点:
Element root = document.getRootElement();
dom4j解析
DOM + SAX都可以用的第三方jar。
2、SAX解析(XML现在被用于配置文件,多用SAX)
这种解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。 以流的形式(便利)
优点:在读取文档的即时XML进行处理,不必等到文档加载结束,相对快捷。不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML。
缺点:只能用来读取XML中数据,无法进行增删改。
//1、使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
//2、通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
//3、通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();
//4、设置读取器的事件处理器
xmlReader.setContentHandler(new MyContentHandler());
//5、解析xml文件
xmlReader.parse("book.xml");
3、总结
DOM(读-存-操作)慢;SAX(读-操作) 快
增删改用DOM,查询用SAX。
三、Servlet
- Servlet是什么?
Server+Applet,是一种服务器端的Java应用程序
只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet - Servlet做了什么?
本身不做任何业务处理
只是接收请求并决定调用哪个JavaBean去处理请求,确定用哪个页面来显示处理返回的数据
(1)Servlet生命周期
1、实例化:调用构造方法创建实例对象
2、初始化:调用init()方法加载初始数据
3、服务:调用service()方法提供服务
4、销毁:调用destroy()销毁回收资源
第一次: 1 -> 2 -> 3
第N次:3
关闭tomcat:4
(2)Servlet开发
项目(一)——maven、BaseDao、servlet
- 项目准备:
1、Maven项目 -> webapp项目
2、在main下新建两个文件夹,java 、 resources 文件夹。
3、modules配置两文件夹类型。
- 开发代码:
1、引入支持jar pom -> javax.servlet-api
2、UserServlet extends HttpServlet
3、编写servlet
4、配置tomcat - 启动tomcat
- 开发message程序
1、连数据库。保证数据库中有表有数据。
2、编写entity - dao - servlet
3、servlet中代码书写的顺序为:
//1、设置编码格式。
request.setCharacterEncoding("utf-8");
//2、获得表单数据
String start = request.getParameter("_start");
String limit = request.getParameter("_limit");
//3、封装message对象
//4、调用dao实现插入操作
List<Message> messageList = new MessageDaoImpl().getMessageByPage(Integer.parseInt(start),Integer.parseInt(limit));
//5、设置编码格式
response.setContentType("text/html; charset=utf-8");
//6、ajax返回结果 1/0 object -> json
PrintWriter out = response.getWriter();
String ret = JSON.toJSONString(messageList);
out.print(ret);
out.close();
servlet注解和xml映射文件
<servlet>
<servlet-name>msgServlet</servlet-name>
<servlet-class>org.lanqiao.servlet.MessageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>msgServlet</servlet-name>
<url-pattern>/messages</url-pattern>
</servlet-mapping>
@WebServlet("/messages")//url -> class
public class MessageServlet extends HttpServlet {}
附:面向切面编程(AOP)思想
- 面向过程 - 方法代码,考虑步骤。
- 面向对象 - 模块中有哪些 对象、方法、属性、关系
- 面向接口 - 各个模块之间接口定义
- 面向切面 - 公共代码(日志、登录验证)
场景 : 切面 -> 接口 -> 对象 -> 过程
我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
(3)过滤器
-
过滤器: 是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。主要为了减轻服务器负载,减少压力。
-
过滤器的执行流程:执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>……——>第n个过滤器的chain.doFilter()之前的代码——>所请求servlet的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。
-
过滤器生命周期的四个阶段:
1、实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。
2、初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。
3、过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。
4、销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。 -
过滤器链:
在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter 就会组成一个Filter 链(也称过滤器链)。
-
Servlet过滤器开发步骤:
1、创建实现javax.servlet.Filter接口的类。
2、过滤器的xml配置。实现过滤器和Servlet、JSP页面之间的映射。
(4)拦截器
- 自定义拦截器的步骤
第一步:自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
第二步:在配置文件中注册定义的拦截器。
第三步:在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的
Action都被这个拦截器拦截。
java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。
Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现的动态代理。它依赖于具体的接口,在运行期间动态生成字节码。
拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作。java的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2等,有点类似面向切片的技术,在用之前先要在配置文件即xml,文件里声明一段的那个东西。
(5)监听器
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为: ServletContext, HttpSession 和 ServletRequest 这三个域对象。
Servlet监听器分为三大类
数据域对象创建和销毁监听器
数据域对象和属性变更监听器
绑定到 HttpSession 域中的某个对象的状态的事件监听器
- ServletContextListener
- ServletContextListener : 用来监听ServletContext对象的创建和销毁,ServletContext对象代表全局唯一对象,每个web工程会产生一个ServletContext。
- servletContext域对象何时创建和销毁
创建:服务器启动针对每一个web应用创建servletcontext
销毁:服务器关闭前先关闭代表每一个web应用的servletContext - ServletContextListener的使用
步骤一:编写类实现特定监听器接口
步骤二:注册监听器,不是通过事件源,而是在web.xml 进行配置
注意:监听器和Servlet、Filter不同,不需要url配置,监听器执行不是由用户访问的,监听器是由事件源自动调用的 - ServletContextListene使用场景:
第一个:在服务器启动时,对一些对象进行初始化,并且将对象保存ServletContext数据范围内(因为在监听器内可以获得事件源对象) — 全局数据。例如:创建数据库连接池
第二个:对框架进行初始化 例如:Spring框架初始化通过ServletContextListener (因为监听器代码在服务器启动时执行)。例如;Spring框架(配置文件随服务器启动加载) org.springframework.web.context.ContextLoaderListener
第三个:实现任务调度,启动定时程序 (Timer、TimerTask) 使一个程序,定时执行。例如: 比如说每天晚上十二点给过生日的人进行生日祝福,中国移动对账户进行同步,会在服务器使用较少的时间,例如凌晨之类,启动一段程序,进行同步。
- HttpSessionListener
- HttpSessionListener监听器 用于监听HttpSession 数据对象的创建和销毁。
- session创建和销毁
Session何时创建:request.getSession()
Session何时销毁:关闭浏览器,Session过期(30分钟),session.invalidate - 使用场景
统计在线人数。
- ServletRequestListener
- HttpServletRequest对象的创建和销毁监听器 —- ServletRequestListener
Request何时创建:请求发起时创建
Request何时销毁:响应结束时销毁
例如:每次刷新界面都会创建销毁一次
注意:创建销毁次数由请求次数决定
使用forward —- request创建销毁几次 —– 一次
使用sendRedirect —- request创建销毁两次 (两次请求)