记账本开发记录——第十一天(2020.1.29)

今天,学习了XML的相关知识和反射。其实就是servlet的底层逻辑和运行步骤。为什么我们能通过配置web.xml来让servlet那样运行呢?今天其实就学习了这样的一个问题。

首先,是XML,XML和HTML相似,但不同的是XML可以自定义标签(比如html中规定了a标签就是超链接,但xml中没有任何规定) xml规定每个开始的标签必须有结束标签。比如<hello></hello>,且必须依次对应,如<b><i>hello</b></i>,这在html是可行的,但对于xml来说是不可行的,必须书写规范且准确。

之后,便是xml的书写规范,我们学习了两种规范——DTD约束和Schema约束,后者比前者要更加实用,但为了学习起见,先行学习了DTD约束。即通过DTD提供的框架进行XML文档的书写。而Schema约束也类似,也可通过提供好的框架进行书写,以下是代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app version="1.0">
    <servlet>
        <servlet-name></servlet-name>
        <servlet-class></servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name></servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file></welcome-file>
    </welcome-file-list>
</web-app>

DTD约束

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
 4     version="2.5">
 5
 6     <servlet>
 7         <servlet-name>helloServlet</servlet-name>
 8         <servlet-class>xxxxxxxxxx</servlet-class>
 9     </servlet>
10     <servlet-mapping>
11         <servlet-name>helloServlet</servlet-name>
12         <url-pattern>/hello</url-pattern>
13     </servlet-mapping>
14 </web-app>

Schema约束

其实际,我们发现XML文档无法被浏览器解析。那么我们如何解析XML文档的内容来被浏览器使用呢?我们可以使用dom4j解析。dom4j是一个解析器,通过这个解析器我们能够调用其中的API进行XML的解析。

以下是一个DEMO:

package cn.itheima.xml.dom4j;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class TestDom4j {
    @Test
    public void testReadWebXML() {
        try {
            // 1.获取解析器
            SAXReader saxReader = new SAXReader();
            // 2.获得document文档对象
            Document doc = saxReader.read("src/cn/itheima/xml/schema/web.xml");
            // 3.获取根元素
            Element rootElement = doc.getRootElement();
            // System.out.println(rootElement.getName());//获取根元素的名称
            // System.out.println(rootElement.attributeValue("version"));//获取根元素中的属性值
            // 4.获取根元素下的子元素
            List<Element> childElements = rootElement.elements();
            // 5.遍历子元素
            for (Element element : childElements) {
                //6.判断元素名称为servlet的元素
                if ("servlet".equals(element.getName())) {
                    //7.获取servlet-name元素
                    Element servletName = element.element("servlet-name");
                    //8.获取servlet-class元素
                    Element servletClass = element.element("servlet-class");
                    System.out.println(servletName.getText());
                    System.out.println(servletClass.getText());
                }
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

}

在学习完了XML的相关知识后,我们来学习Servlet的一个重要概念,反射。反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。

使用反射,我们就可以在运行时对类,构造方法,普通方法等进行操作。

下面是代码演示:

 1 package cn.itheima.web.servlet;
 2
 3 import org.junit.Test;
 4
 5 public class TestMyServlet {
 6
 7     @Test
 8     public void testMyServlet(){
 9         MyServletImpl my = new MyServletImpl();
10         my.init();
11         my.service();
12         my.destory();
13     }
14
15     @Test
16     public void testMyServlet1(){
17         try {
18             String className = "cn.itheima.web.servlet.MyServletImpl";
19             Class clazz = Class.forName(className);
20             MyServletImpl my = (MyServletImpl) clazz.newInstance();
21             my.init();
22             my.service();
23             my.destory();
24         } catch (Exception e) {
25             e.printStackTrace();
26         }
27     }
28 }

TestMyServlet

package cn.itheima.web.servlet;

public interface IMyServlet {

    public void init();

    public void service();

    public void destory();
}

 1 package cn.itheima.web.servlet;
 2
 3 public class MyServletImpl implements IMyServlet {
 4
 5     @Override
 6     public void init() {
 7         System.out.println("啊,俺来也……");
 8     }
 9
10     @Override
11     public void service() {
12         System.out.println("我可以为你服务……");
13     }
14
15     @Override
16     public void destory() {
17         System.out.println("啊,俺去也……");
18     }
19
20 }

MyServletimp

可以看到,这就是servlet的底层工作原理。

原文地址:https://www.cnblogs.com/wushenjiang/p/12241540.html

时间: 2024-07-30 21:43:11

记账本开发记录——第十一天(2020.1.29)的相关文章

记账本开发记录——第八天(2020.1.26)

在疫情如此严重的现在,在家安心学习. 昨天初一守夜无聊的时候学完了JQ剩下的部分.这里讲到了一个插件validate.使用这个插件可以很方便的进行表单的检验,并且具有很好看的效果样式.以下是代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>网站注册页面</title> 6 <style> 7 #contan

记账本开发记录——第十二天(2020.1.30)

今天,学习了HTTP协议的相关内容和Servlet的运行原理.HTTP协议,全称叫做超文本传输协议,是一种网络协议,用来定义WEB浏览器与WEB服务器之间交换数据的过程. 在HTTP协议中,分为HTTP请求和HTTP响应(request和response)在HTTP请求中,根据请求方式的不同,内容也有所不同.对于get请求,会将内容放在浏览器URL内,不如post请求安全.post请求会把内容放到request内,而不会显示在浏览器URL内,相对来说要更加的安全. 在请求中有很多固定的参数,作为

家庭记账本开发记录(1)

这个寒假前面的时间一直在学习web前端,因为之前开发JavaWeb时,一些界面应用太粗糙,所以利用前段时间系统了解了一下前端技术,以便接下来后端开发的界面美观.再就是今天的关于家庭记账本软件的开发,确定了一下设计思路,其中主要是对数据库的操作比较重要,因为记账的收入支出需要进行数据汇总,一段时间以后用可视化数据报表进行呈现.对收入支出的费用又各有分类,收入有薪资.理财.红包.借入.收债.其他,支出消费.餐饮.购物.住房.交通.通讯.娱乐.医疗.教育.红包.旅行.投资.借出.还债.其他,至于对数据

记账本开发记录——第三天(2020.1.20)

本来按照今天的原计划来说,应该学习完javascript的基础内容.但今天一天都在干活,到晚上八点才坐到电脑前,已经精疲力尽了.于是简单设计了一下网站的几个页面和大体结构.以下是具体: 网站主界面: 开始记账界面: (希望实现:点击加号后弹出一个界面进行增) (删除时要弹出确认提示) (改时可以更改所有信息,也是弹出一个界面) 账单汇总 (选择汇总条件,目前只计划添加某时间段,如果时间允许增加种类等属性) (查找后输出在某段时间内总花费) 图表数据(尝试使用百度的smartart功能,生成一段时

记账本开发记录——第四天(2020.1.21)

总结:今天学习完了javascript的第一部分基础知识(昨天没学完的)并尝试使用div+css编写了记账本的index.html.以下是具体: 首先,使用javascript完成了首页轮播图效果,使用了setInterval.下面是代码:(实现较为低级) 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>首页</title>

记账本开发记录——第十天(2020.1.28)

今天,简单学习了JDBC连接池的概念和自定义连接池. 所谓连接池,就是连接完后不close,而是归还到连接池内,可以解决数据库连接的性能问题. 对于自定义连接池,我们可以自己创建连接池,然后通过这个连接池进行连接.如下代码: 1 public class MyDataSource implements DataSource{ 2 // 创建一个List集合用于存放多个连接对象. 3 private List<Connection> list = new ArrayList<Connect

记账本开发记录——第十三天(2020.1.31)

今天主要是学习了如何使用servletcontext来进行一个记录网站登录人数的案例.在实现这个案例之前,首先要学习相关的知识. ServletContext:在服务器启动的时候,为每个web应用创建一个单独的ServletContext对象,我们可以使用这个对象存储数据. 那么我们实现这个案例的思路是如何呢?我们可以在登录的Servlet中初始一个变量count为0,然后将其存到ServletContext中,在进入页面时就读取ServletContext的内容.下面是相关代码: packag

记账本开发记录——第五天(2020.1.22)

今天继续学习了javascript的相关内容,同时学习了关于表格标签的一些新标签. 首先,学习了如何使表格隔行换色.整体的思路不算复杂,用java里的思路就可以大致理解,以下是效果和代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>表格隔行换色</title> 6 <script> 7 window.onl

记账本开发记录——第六天(2020.1.22)

在学习JQ之前,我上网百度了一下,看看是否有学习该部分的必要.根据网友所说,虽然JQ的使用率不比以前,但作为一个十分经典的框架,仍然值得学习.现在很多框架都依赖于JQ,这点也是不容忽略的.在JQ中的AJAX也是个很多公司需要的功能.总的来说对于初学者来说学习JQ还是很有必要的. 在学习了一部分JS的基础上,今天学习了jQuery的基本操作.jQuery其实就是js query(查询),从名字可以看到,jQuery是对JS代码的一个简单化的框架.运用JQ可以很简单的编写出用JS来说比较复杂的案例.