【总复习】组件技术

tip

请在上传展示的资源 名为 JavaWeb程序设计(第三版)(微课视频版)(课后习题答案+源码)中查看
JavaWeb程序设计(第三版)第一章1.6课后习题答案,请和自己的书本内容核对后再进行下面操作!

JavaWeb程序设计(第三版)作业答案及JavaWeb程序设计(第三版)源码
需要的情直接打开百度网盘链接提取文件即可:
网盘链接:https://pan.baidu.com/s/1yPbnEnjNvtds7-El_ApkbQ?pwd=7tga
提取码:7tga

名词解释

JDBC技术
在这里插入图片描述

JavaBean技术
在这里插入图片描述

会话技术
指的是浏览器与服务器建立的一次连接,这次连接就称之为一次 会话 ,在这次 会话 中,可以包含多次请求与多次响应,但由于 HTTP 协议是无状态的,所以每一次请求都是独立的,无法记录前一次的请求状态。

cookie技术
用于将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互。

Session技术
一种将会话数据保存到服务器的技术。

守护线程
守护线程 (Daemon Thread)是指在程序运行的时候在后台提供一种通用服务的线程。

设计模式
设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。

单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

MVC模式
MVC(Model View Controller(,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
  通常模型对象负责在数据库中存取数据。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
  通常模型对象负责在数据库中存取数据。
Controller(控制器)是应用程序中处理用户交互的部分。
  通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

三层体系结构
三层结构解释 所谓三层 体系结构 ,是在 客户端 与数据库之间加入了一个中间件层,也叫组件层。 中间层通常包括业务逻辑层(BLL)、数据访问层(DAL)、数据对象模型层(DOM)。
表现层(UI):展现给用户的界面
业务逻辑层(BLL):针对具体功能,对数据层进行操作,对业务逻辑进行处理
数据访问层(DAL):直接操作数据库,针对数据的增添改查等。

UML
UML统一建模语言(Unified Modeling Language)在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
DAO模式
DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。
DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。
DAO设计模式包括以下5个主要部分:
①数据库连接类:
主要功能是连接数据库并获得连接对象,以及关闭数据库。
②VO类:
VO类是一个包含属性和表中字段完全对应的类,并在该类中提供setter和getter方法来设置并获取该类中的属性。
③DAO接口:
DAO接口中定义了所有的用户操作,如添加记录、删除记录及查询记录等。
④DAO实现类:
DAO实现类实现了DAO接口,并实现了接口中定义的所有方法。
⑤DAO工厂类:
通过该DAO工厂类的一个静态方法来获取DAO实现类实例。

大题

简答

1.Tomcat的目录层次结构
在这里插入图片描述
2.Javaweb应用的组成结构
在这里插入图片描述
3.web程序的目录结构
在这里插入图片描述
4.创建servlet类的步骤
在这里插入图片描述
5. 什么是Servlet
Servlet是JavaEE规范之一。规范就是接口。
Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
Servlet是运行在web服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

6.servlet的生命周期

文字概述:在这里插入图片描述在这里插入图片描述
流程图表示:在这里插入图片描述
7.ServletConfig类的三大作用
①可以获取Servlet程序的别名servlet-name的值。
②获取初始化参数init-param。
③获取ServletContext对象

8.什么是ServletContext?
①ServletContext是一个接口,它表示Servlet上下文对象
②一个web工程,只有一个ServletContext对象实例。
③ServletContext对象是一个域对象。
④ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。

9.使用 Servlet 读取表单数据,浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法POST 方法

10.JSP动作组件
在这里插入图片描述

11.JSP九大内置对象

out 输出对象,向客户端输出
pageContext JSP页面容器
request 请求对象,存储“客户端向服务端发送的请求信息”
response 响应对象
session 会话对象
application 全局对象
config 配置对象
page 当前JSP页面对象(相当于java中的this)
exception 异常对象

12.session与Cookie区别
①cookie数据存放在客户的浏览器上,session数据放在服务器上。
②cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
③session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
④单个cookie保存的数据不能超过3K,很多浏览器都限制一个站点最多保存20个cookie。
⑤可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

13.四大域
pageContext :JSP页面容器(page对象) 当前页面有效
request :对象请求 同一次请求有效
session :会话请求 同一次会话有效
application :全局对象 全局有效(整个项目有效

14.jsp语法
表达式脚本。表达式脚本格式:<%= 表达式%>
代码脚本。代码脚本格式:<% Java语句%>
声明脚本。声明脚本格式:<%声明Java代码 %>
在这里插入图片描述

15.设置响应内容类型,设置浏览器以UTF-8编码进行接收,解决中文乱码问题
response.setContentType(“text/html;charset=UTF-8”);

设置服务器端以UTF-8编码进行输出
response.setCharacterEncoding(“UTF-8”);

16.获取与该域相关的 Cookie 的数组
cookies = request.getCookies();

获取浏览器访问服务器时传递过来的cookie数组
Cookie[] cookies = request.getCookies();

17.创建一个 Cookie 对象:可以调用带有 cookie 名称和 cookie 值的 Cookie 构造函数,cookie 名称和 cookie 值都是字符串。
Cookie cookie = new Cookie(“key”,“value”);

18.设置刷新自动加载的事件间隔为 5 秒
response.setIntHeader(“Refresh”, 5);

19.Web组件之间存在三种关联关系
请求转发、URL重定向、包含

20.helloapp程序登录页面login.jsp的URL
http://localhost:8080/helloapp/login.jsp

21.SOLID 原则
S 单一职责原则(Single Responsibility Principle):一个类应该只有一个发生变化的原因。
O 开闭原则(Open Closed Principle):一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。
L 里氏替换原则(Liskov Substitution Principle):所有引用基类的地方必须能透明地使用其子类的对象。
L 迪米特法则(Law of Demeter)只与你的直接朋友交谈,不跟“陌生人”说话
I 接口隔离原则(Interface Segregation Principle):客户端不应该依赖它不需要的接口。类间的依赖关系应该建立在最小的接口上。
D 依赖倒置原则(Dependence Inversion Principle):上层模块不应该依赖底层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

22.jsp和servlet的相同点、不同点和联系
相同点: 它们本质上都是java类

不同点:
1.jsp经编译后就变成了Servlet.
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
4.Servlet的应用逻辑是在java文件中,并且完全从表现层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

联系: JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

书写主要代码段

1登录注册实例

2实现简单的计数器

  • application对象普通的网站计数器
<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>计数器</title>
</head>

<body>
<% 
	int number=0;
	if(application.getAttribute("number")==null){
    
    
		number=1;
	}else{
    
    
		number=Integer.parseInt((String)application.getAttribute("number"));
		number=number+1;
	}
	out.print("您是第"+number+"位访问者!");
	application.setAttribute("number",String.valueOf(number));
%>

</body>
</html>

  • 对于上面的application对象普通累加计数器,刷新页面也是可以累积加1的,而且就算是关闭浏览器重新再打开浏览器进行运行的话也是继续进行原本的累加.展示如下:
<%@page import="java.math.BigInteger"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	BigInteger counter = (BigInteger)application.getAttribute("count");//当没有count属性的时候,返回的是null
	if(counter == null){
    
    
		counter = new BigInteger("0");
	}
	if(session.isNew()){
    
    //判断是否是新的用户(刷新的时候session不会变,所以不进行累加)
		synchronized (this){
    
    
			counter = counter.add(new BigInteger("1"));//大整数进行加1
			application.setAttribute("count", counter);//application修饰全局
		}
	}
%>

<font color="red" size=6>您是第<%=counter %>个访问该网站的用户</font>

</body>
</html>

3生产者消费者模式

wait/notify和synchronized配合实现:

  • 单条
package ThreadDemo.ThreadExercise;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/*
 * 生产者线程
 */
class ProducerDemo implements Runnable{
    
    
    private List list;
    public ProducerDemo(List list){
    
    
        this.list=list;
    }
    @Override
    public void run() {
    
    
        while(true){
    
    
            Random random=new Random();
            synchronized(list){
    
    
                if(list.size()>0){
    
     //表明集合中有元素,此线程等待
                //可以是while
                    try {
    
    
                        list.wait();
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
                list.add(random.nextInt(100));//0-99的随机数;
                System.out.println(Thread.currentThread().getName()+"  "+list.get(0));
                list.notify(); //通知消费者,集合中已有元素。
            }
        }
    }
}
/*
 *  消费者线程
 */
class ConsumerDemo implements Runnable{
    
    
    private List list;
    public ConsumerDemo(List list){
    
    
         this.list=list;
    }
    @Override
    public void run() {
    
    
        while(true){
    
    
            synchronized (list){
    
    
                if(list.size()<1){
    
    //可以是while
                    try {
    
    
                        list.wait();
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName()+"  "+list.remove(0));
                list.notify();
            }
        }
    }
}
public class ProducerAndConsumer {
    
    
    public static void main(String[] args) {
    
    
        List list=new ArrayList();
        Thread thread1=new Thread(new ProducerDemo(list));
        thread1.setName("生产者线程_");
        Thread thread2=new Thread(new ConsumerDemo(list));
        thread2.setName("......消费者线程_");
        thread2.start();
        thread1.start();
    }
}

  • 多条
package ThreadDemo.ThreadExercise;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/*
 * 生产者线程
 */
class ProducerDemo implements Runnable{
    
    
    private List list;
    public ProducerDemo(List list){
    
    
        this.list=list;
    }
    @Override
    public void run() {
    
    
        while(true){
    
    
            Random random=new Random();
            synchronized(list){
    
    
                while(list.size()>0){
    
     
                    //因为生产者线程有多个,当本线程wait之后,假如一个生产者线程得到锁(本该消费者得到),
                    // 如果是if,那么此线程就会继续执行,会导致数据错乱。
                    //如果是while则会继续等待。
                    try {
    
    
                        list.wait();
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
                list.add(random.nextInt(100));//0-99的随机数;
                System.out.println(Thread.currentThread().getName()+"  "+list.get(0));
                list.notifyAll();  //唤醒此对象锁所有等待线程(消费者和生产者线程均有)
            }
        }
    }
}
/*
 *  消费者线程
 */
class ConsumerDemo implements Runnable{
    
    
    private List list;
    public ConsumerDemo(List list){
    
    
         this.list=list;
    }
    @Override
    public void run() {
    
    
        while(true){
    
    
            synchronized (list){
    
    
                while(list.size()<1){
    
    
                    try {
    
    
                        list.wait();
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName()+"  "+list.remove(0));
                list.notifyAll(); //唤醒此对象锁所有等待线程(消费者和生产者线程均有)
            }
        }
    }
}
public class ProducerAndConsumer {
    
    
    public static void main(String[] args) {
    
    
        List list=new ArrayList();
        for (int i = 1; i <4 ; i++) {
    
    
            Thread thread1=new Thread(new ProducerDemo(list));
            thread1.setName("生产者线程_"+i+"_");
            Thread thread2=new Thread(new ConsumerDemo(list));
            thread2.setName("......消费者线程_"+i+"_");
            thread2.start();
            thread1.start();
        }
    }
}

4 连接数据库并输出查询结果

猜你喜欢

转载自blog.csdn.net/weixin_55764157/article/details/128679227