Web期末复习知识点

1、掌握tomcat服务器的安装和配置参数

  1. 下载Tomcat:前往Apache Tomcat官方网站(https://tomcat.apache.org)下载适合您操作系统的Tomcat版本。

  2. 安装Tomcat:解压下载的Tomcat压缩文件到您选择的目录。例如,将Tomcat解压到/opt/tomcat。

  3. 配置环境变量(可选):如果需要在任何位置启动Tomcat,可以将Tomcat的bin目录添加到系统的PATH环境变量中。

  4. 启动Tomcat:在命令行中导航到Tomcat的bin目录,然后运行以下命令(Windows系统为startup.bat,Unix/Linux系统为startup.sh)来启动Tomcat服务器:/startup.sh

  5. 访问Tomcat管理界面:在浏览器中输入http://localhost:8080,您将看到Tomcat的默认欢迎页面。如果一切正常,说明Tomcat已经成功安装并运行。

  6. 配置Tomcat参数:Tomcat的配置文件位于conf目录下。以下是一些常见的配置文件和参数:

    1. server.xml:主要配置Tomcat服务器的全局设置,如端口号、连接器、虚拟主机等。

    2. web.xml:Web应用程序的部署描述符,可以配置Web应用程序的参数、过滤器、监听器等。

    3. context.xml:Web应用程序的上下文配置文件,可以配置数据源、资源等。

2、URL地址的正确应用

URL,全称为统一资源定位符(Uniform Resource Locator),是Web上的一个核心概念,它是浏览器用来检索网上公布的任何资源的重要机制。URL代表了一个特定资源在Web上的唯一地址。互联网上的每个文件都有一个唯一的URL,它包含了指明文件位置以及浏览器应如何处理该文件的信息。

URL的组成包含主要的两个部分:协议和目的地。"协议"是告诉我们自己面对的是何种类型的Internet资源,最常见的协议是http,表示从Web中取回的是HTML文档。而目的地则是指明资源在服务器上的具体位置。

3、http协议,<html>常见标签的功能和使用

HTTP(Hypertext Transfer Protocol)是一种用于在Web上传输数据的协议。它定义了客户端和服务器之间的通信规则。

HTTP协议功能:

  • 建立连接:客户端通过发送HTTP请求与服务器建立连接。

  • 请求方法:常见的HTTP请求方法包括GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。

  • 响应状态码:服务器通过HTTP响应状态码指示请求的处理结果,如200表示成功,404表示未找到资源,500表示服务器内部错误等。

  • 请求头和响应头:HTTP请求和响应中可以包含头部信息,用于传递附加的元数据。

  • Cookie和Session:通过HTTP头部的Cookie字段和服务器端的Session机制,实现在客户端和服务器之间的状态管理。

常见HTML标签功能和使用示例:

<html>:定义HTML文档的根元素。

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <title>My Web Page</title>
    </head>
    <body>
    <!-- 页面内容 -->
    </body>
</html>

<head>:定义HTML文档的头部,包含元数据和链接外部资源。

html 复制代码
<head>
    <title>My Web Page</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="styles.css">
    <script src="script.js"></script>
</head>

<title>:定义HTML文档的标题,显示在浏览器的标题栏或标签页上。

html 复制代码
<title>My Web Page</title>

<body>:定义HTML文档的主体部分,包含可见的内容。

html 复制代码
<body>
    <h1>Welcome to My Web Page</h1>
    <p>This is a paragraph.</p>
    <img src="image.jpg" alt="Image">
</body>

<h1>到<h6>:定义标题级别,从大到小依次递减。

html 复制代码
<h1>Main Heading</h1>
<h2>Subheading</h2>

<p>:定义段落。

html 复制代码
<p>This is a paragraph.</p>

<a>:定义超链接。

html 复制代码
<a href="https://www.example.com">Visit Example</a>

<img>:定义图像。

html 复制代码
<img src="image.jpg" alt="Image">

<ul>和<li>:定义无序列表。

html 复制代码
<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>

<ol>和<li>:定义有序列表。

html 复制代码
<ol>
    <li>Item 1</li>
    <li>Item 2</li>
</ol>

这只是HTML标签的一小部分,HTML提供了许多其他标签和属性,用于定义网页的结构、样式和交互行为。

4、JSP的常见编译指令标记、动作指令标记包括哪些?

编译指令标记(<%@ %>):

  • <%@ page %>:定义页面的属性,如语言、缓存等。

  • <%@ include %>:包含其他文件的内容。

  • <%@ taglib %>:导入标签库,用于使用自定义标签。

动作指令标记(jsp:...):

  • <jsp:include>:包含其他页面或文件的内容。

  • <jsp:forward>:将请求转发到另一个页面或资源。

  • <jsp:useBean>:创建或获取JavaBean对象。

  • <jsp:setProperty>:设置JavaBean对象的属性值。

  • <jsp:getProperty>:获取JavaBean对象的属性值。

  • <jsp:include>:动态包含其他页面的内容。

  • <jsp:plugin>:插入浏览器插件。

  • <jsp:element>:动态生成HTML元素。

  • <jsp:text>:插入静态文本。

5、javaBean的定义规则包括哪些方面?

  1. 类名:JavaBean类名应以大写字母开头,并遵循驼峰命名法(CamelCase),例如:PersonBean。

  2. 公共无参构造函数:JavaBean类必须提供一个公共的无参构造函数,以便其他代码可以通过该构造函数实例化对象。

  3. 属性:JavaBean应该定义私有的属性,并提供公共的访问方法(getter和setter方法)来读取和修改属性的值。属性的命名应遵循驼峰命名法,并使用标准的Java数据类型。

  4. 可序列化:JavaBean类可以实现java.io.Serializable接口,以支持对象的序列化和反序列化。

  5. 事件处理方法(可选):JavaBean类可以定义用于处理事件的方法,通常以add、remove或fire作为前缀,例如:addPropertyChangeListener()。

  6. 其他方法:除了属性访问方法外,JavaBean类可以包含其他方法来执行业务逻辑或提供其他功能。

  7. 提供BeanInfo(可选):JavaBean类可以提供一个与之关联的BeanInfo类,用于提供有关JavaBean的元数据信息。BeanInfo类可以自动生成或手动编写。

6、Web项目的文件目录结构和主要功能是什么?

在Eclipse中创建一个标准的Java Web项目时,通常会遵循以下文件目录结构和主要功能:

src目录:存放项目的Java源代码文件,包括Servlet、Filter、Listener等的实现类。

webapp目录

WEB-INF目录

web.xml:配置Web应用程序的部署描述符,包括Servlet、Filter、Listener等的配置。

lib目录:存放项目依赖的第三方JAR包。

classes目录:存放编译后的Java类文件。

jsp目录:存放JSP页面文件(可选)。

META-INF目录(可选)

存放项目的元数据文件,如MANIFEST.MF(如果使用Java EE规范)。

静态资源目录(如css、js、images等):

存放项目使用的静态资源文件,如CSS样式表、JavaScript脚本、图像文件等。

7、表单数据的提交方式包括什么?各自的特点是什么?

  1. GET 方法 :通过 URL 将表单数据附加在请求的查询字符串中进行提交。

    特点如下:

    • 数据以键值对的形式出现在 URL 中,对用户可见。
    • 数据量有限,通常不超过 2048 个字符。
    • 可以被缓存,可以被收藏为书签,可以被历史记录保存。
    • 不安全,因为数据暴露在 URL 中,容易被篡改或截获。
  2. POST 方法 :将表单数据作为请求的主体内容进行提交。

    特点如下:

    • 数据不会出现在 URL 中,对用户不可见。
    • 数据量较大,没有限制。
    • 不能被缓存,不能被收藏为书签,不能被历史记录保存。
    • 相对安全,因为数据不会暴露在 URL 中,但仍然可能被截获。
  3. PUT 方法 :用于更新或创建资源。

    特点如下:

    • 将指定的资源的全部内容替换为请求中的数据。
    • 可以用于创建新资源,也可以用于更新已存在的资源。
    • 数据量较大,没有限制。
  4. DELETE 方法 :用于删除指定的资源。

    特点如下:

    • 删除指定的资源,无需提供请求主体内容。
    • 通常需要对请求进行身份验证和授权。

这些提交方式在实际应用中根据需要进行选择,GET 方法适用于数据量小且不敏感的场景,POST 方法适用于数据量大或敏感的场景,PUT 方法适用于更新或创建资源,DELETE 方法适用于删除资源。

8、什么是Servlet? Servlet类中包含哪些重要的方法?

Servlet是Java编写的服务器端程序,用于处理客户端发起的HTTP请求并生成响应。它是Java Servlet API的一部分,用于构建基于Java的Web应用程序。

  1. init() 方法:在 Servlet 实例被创建时调用,用于初始化 Servlet。它只会被调用一次。

  2. service() 方法 :用于处理客户端的请求并生成响应。每次请求都会调用该方法。在 service() 方法中,可以根据请求的类型(GET、POST、PUT、DELETE 等)调用相应的处理方法。

  3. doGet() 方法 :处理 HTTP GET 请求的方法。在 service() 方法中,如果请求类型为 GET,则会调用 doGet() 方法。

  4. doPost() 方法 :处理 HTTP POST 请求的方法。在 service() 方法中,如果请求类型为 POST,则会调用 doPost() 方法。

  5. doPut() 方法 :处理 HTTP PUT 请求的方法。在 service() 方法中,如果请求类型为 PUT,则会调用 doPut() 方法。

  6. doDelete() 方法 :处理 HTTP DELETE 请求的方法。在 service() 方法中,如果请求类型为 DELETE,则会调用 doDelete() 方法。

9、Servlet获取请求参数和表单数据的方式是什么,如何部署Servlet,jsp和Serlvet之间的关系是什么?

Servlet可以通过多种方式获取请求参数和表单数据,其中最常用的方式是通过HttpServletRequest对象提供的方法来实现。以下是常用的方法:

  1. `getParameter(String name)`:通过参数名获取单个请求参数的值。

  2. `getParameterValues(String name)`:通过参数名获取多个请求参数的值,适用于参数名相同但值不同的情况。

  3. `getParameterMap()`:获取所有请求参数的映射表,返回一个Map对象,其中键是参数名,值是参数值的数组。

  4. `getInputStream()`:获取请求的原始输入流,适用于处理POST请求的原始数据。

  5. `getReader()`:获取请求的字符输入流,适用于处理POST请求的文本数据。

关于Servlet、JSP和Servlet之间的关系,它们是Java Web开发中的三个重要组成部分:

  1. Servlet:Servlet是Java编写的服务器端程序,用于处理客户端发起的HTTP请求并生成响应。它可以接收和处理请求参数、访问数据库、生成动态内容等。Servlet通常以.java文件的形式存在,需要通过Java编译器编译成.class文件后才能在服务器上运行。

  2. JSP(JavaServer Pages):JSP是一种动态网页技术,它允许在HTML页面中嵌入Java代码。JSP页面可以包含静态内容和动态内容,其中动态内容由Java代码生成。JSP页面最终会被编译成Servlet,并在服务器上作为Servlet运行。JSP文件以.jsp扩展名结尾,可以在其中使用Java代码和JSP标签来处理请求和生成响应。

  3. Servlet和JSP之间的关系:Servlet和JSP都是在服务器端处理请求和生成响应的技术,它们可以协同工作来构建动态的Web应用程序。通常情况下,Servlet负责处理业务逻辑、数据库访问等底层操作,而JSP负责生成页面的外观和布局。Servlet可以通过请求转发或者直接将数据传递给JSP,而JSP可以使用EL表达式、JSTL等技术来访问Servlet提供的数据并生成相应的页面。

在部署方面,Servlet和JSP都需要被部署到支持Java Web应用程序的服务器上,如Apache Tomcat。部署过程通常包括以下步骤:

  1. 将编写好的Servlet类编译成.class文件,并将.class文件放置在服务器的Web应用程序目录下的WEB-INF/classes目录中,或者打包成一个.jar文件放置在WEB-INF/lib目录中。
  2. 将编写好的JSP文件放置在Web应用程序目录下的某个目录中,通常是Web应用程序的根目录或者WEB-INF目录下。
  3. 启动服务器,让服务器加载并运行Servlet和JSP。
  4. 客户端通过浏览器发送请求时,服务器会根据请求的URL匹配相应的Servlet或JSP,并执行相应的逻辑来生成响应。

总结:Servlet是处理业务逻辑的Java类,JSP是生成页面的技术,它们可以协同工作来构建动态的Web应用程序。Servlet和JSP都需要部署到服务器上,由服务器加载和运行。

10、实现页面跳转的方式有哪些?各自的特点是什么?什么是EL表达式,它的表示形式是什么?使用EL表达式有哪些优点?

实现页面跳转的方式有以下几种,它们各自具有不同的特点:

  1. 使用超链接(<a>标签):通过在页面中添加超链接,用户点击超链接后会跳转到指定的页面。这种方式简单直接,适用于静态页面之间的跳转。

  2. 使用表单提交:通过表单的提交实现页面跳转,可以使用GET或POST方法提交表单数据,跳转到指定的页面。这种方式适用于需要传递参数的页面跳转。

  3. 使用重定向(Redirect):服务器端发送一个重定向响应给客户端,让客户端重新发送请求到指定的页面。这种方式可以实现页面跳转和参数传递。

  4. 使用转发(Forward):服务器端将请求转发到另一个页面进行处理,客户端并不知道页面的实际路径。这种方式适用于服务器内部的页面跳转。

EL表达式(Expression Language)是一种用于在JSP页面中访问数据的简洁表达式语言。它的表示形式是${expression},其中expression可以是变量、属性、方法调用等。

使用EL表达式的优点包括:

  • 简洁:EL表达式的语法简单,使用起来非常方便。
  • 可读性强:相比Java代码,EL表达式更易于阅读和理解。
  • 支持空值处理:EL表达式对空值的处理更加灵活,可以避免空指针异常的发生。
  • 支持访问各种作用域的数据:EL表达式可以方便地访问页面作用域、请求作用域、会话作用域和应用程序作用域的数据。

综上所述,EL表达式是一种简洁、易读、灵活且功能强大的表达式语言,它可以方便地在JSP页面中访问各种数据,并且具有空值处理和作用域访问的优势。

11、什么是JSTL标签,常用的条件、循环标签是什么?具体属性都有哪些?

JSTL(JSP Standard Tag Library)标签是一组用于在JSP页面中进行常见逻辑处理和数据操作的标签库。它提供了一些常用的标签,用于简化和优化JSP页面的开发。

JSTL标签库主要包括以下几个部分:

  1. 核心标签库(Core Tag Library):提供了一些常用的逻辑处理和数据操作标签。
  2. 格式化标签库(Formatting Tag Library):提供了一些用于格式化数据和显示日期、数字等的标签。
  3. SQL标签库(SQL Tag Library):提供了一些用于执行SQL查询和操作数据库的标签。
  4. XML标签库(XML Tag Library):提供了一些用于处理XML数据的标签。

常用的JSTL核心标签库中的条件和循环标签如下:

  1. 条件标签
  • `<c:if>`:根据条件判断是否执行某个区块的内容。
  • `<c:choose>`、`<c:when>`、`<c:otherwise>`:多路条件判断,类似于Java中的`switch-case`语句。
  • `<c:forEach>`:遍历集合或数组中的元素,重复执行某个区块的内容。
  1. 循环标签
  • `<c:forEach>`:遍历集合或数组中的元素,重复执行某个区块的内容。
  • `<c:forTokens>`:根据指定的分隔符将字符串拆分成多个标记,并对每个标记执行某个区块的内容。

这些标签具有丰富的属性,常见的属性如下:

  1. 条件标签的常见属性:
  • `test`:指定条件表达式,用于判断是否执行标签体的内容。
  1. 循环标签的常见属性:
  • `var`:指定一个变量名,用于存储每次迭代的当前元素。
  • `items`:指定要迭代的集合或数组。
  • `begin`、`end`、`step`:指定循环的起始值、结束值和步长。
  • `varStatus`:指定一个变量名,用于存储循环状态信息,如索引、计数等。

除了条件和循环标签,JSTL还提供了其他一些常用的标签,如输出标签`<c:out>`、赋值标签`<c:set>`、导入标签`<c:import>`等,每个标签都有特定的属性和功能。

需要注意的是,为了使用JSTL标签,需要在JSP页面中导入JSTL标签库的声明,例如:

html 复制代码
```jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
```

这样就可以在页面中使用JSTL标签库中的标签了。

总结起来,JSTL标签是一组用于简化和优化JSP页面开发的标签库,常用的条件和循环标签包括`<c:if>`、`<c:choose>`、`<c:forEach>`等,它们具有丰富的属性来实现条件判断和循环操作。

12、JSP页面中的注释有哪几种?具体用法是什么?

在JSP页面中,有两种主要的注释形式:HTML注释和JSP注释。它们分别用于在生成的HTML页面中隐藏注释内容或在JSP引擎处理时忽略注释内容。

1. HTML注释

  • 行级注释:`<!-- 注释内容 -->`。
    • 行级注释以`<!--`开头,以`-->`结尾,可以跨行使用。HTML注释在生成的HTML页面中保留,但不会被浏览器解析和显示。
  • 块级注释:`<!-- 注释内容1 注释内容2 ... -->`。
    • 块级注释可以包含多行注释内容,以`<!--`开头,以`-->`结尾。同样,块级注释在生成的HTML页面中保留,但不会被浏览器解析和显示。

2. JSP注释

  • 行级注释:`<%-- 注释内容 --%>`。
    • 行级注释以`<%--`开头,以`--%>`结尾,可以跨行使用。JSP注释在JSP引擎处理时会被忽略,不会出现在生成的HTML页面中。
  • 块级注释:`<% /* 注释内容1 注释内容2 ... */ %>`。
    • 块级注释可以包含多行注释内容,以`<% /*`开头,以`*/ %>`结尾。同样,块级注释在JSP引擎处理时会被忽略,不会出现在生成的HTML页面中。

注释的作用是提供对代码的说明、解释或临时调试信息,以便开发人员或其他人员理解和维护代码。HTML注释适用于隐藏注释内容,而JSP注释适用于在JSP引擎处理时忽略注释内容。

例如,以下是在JSP页面中使用不同类型注释的示例:

java 复制代码
```jsp

<!-- 这是一个HTML行级注释 -->
<!--
    这是一个HTML块级注释
    可以跨行使用
-->

<%-- 这是一个JSP行级注释 --%>
<%
    /*
        这是一个JSP块级注释
        可以跨行使用
    */
%>

```

需要注意的是,JSP注释只会在JSP引擎处理时被忽略,如果在JSP页面中使用了JSP注释,生成的HTML页面中将不会包含注释内容。而HTML注释则会在生成的HTML页面中保留,但不会被浏览器解析和显示。因此,根据注释的用途和需求,选择合适的注释形式进行注释。

13、jsp中的脚本标记包括哪些,各自的用法是什么?

在JSP中,有三种主要的脚本标记用于插入Java代码和执行动态操作:脚本表达式(Expression)、脚本片段(Scriptlet)和声明(Declaration)。

1. 脚本表达式(Expression)

  • 标记形式:<%= 表达式 %>
  • 用法:用于在生成的HTML页面中输出表达式的值。表达式可以是任何有效的Java表达式,它会被求值并将结果输出到页面上。脚本表达式通常用于将动态数据显示给用户。

示例:

html 复制代码
```jsp
<h1>Welcome, <%= username %>!</h1>
```

2. 脚本片段(Scriptlet)

  • 标记形式:<% Java代码 %>
  • 用法:用于插入任意有效的Java代码片段。可以在脚本片段中编写逻辑、定义变量、调用方法等。脚本片段中的Java代码将在JSP引擎处理时执行。

示例:

java 复制代码
```jsp
<%
    String message = "Hello, World!";
    out.println(message);
%>
```

3. 声明(Declaration)

  • 标记形式:<%! Java代码 %>
  • 用法:用于在JSP生成的Servlet类中定义成员变量、方法和类。声明中的Java代码将被插入到生成的Servlet类的类体中,可以在整个JSP页面中使用。

示例:

java 复制代码
```jsp
<%!
    private static final int MAX_COUNT = 10;
    public void printMessage() {
    out.println("This is a custom method.");
    }
%>
```

这些脚本标记允许在JSP页面中嵌入和执行Java代码,使得开发者可以在JSP中实现动态的逻辑和数据处理。脚本表达式用于输出表达式的值,脚本片段用于插入任意的Java代码片段,而声明用于定义成员变量和方法。根据需求和场景,选择合适的脚本标记来实现所需的功能。需要注意的是,为了遵循最佳实践和提高可维护性,应尽量减少在JSP中使用脚本片段和声明,将业务逻辑封装到后端的Java类中。

JSP九大内置对象及基本使用

14、JSP内置对象的作用域包括哪些,各自的作用域范围是什么?

jsp四大作用域和九大对象

1. request

request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。

应用场景 : 常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递。
2. session

服务器会为每个会话创建一个session对象,所以session中的数据可供当前会话中所有servlet共享。

应用场景 : 常用于web开发中的登陆验证界面(当用户登录成功后浏览器分配其一个session键值对)。
3. Application(ServletContext)

ServletContext在服务器启动时创建,在服务器关闭时销毁。

所有的用户都可以取得此信息,此信息在整个服务器上被保留。Application属性范围值,全局变量,只要设置一次,则所有的网页窗口都可以取得数据。

应用场景 : 一般用于在多个客户端间共享数据时使用。
4. page

page对象即this,代表JSP本身,更准确的说它代表JSP被翻译后的Servlet,因此他可以调用Servlet类所定义的方法。page对象的类型为javax.servlet.jsp.HttpJspPage。

应用场景 : 在实际应用中,page对象很少在JSP中使用

15、JSP的常见内置对象包括哪些,各自的常用方法有哪些?

JSP的九大内置对象包括以下对象:

  1. request:HttpServletRequest对象,代表客户端的请求信息。
  • `getParameter(String name)`:获取请求参数的值。
  • `setAttribute(String name, Object value)`:设置请求属性的值。
  • `getAttribute(String name)`:获取请求属性的值。
  1. response:HttpServletResponse对象,代表服务器对客户端请求的响应。
  • `setContentType(String type)`:设置响应的内容类型。
  • `getWriter()`:获取用于向客户端输出文本的PrintWriter对象。
  1. session:HttpSession对象,代表客户端和服务器之间的会话。
  • `getAttribute(String name)`:获取会话属性的值。
  • `setAttribute(String name, Object value)`:设置会话属性的值。
  • `invalidate()`:使当前会话失效。
  1. application:ServletContext对象,代表整个Web应用程序的上下文。
  • `getAttribute(String name)`:获取应用程序属性的值。
  • `setAttribute(String name, Object value)`:设置应用程序属性的值。
  1. pageContext:PageContext对象,代表JSP页面的上下文。
  • `getRequest()`:获取HttpServletRequest对象。
  • `getResponse()`:获取HttpServletResponse对象。
  • `getSession()`:获取HttpSession对象。
  • `getServletContext()`:获取ServletContext对象。
  1. out:JspWriter对象,用于向客户端输出内容。
  • `print(String str)`:输出字符串。
  • `println(String str)`:输出字符串,并换行。
  1. config:ServletConfig对象,代表当前JSP页面的Servlet配置信息。
  • `getInitParameter(String name)`:获取指定名称的初始化参数值。
  1. page:Object对象,代表当前JSP页面本身。
  • `import`:导入Java类。
  • `errorPage`:指定错误页面。
  1. exception:Throwable对象,代表JSP页面中发生的异常。
  • `getMessage()`:获取异常信息。
  • `printStackTrace()`:打印异常堆栈信息。 这些内置对象提供了丰富的方法和属性,用于处理请求、响应、会话、应用程序等相关操作,使得在JSP页面中能够方便地进行数据处理和页面渲染。

16、什么是过滤器?如何定义过滤器?

过滤器是JavaEE平台中的一种组件,用于在Servlet容器中对请求和响应进行预处理和后处理。过滤器可以用于修改请求或响应的内容、头部信息、以及执行特定的操作,如日志记录、安全控制、字符编码转换等。过滤器的主要作用是对Servlet容器中的请求和响应进行过滤和处理,以实现对请求和响应的统一处理。

要定义一个过滤器,需要按照以下步骤进行:

  1. 创建一个实现了javax.servlet.Filter接口的Java类,该类将作为过滤器的实现类。

  2. 实现Filter接口中的三个方法:init()、doFilter()和destroy()。 - init()方法用于进行过滤器的初始化,其中可以进行一些初始化操作。 - doFilter()方法用于对请求和响应进行过滤和处理,是过滤器的核心方法。 - destroy()方法用于进行过滤器的销毁,在过滤器被移除时调用,可以进行一些资源释放操作。

  3. 在web.xml文件中配置过滤器的映射和初始化参数。

html 复制代码
```xml
<filter>
	<filter-name>MyFilter</filter-name>
	<filter-class>com.example.MyFilter</filter-class>
	<init-param>
		<param-name>param1</param-name>
		<param-value>value1</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>MyFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
```xml

在上述配置中,`<filter>`元素用于定义过滤器,`<filter-name>`指定过滤器的名称,`<filter-class>`指定过滤器的类名,`<init-param>`用于定义过滤器的初始化参数。`<filter-mapping>`元素用于定义过滤器的映射,`<url-pattern>`指定了过滤器所要过滤的URL模式。 通过以上步骤,就可以定义并配置一个过滤器,使其能够对Servlet容器中的请求和响应进行过滤和处理。

17、JDBC连接MySQL数据库的常用对象和步骤是什么?

常用对象:

  1. DriverManager:负责管理一组JDBC驱动程序的服务。

  2. Connection:代表数据库连接,用于与数据库建立连接和进行数据交互。

  3. Statement或PreparedStatement:用于执行SQL语句并返回结果。

  4. ResultSet:代表SQL查询的结果集,用于访问查询结果的数据。

连接步骤:

  1. 加载数据库驱动程序:使用Class类的forName()方法加载MySQL数据库的驱动程序。

例如:

java 复制代码
Class.forName("com.mysql.cj.jdbc.Driver");
  1. 建立数据库连接:使用DriverManager类的getConnection()方法建立与MySQL数据库的连接。需要提供数据库的URL、用户名和密码。

例如:

java 复制代码
String url = "jdbc:mysql://localhost:3306/数据库名"; 
String username = "用户名"; 
String password = "密码"; 
Connection connection = DriverManager.getConnection(url, username, password); 
  1. 创建Statement或PreparedStatement对象:使用Connection对象的createStatement()或prepareStatement()方法创建用于执行SQL语句的对象。

例如:

html 复制代码
Statement statement = connection.createStatement();
  1. 执行SQL查询或更新:通过Statement或PreparedStatement对象执行SQL查询或更新操作,并获取结果。

例如:

html 复制代码
ResultSet resultSet = statement.executeQuery("SELECT * FROM 表名"); 
  1. 处理查询结果:对于查询操作,可以通过ResultSet对象获取查询结果,并进行相应的处理。

例如:

html 复制代码
while (resultSet.next()) { // 处理每一行数据 } 
  1. 关闭连接和资源:在数据库操作结束后,需要关闭ResultSet、Statement、Connection等资源。

例如:

html 复制代码
resultSet.close(); 
statement.close(); 
connection.close(); 

通过以上步骤,可以使用JDBC连接MySQL数据库,并进行数据库操作。

18、Excel的读写操作原理和实现方式是什么?

  1. 使用POI库: Apache POI是一个开源的Java库,提供了对Microsoft Office格式文件(如Excel、Word和PowerPoint)的读写操作支持。使用POI库可以实现Excel文件的读写。

    • 读取Excel文件:使用HSSFWorkbookXSSFWorkbook类加载Excel文件,然后使用SheetRowCell等类来遍历和读取Excel中的数据。
    • 写入Excel文件:创建HSSFWorkbookXSSFWorkbook对象,创建SheetRowCell等对象,然后设置单元格的值,最后将数据写入Excel文件。

    POI库的原理是通过解析Excel文件的二进制格式(.xls或.xlsx),将数据转换为Java对象表示,并提供了API来访问和操作这些对象。读取时,POI库解析Excel文件并构建相应的对象结构,以便程序可以访问和读取数据。写入时,POI库将Java对象的数据写入到Excel文件的相应位置。

  2. 使用第三方库(如JExcel、EasyExcel等): 除了POI库,还有一些第三方库提供了更简化的API和更高性能的Excel读写操作。

    • JExcel:JExcel是一个Java库,提供了对Excel文件的读写操作。它使用类似POI的API,通过解析Excel文件并构建对象模型来实现读取和写入操作。
    • EasyExcel:EasyExcel是阿里巴巴开源的一款Java库,专注于Excel读写操作。它提供了简单易用的API,支持大数据量的读写操作,并提供了数据转换、样式设置等功能。

    这些库的原理与POI类似,通过解析Excel文件并构建对象模型,以便程序可以读取和写入数据。它们通常提供了更简单、更高级的API,使得Excel操作更加便捷。

19、常用的JSTL标签的用法及功能?

JSTL(JavaServer Pages Standard Tag Library)是用于在JSP页面中进行逻辑处理和展示的标签库。下面是常用的JSTL标签及其功能和用法:

  1. <c:out>:用于输出文本内容,可以防止XSS攻击。

用法示例:

XML 复制代码
    <c:out value="${variable}" />
  1. <c:set>:用于设置一个变量的值。

用法示例:

XML 复制代码
    <c:set var="variable" value="${expression}" />
  1. <c:if>:用于条件判断,根据条件决定是否输出内容。

用法示例:

XML 复制代码
   <c:if test="${condition}">
       <!-- 内容 -->
   </c:if>
  1. <c:choose>、<c:when>、<c:otherwise>:用于多重条件判断。

用法示例:

java 复制代码
    <c:choose>
       <c:when test="${condition1}">
           <!-- 内容1 -->
       </c:when>
       <c:when test="${condition2}">
           <!-- 内容2 -->
       </c:when>
       <c:otherwise>
           <!-- 默认内容 -->
       </c:otherwise>
   </c:choose>
  1. <c:forEach>:用于遍历集合或数组,输出重复的内容。

用法示例:

java 复制代码
   <c:forEach items="${collection}" var="item">
       <!-- 内容 -->
   </c:forEach>
  1. <c:url>:用于生成URL,可以附加参数。

用法示例:

java 复制代码
   <c:url value="/path/to/page.jsp" var="url">
       <c:param name="param1" value="${value1}" />
       <c:param name="param2" value="${value2}" />
   </c:url>
   <a href="${url}">Link</a>
  1. <c:import>:用于导入其他页面的内容。

用法示例:

java 复制代码
    <c:import url="/path/to/page.jsp" />
  1. <c:redirect>:用于重定向到其他页面。

用法示例:

java 复制代码
    <c:redirect url="/path/to/page.jsp" />

这些是常用的JSTL标签及其功能和用法。JSTL标签库提供了丰富的标签,可以简化JSP页面中的逻辑处理和展示,使得页面代码更加清晰和易于维护。在使用JSTL标签之前,需要在JSP页面中引入JSTL标签库的声明,例如:

java 复制代码
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

20、在Servet3.0中文件上传的实现方法和核心代码是什么?

在Servlet 3.0中,文件上传可以通过javax.servlet.http.Part接口和javax.servlet.annotation.MultipartConfig注解来实现。

下面是文件上传的核心代码示例:

  1. 在Servlet类上添加@MultipartConfig注解,指定文件上传的配置:
java 复制代码
   import javax.servlet.annotation.MultipartConfig;
   import javax.servlet.http.HttpServlet;
   import javax.servlet.http.HttpServletRequest;
   import javax.servlet.http.HttpServletResponse;
   
   @MultipartConfig(
       fileSizeThreshold = 1024 * 1024, // 设置文件大小阈值
       maxFileSize = 1024 * 1024 * 5, // 设置最大文件大小
       maxRequestSize = 1024 * 1024 * 10 // 设置最大请求大小
   )
   public class FileUploadServlet extends HttpServlet {
       // Servlet代码
   }
  1. 在Servlet的doPost()方法中处理文件上传:
java 复制代码
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // 获取上传的文件
       Part filePart = request.getPart("file"); // "file"为HTML表单中文件上传控件的name属性值
       String fileName = filePart.getSubmittedFileName();
       InputStream fileContent = filePart.getInputStream();
       
       // 处理文件内容
       // ...
   }

在上述代码中,@MultipartConfig注解用于配置文件上传的一些参数,包括文件大小阈值、最大文件大小和最大请求大小等。doPost()方法中,通过request.getPart("file")获取上传的文件,其中"file"是HTML表单中文件上传控件的name属性值。然后可以通过getSubmittedFileName()获取文件名,通过getInputStream()获取文件内容的输入流,进行进一步的处理。

需要注意的是,Servlet 3.0中的文件上传需要在HTML表单中设置enctype属性为multipart/form-data,以支持文件上传:

html 复制代码
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="Upload">
</form>

通过以上代码示例,你可以在Servlet 3.0中实现文件上传功能。在实际应用中,你可以根据需要对文件进行进一步的处理,例如保存文件到本地或将文件内容存储到数据库中。

其次我们还有一种方法

  1. 首先,需要在web.xml文件中配置Servlet和Servlet映射。例如:
XML 复制代码
<servlet>
    <servlet-name>FileUploadServlet</servlet-name>
    <servlet-class>com.example.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>FileUploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
</servlet-mapping>
  1. 创建一个继承自HttpServlet的类,如FileUploadServlet,并重写doPost方法。在doPost方法中,使用request对象的getPart方法获取上传的文件,然后将其保存到服务器的指定目录。
java 复制代码
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取上传的文件
        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();
        InputStream inputStream = filePart.getInputStream();
        // 将文件保存到服务器的指定目录
        File uploads = new File("D:/uploads");
        File file = new File(uploads, fileName);
        if (!uploads.exists()) {
            uploads.mkdir();
        }
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        byte[] bytes = new byte[1024];
        int length;
        while ((length = inputStream.read(bytes)) > 0) {
            file.write(bytes, 0, length);
        }
        inputStream.close();
        // 返回成功信息
        response.setContentType("text/html");
        response.getWriter().println("文件上传成功!");
    }
}

这样,当用户通过表单提交文件时,Servlet会接收到文件并将其保存到服务器的指定目录。

21、 一个JSP页面由那几部分组成?

一个JSP页面由以下几部分组成:

1.指令(Directive):指令用于设置JSP页面的一些全局属性和规则。

常见的指令有:

page 指令:用于设置页面的属性,如编码、缓存等。

include 指令:用于包含其他JSP页面或静态文件。

2.声明(Declaration):声明部分用于定义JSP页面中使用的变量、方法等。声明的内容会被自动插入到生成的Servlet类中。

3.脚本(Scriptlet):脚本部分用于编写Java代码片段,可以在其中进行逻辑处理、数据操作等。脚本使用 <% %> 标签包裹。

4.表达式(Expression):表达式部分用于在页面中输出变量或表达式的值。表达式会自动转化为字符串,并插入到生成的Servlet类中。表达式使用 ${ } 标签包裹。

5.声明式标签(Declaration Tag) :声明式标签用于在JSP页面中调用自定义标签库中定义的标签。声明式标签使用 <mytag:tagname> 的形式进行调用。

  1. 动作标签(Action Tag) :动作标签用于在JSP页面中执行特定的操作,如跳转、循环、条件判断等。

常见的动作标签有 <jsp:forward> 、 <jsp:include> 、 <c:forEach> 等。

  1. 静态内容 :静态内容指的是不需要动态生成的部分,如HTML标签、文本等。 一个JSP页面可以根据需要使用以上的各个部分,以实现动态生成页面、逻辑处理和数据展示等功能。

22、什么是MVC模式,其主要特点是什么?

MVC(Model View Controller)是一种软件设计模式,用于组织和分离应用程序的各个组件,以实现高内聚、低耦合的架构。MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。

主要特点如下:

  1. 模型(Model) :模型表示应用程序的数据和业务逻辑。它负责处理数据的存储、检索、操作和验证。模型不依赖于视图和控制器,可独立于其他组件进行测试和修改。

  2. 视图(View) :视图负责展示模型的数据给用户,并处理用户的输入。它通常是用户界面的一部分,可以是HTML页面、图形界面等。视图不应包含业务逻辑,只负责显示数据和与用户交互。

  3. 控制器(Controller) :控制器接收用户的输入,并根据输入调用相应的模型和视图来处理请求。它负责协调模型和视图之间的交互,并根据业务逻辑来处理用户请求。

MVC模式的主要特点包括:

  1. 分离关注点 :MVC模式将应用程序的不同关注点分离开来,使得模型、视图和控制器可以独立开发、测试和修改,提高了代码的可维护性和可重用性。
  2. 低耦合 :模型、视图和控制器之间通过定义清晰的接口进行交互,彼此之间的依赖关系较弱,降低了组件之间的耦合度。
  3. 可扩展性 :由于各个组件之间的分离,可以方便地对模型、视图和控制器进行扩展和修改,而不会影响到其他组件。
  4. 易于测试 :模型、视图和控制器的独立性使得单元测试和集成测试变得更加容易,可以更好地验证每个组件的功能。

MVC模式被广泛应用于Web应用程序和桌面应用程序的开发中,提供了一种清晰、可维护和可扩展的架构。

23、常见的会话跟踪技术包括哪些?各自的特点是什么?

常见的会话跟踪技术包括以下几种:

  1. 基于Cookie的会话跟踪

特点 :通过在客户端存储标识会话的Cookie来进行会话跟踪。服务器端根据客户端发送的Cookie来识别和管理会话状态。

优点 :简单易用,客户端支持性好,可跨多个页面和多个会话保持状态。

缺点 :Cookie可能被禁用或删除,存在安全性和隐私问题,存储空间有限。

  1. URL****重写会话跟踪

特点 :通过在URL中附加会话标识参数来进行会话跟踪,如`http://example.com/page?sessionid=12345\`。

优点 :不依赖于客户端的Cookie支持,可跨多个页面和多个会话保持状态。

缺点 :URL暴露会话标识,存在安全风险,URL过长或复杂会影响用户体验。

  1. 隐藏表单域会话跟踪

特点 :通过在HTML表单中添加隐藏的输入域来存储会话标识,提交表单时会将会话标识传递到服务器。

优点 :不依赖于客户端的Cookie支持,可在表单提交时传递会话标识。

缺点 :需要在每个表单中添加隐藏域,增加了页面的复杂度,不适用于非表单提交的情况。

  1. Session****会话跟踪

特点 :服务器端会话管理技术,通过在服务器端存储会话数据来跟踪用户会话状态。

优点 :安全可靠,不依赖于客户端的支持,可存储大量会话数据。

缺点 :可能占用服务器资源,需要进行会话状态的有效管理和清理。

注:每种会话跟踪技术都有其适用的场景和特点,开发人员需要根据具体的应用需求和环境特点选择合适的会话跟踪技术。

24、Ajax异步传输的实现方法和步骤是什么?

Ajax(Asynchronous JavaScript and XML)是一种通过在后台与服务器进行异步数据交互的技术,实现页面的无刷新更新。

以下是Ajax异步传输的一般实现方法和步骤:

1.创建XMLHttpRequest对象:在JavaScript中创建XMLHttpRequest对象,用于发送异步请求和接收服务器响应。

2.设置回调函数:为XMLHttpRequest对象设置回调函数,用于处理服务器响应的数据。

3.配置请求参数:使用XMLHttpRequest对象的open()方法设置请求的方法(GET或POST)、URL和是否异步。

4.发送请求:使用XMLHttpRequest对象的send()方法发送请求。对于GET请求,可以将请求参数附加在URL后面;对于POST请求,需要将请求参数作为send()方法的参数传递。

5.服务器端处理请求:服务器接收到请求后,根据请求的方法和参数进行相应的处理,并生成响应数据。

6.处理服务器响应:当XMLHttpRequest对象接收到服务器响应后,触发回调函数进行处理。可以通过XMLHttpRequest对象的readyState属性和status属性判断请求的状态和结果。

7.更新页面:根据服务器响应的数据,使用JavaScript动态更新页面的内容,实现无刷新更新。 通过以上步骤,Ajax可以实现在不刷新整个页面的情况下,与服务器进行数据交互,实现局部页面的更新和数据加载。

25、使用MVC模式实现用户登录验证的实现代码是什么?如何撰写?

使用MVC模式实现用户登录验证的代码可以分为模型(Model)、视图(View)和控制器(Controller)三个部分。以下是一个简单的示例代码:

模型(Model

java 复制代码
public class User {

    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public boolean validatePassword(String password) {
        return this.password.equals(password);
    }
}

视图(View

java 复制代码
import java.util.Scanner;

public class LoginView {

    private Scanner scanner;

    public LoginView() {
        scanner = new Scanner(System.in);
    }

    public String getUsername() {
        System.out.print("请输入用户名:");
        return scanner.nextLine();
    }

    public String getPassword() {
        System.out.print("请输入密码:");
        return scanner.nextLine();
    }

    public void showLoginSuccess() {
        System.out.println("登录成功!");
    }

    public void showLoginFailure() {
        System.out.println("用户名或密码错误,请重新登录!");
    }
}

控制器(Controller

java 复制代码
public class LoginController {

    private LoginView view;

    public LoginController(LoginView view) {
        this.view = view;
    }

    public void login() {
        String username = view.getUsername();
        String password = view.getPassword();
        User user = new User("admin", "password"); // 假设有一个用户对象
        if (user.validatePassword(password)) {
            view.showLoginSuccess();
        } else {
            view.showLoginFailure();
        }
    }
}

主程序(Main

java 复制代码
public class Main {
    public static void main(String[] args) {
        LoginView view = new LoginView();
        LoginController controller = new LoginController(view);
        controller.login();
    }
}

在这个示例中,模型(Model)部分定义了一个用户类(User),包含用户名和密码属性,并提供验证密码的方法。

视图(View)部分包含了与用户交互的方法,如获取用户输入的用户名和密码,以及显示登录成功或失败的消息。

控制器(Controller)部分定义了登录方法,用于处理用户的登录请求。在登录方法中,获取用户输入的用户名和密码,并通过模型中的用户对象进行密码验证,根据验证结果显示相应的消息。

主程序(Main)中创建了视图和控制器对象,并调用控制器的登录方法来启动登录流程。

以上代码只是一个简单的示例,实际应用中可能需要更复杂的逻辑和数据存储方式。根据具体需求,可以在模型、视图和控制器中添加更多的功能和方法来实现用户登录验证的功能。

26、Cookie的工作原理是什么?Cookie技术的局限性是什么?

Cookie是一种在客户端(浏览器)和服务器之间传递数据的机制。

它的工作原理如下:

  1. 服务器设置Cookie :当服务器需要向客户端发送数据时,通过HTTP响应头中的Set-Cookie字段将数据以键值对的形式发送给客户端。例如:Set-Cookie: key=value。
  2. 客户端保存Cookie :当客户端(浏览器)接收到服务器发送的Cookie时,会将Cookie保存在本地的Cookie存储区域中,通常是在浏览器的内存或硬盘上。
  3. 客户端发送Cookie :当客户端再次向服务器发送请求时,会在HTTP请求头中自动携带之前保存的Cookie信息,通过Cookie字段将数据发送给服务器。
  4. 服务器读取Cookie :服务器接收到客户端发送的请求后,会从HTTP请求头中的Cookie字段读取数据,进行相应的处理。
  5. 服务器更新Cookie :服务器可以通过HTTP响应头中的Set-Cookie字段更新Cookie的值,以实现对客户端数据的更新。

Cookie技术的局限性包括:

  1. 容量限制:每个Cookie的大小通常有限制,不同的浏览器可能有不同的限制,一般为几KB到几十KB。如果存储的数据超过了限制,就无法正常使用Cookie。
  2. 安全性问题:Cookie中的数据是明文传输的,如果存储了敏感信息,可能会被恶意用户截获并进行篡改或窃取。为了增加安全性,可以对Cookie进行加密或使用HTTPS协议传输。
  3. 隐私问题:Cookie是存储在客户端的,可能会被其他网站或广告商等进行跨站追踪,收集用户的浏览行为和个人信息。
  4. 不适用于跨域请求:由于浏览器的同源策略限制,Cookie只能在同一域名下的请求中发送和接收,无法在跨域请求中使用。
  5. 对于移动端应用的限制:对于移动端应用,Cookie的使用有一定限制,因为移动端应用通常是通过原生代码或者其他技术进行开发,无法直接使用浏览器的Cookie机制。

尽管存在一些局限性,但Cookie仍然是一种常用的数据传递和存储机制,广泛应用于网站的用户认证、购物车、个性化推荐等功能。

27、Struts2和SpringMVC框架的核心是什么?

Struts2和Spring MVC框架的核心是不同的。

Struts2的核心:Struts2的核心是基于MVC(Model-View-Controller)模式的Web应用程序框架。它的核心组件包括:

  1. 控制器(Controller) :Struts2使用Action作为控制器的组件,负责接收和处理用户的请求,并调用相应的业务逻辑进行处理。

  2. 模型(Model) :Struts2通过值栈(ValueStack)来管理和操作数据模型。

  3. 视图(View) :Struts2支持多种视图技术,如JSP、FreeMarker、Velocity等,用于展示数据给用户。

  4. 拦截器(Interceptor) :Struts2的拦截器是其核心特性之一,用于在请求的处理过程中进行预处理和后处理,比如身份验证、日志记录等。

5.配置文件:Struts2使用XML或注解来配置应用程序的行为和组件之间的关系,包括映射URL、配置拦截器、配置视图等。

Spring MVC的核心: Spring MVC的核心也是基于MVC模式的Web应用程序框架,它的核心组件包括:

  1. 控制器(Controller) :Spring MVC使用@Controller注解来标识控制器,负责接收和处理用户的请求,并调用相应的业务逻辑进行处理。

  2. 模型(Model) :Spring MVC通过模型对象和数据绑定机制来支持数据模型的管理和操作。

  3. 视图(View) :Spring MVC支持多种视图技术,如JSP、Thymeleaf、Freemarker等,用于展示数据给用户。

  4. 拦截器(Interceptor) :Spring MVC的拦截器用于在请求的处理过程中进行预处理和后处理,比如身份验证、日志记录等。

  5. 配置文件 :Spring MVC使用XML或注解来配置应用程序的行为和组件之间的关系,包括映射URL、配置拦截器、配置视图解析器等。

总结来说,Struts2和Spring MVC都是基于MVC模式的Web框架,它们的核心组件包括控制器、模型、视图和配置文件,但在实现细节、特性和使用方式上有一些差异。选择使用哪个框架取决于项目需求、团队经验和个人喜好。

相关推荐
疯狂的沙粒3 分钟前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员18 分钟前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐20 分钟前
前端图像处理(一)
前端
程序猿阿伟28 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒29 分钟前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪38 分钟前
AJAX的基本使用
前端·javascript·ajax
力透键背41 分钟前
display: none和visibility: hidden的区别
开发语言·前端·javascript
程楠楠&M1 小时前
node.js第三方Express 框架
前端·javascript·node.js·express
盛夏绽放1 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
想自律的露西西★1 小时前
用el-scrollbar实现滚动条,拖动滚动条可以滚动,但是通过鼠标滑轮却无效
前端·javascript·css·vue.js·elementui·前端框架·html5