后端学习笔记(一)—— XML、Servlet(了解)

一、JavaWeb发展史(了解)

  1. Servlet:Java程序输出HTML+CSS+js

  2. JSP :HTML嵌入Java程序(本质——翻译成Servlet
    (3P)ASP PHP JSP

  3. → 规范开发模型 MVC设计模式
    vue层(用户可见html+css+js)+controller层(提交至该层)+model层(操作数据库后返回给c-v)

  4. modelⅠ模型 JSP+JavaBean(封装数据entity+封装业务Dao)
    ( JavaBean有属性有方法的类——拆开——entity+Dao)
    vo与用户关联的对象 po与数据库关联的对象(=entity=bean=javabean) dto数据在传输过程中的模型

  5. modelⅡ模型 JSP+Servlet+JavaBean(v-c-m)

  6. 框架开发

    【框架对原有技术封装,并未改变技术】
     传统模型: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 &lt; 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>

无DTD约束
在这里插入图片描述
在这里插入图片描述

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

https://mvnrepository.com/

  • 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,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

JavaWeb过滤器.监听器.拦截器-原理&区别

(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)拦截器

  1. 自定义拦截器的步骤
    第一步:自定义一个实现了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 域中的某个对象的状态的事件监听器

  1. 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) 使一个程序,定时执行。例如: 比如说每天晚上十二点给过生日的人进行生日祝福,中国移动对账户进行同步,会在服务器使用较少的时间,例如凌晨之类,启动一段程序,进行同步。
  1. HttpSessionListener
  • HttpSessionListener监听器 用于监听HttpSession 数据对象的创建和销毁。
  • session创建和销毁
    Session何时创建:request.getSession()
    Session何时销毁:关闭浏览器,Session过期(30分钟),session.invalidate
  • 使用场景
    统计在线人数。
  1. ServletRequestListener
  • HttpServletRequest对象的创建和销毁监听器 —- ServletRequestListener
    Request何时创建:请求发起时创建
    Request何时销毁:响应结束时销毁
    例如:每次刷新界面都会创建销毁一次
    注意:创建销毁次数由请求次数决定
    使用forward —- request创建销毁几次 —– 一次
    使用sendRedirect —- request创建销毁两次 (两次请求)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值