Featured image of post JavaWeb期末复习

JavaWeb期末复习

JavaWeb知识点和代码整理

# 题目类型

  • 选择(10分) 10题
  • 填空(10分) 10题
  • 问答(30分) 4题
  • 编程题(30分) 3-4题
  • 综合题(20分)

# 上机题整理

这里只存放核心的代码,完整的程序见Gitee仓库

# 使用Maven

通过使用Maven可以让程序自动配置和导入包,不必自己手动配置和导入,非常方便,推荐大家使用。

我的配置文件已经把考试会用的包都导入了,包括Servlet、JSP、JSTL、MySQl驱动,版本都已经调整为最佳,保证开箱即用。

  1. 新建项目,选择Maven,直接下一步

    step1

  2. 填写项目名称和目录位置,其他的可填可不填

    step2

  3. pom.xml文件增加这样一句<packaging>war</packaging>

    接着粘贴下面的代码,并点击右上角的图标应用(或者使用快捷键Ctrl+Shift+O

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    <dependencies>
        <!-- servlet 依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- jsp 依赖 -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <!-- jstl -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- standard标签库 -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
    </dependencies>
    

    step3

  4. 在左边srcmain这个目录下建立一个名叫webapp的目录,再这下面建立一个名叫WEB-INF的目录,再在其中建立web.xml这个文件

    step4

  5. 在里面填入下面的内容

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <!--默认启用EL表达式-->
        <jsp-config>
            <jsp-property-group>
                <url-pattern>*.jsp</url-pattern>
                <el-ignored>false</el-ignored>
            </jsp-property-group>
        </jsp-config>
    </web-app>
    

这样就配置好了,如果你还是觉得麻烦,可以下载我这个配置好的懒人包,解压即可使用,注意在IDEA打开时要选择“信任MAVEN项目”,否则无法生效。

# Servlet生成三角形

  • 正三角

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num - i; j++) {
            out.print("&nbsp;");
        }
        for (int k = 0; k <= i * 2; k++) {
            out.print("*");
        }
        out.println("</br>");
    }
    
  • 倒三角

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    for (int i = num; i > 0; i--) {
        for (int j = num - i; j > 0; j--) {
            out.print("&nbsp;");
        }
        for (int k = (i * 2) - 1; k > 0; --k) {
            out.print("*");
        }
        out.println("</br>");
    }
    

# JSP生成乘法表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<table>
    <tbody>
    <%
       	String s = request.getParameter("num");
        int num = Integer.parseInt("".equals(s) ? "0" : s);
        for (int i = 1; i <= num; i++) {
            out.println("<tr>");
            for (int j = 1; j <= num; j++) {
                if (j <= i) {
                    out.println("<td>" + i + "*" + j + "=" + i * j + "</td>");
                }else{
                    out.println("<td></td>");
                }
            }
            out.println("</tr>");
        }
    %>
    </tbody>
</table>

# 登录界面,三次禁用

数据用数组存储application,但我没使用,如果要使用可以调用request.getServletContext()

用户信息存在session

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
@WebServlet(name = "Servlet3", value = "/Servlet3")
public class Servlet3 extends HttpServlet {
    private static final String[] USER_NAME = {"a", "b", "c"};
    private static final String[] PASSWORD = {"1", "2", "3"};

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if (username == null || password == null || "".equals(username) || "".equals(password)) {
            req.setAttribute("msg", "用户名或密码不能为空!");
            req.getRequestDispatcher("/3.jsp").forward(req, resp);
            return;
        }
        HttpSession mySession = req.getSession();
        int errTime = (int) (mySession.getAttribute("errTime") == null ? 0 : mySession.getAttribute("errTime"));
        Date dbDate = (Date) mySession.getAttribute("dbDate");
        Date nowDate = new Date();
        if (errTime >= 3) {
            if (dbDate.after(nowDate)) {
                req.setAttribute("msg", "您被禁止登录!");
                req.getRequestDispatcher("/3.jsp").forward(req, resp);
                return;
            } else {
                errTime = 0;
            }
        }
        int i;
        for (i = 0; i < USER_NAME.length; i++) {
            if (username.equals(USER_NAME[i]) && password.equals(PASSWORD[i])) {
                errTime = 0;
                req.setAttribute("msg", "登陆成功!");
                break;
            }
        }
        if(i>=USER_NAME.length)
        {
            errTime += 1;
            if (errTime >= 3) {
                //单位为毫秒
                nowDate.setTime(nowDate.getTime() + 1 * 60 * 1000);
            }
            req.setAttribute("msg", "用户名或密码错误!");

        }
        mySession.setAttribute("errTime", errTime);
        mySession.setAttribute("dbDate",nowDate);
        req.getRequestDispatcher("/3.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

# 用户认证

  • 不使用Filter

    1
    2
    3
    4
    5
    6
    7
    
    <%
        Object username = session.getAttribute("username");
        if(username==null){
            request.setAttribute("msg","您没有登陆");
            request.getRequestDispatcher("/4-1.jsp").forward(request,response);
        }
    %>
    
  • 使用Filter

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    //filterName:过滤器名称 urlPatterns:过滤的范围 过滤全部为"/*"
    @WebFilter(filterName = "Filter4", urlPatterns = "/4-3.jsp")
    public class Filter4 implements Filter {
        public void init(FilterConfig config) throws ServletException {}
    
        public void destroy() {}
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            Object username = req.getSession().getAttribute("username");
            if (username == null) {
                req.setAttribute("msg", "您没有登陆");
                req.getRequestDispatcher("/4-1.jsp").forward(req, resp);
            } else {
                chain.doFilter(request, response);
            }
        }
    }
    

# 录入用户信息并回显

如姓名爱好(checkbox数组)提交后,在界面上显示提交的信息

修改数据时,如何将原数据显示在表单中也在此段中。特别是select radio

使用EL表达式即可

注意点:

  • checkbox传递的值为数组,需使用request.getParameterValues("b");获取
  • 可以将数组转换为列表,方便使用相关方法
    • List<String> list = Arrays.asList(strArray); 只能查看,不支持修改和删除
    • ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)); 可以修改和删除
  • checkboxradio选中为checkedselect中的optionselected
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form method="post" action="${pageContext.request.contextPath}/Servlet5">
    <label for="a">文本框</label>
    <input type="text" id="a" name="a" value="${A}"/>
    <br/>
    <label for="b">多选框</label>
    <input type="checkbox" id="b" name="b" value="1" ${BL.contains("1")?"checked":""}/>
    <input type="checkbox" name="b" value="2" ${BL.contains("2")?"checked":""}/>
    <input type="checkbox" name="b" value="3" ${BL.contains("3")?"checked":""}/>
    <br/>
    <label for="c1">单选框 4</label>
    <input type="radio" id="c1" name="c" value="4" ${"4".equals(C)?"checked":""}/>
    <label for="c2">单选框 5</label>
    <input type="radio" id="c2" name="c" value="5" ${"5".equals(C)?"checked":""}/>
    <br/>
    <label for="d">下拉框</label>
    <select name="d" id="d">
        <option value="6" ${"6".equals(D)?"selected":""}>6</option>
        <option value="7" ${"7".equals(D)?"selected":""}>7</option>
        <option value="8" ${"8".equals(D)?"selected":""}>8</option>
    </select>
    <br/>
    <input type="submit" value="提交">
</form>

# 请求转发、重定向,实现传值

请求转发:

  • request.setAttribute("D", d);
  • 或者存放到Session里request.getSession().setAttribute("D", d);

重定向:

  • 只能放在Session里
  • 或者通过构造URL参数传递,如response.sendRedirect("/1.jsp?a="+a+"&b="+b);

# 在servlet如何使用jsp:usebean jsp来接收form内的值

jsp中使用下面的代码

1
2
<jsp:useBean id="s" class="yzu.calc" scope="request" />
<jsp:setProperty name="s" property="*" />

servlet中使用

1
2
request.getRequestDispatcher("getForm.jsp").include(request,response);
calc mybean=(calc)request.getAttribute("s");

# 从web表单接收数据

  • request.getParameter
  • request.getParameterValues

# 数据库实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/web?serverTimezone=Asia/Shanghai&characterEncoding=utf-8";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";

//加载驱动
try {
    Class.forName(DRIVER);
    connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
    e.printStackTrace();
}

if (connection != null) {
    String sql = "select * from user where name=?";
    PreparedStatement pstm = null;
    ResultSet rs = null;
    try {
        //加载SQL语句
        pstm = connection.prepareStatement(sql);
        //填入变量
        pstm.setObject(1, username);
        //执行SQL(查询)
        rs = pstm.executeQuery();
        //执行SQL(增删改)
        updateRows = pstm.executeUpdate();
        //读取数据(多行使用while)
        if (rs.next()) {
            dbPassword = rs.getString("password");
            dbDate = new Date(rs.getTimestamp("time").getTime());
            dbErrorTime = rs.getInt("error_count");
        }
        //释放资源
        rs.close();
        pstm.close();
        connection.close();
    }SQLException (e) {
        e.printStackTrace();
    }

# 注册用户 多个信息

不懂什么意思,有懂哥可以评论区留言

# DB CRUD查询组合查询不需要分页

见上面

# 用会话对象实现购物车的CRUD商品名称,单价,数量购物车列表,总价

具体代码见仓库Servlet6

# 问答题

# C/S B/S优缺点

C/S架构

全称是Client/Server,即客户端服务器端架构

优点:

  • C/S架构的界面和操作可以很丰富。
  • 安全性能可以很容易保证,实现多层认证也不难。
  • 由于只有一层交互,因此响应速度较快。

缺点:

  • 适用面窄,通常用于局域网中。
  • 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
  • 维护成本高,发生一次升级,则所有客户端的程序都需要改变。

B/S架构

全称为Browser/Server,即浏览器/服务器结构。

优点:

  • 客户端无需安装,有Web浏览器即可。
  • BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
  • BS架构无需升级多个客户端,升级服务器即可。

缺点:

  • 在跨浏览器上,BS架构不尽如人意。
  • 表现要达到CS程序的程度需要花费不少精力。
  • 在速度和安全性上需要花费巨大的设计成本,这是BS架构的最大问题。

# JSTL EL JDBC VO DAO MVC JSP中英文全称

  • JSTL:Java server pages standarded tag library,JSP标准标签库
  • EL:Expression Language,EL表达式
  • JDBC:Java Database Connectivity,Java数据库连接
  • VO:Value Object,值对象
  • DAO:Data Access Object,数据库访问对象
  • MVC:Model View Controller,模型 视图 控制器
  • JSP:Java Server Pages,JAVA服务器页面

# 多层架构的优点

  • 高内聚低耦合,便于团队开发

    内聚:一个模块内各个元素彼此结合的紧密程度;

    耦合:一个软件结构内不同模块之间关联程度的度量。

    在团队开发中,分层可以让软件开发人员专注于自己负责的层,而不必关心其他层的设计,也不必担心自己的设计会影响其它层。如果不分层,根本不可能进行团队开发,只会一团糟。

  • 使软件升级和维护更为容易

    分层设计使得程序结构清晰,升级和维护都变得十分容易,更改层的具体实现代码,只要层接口保持稳定,其他层可以不必修改。即使层的接口发生变化,也只影响上层和下层,修改工作量小而且错误可以控制,不会带来意外的风险。

# MVC的特点和优点

MVC主要分模型、视图、控制器三层。

  • 模型(model)

    它是应用程序的主体部分,主要包括业务逻辑模块和数据模块。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性

  • 视图(view)

    用户与之交互的界面、在 web 中视图一般由 jsp,html 组成

  • 控制器(controller)

    接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的作用

优点:

  • 降低代码耦合性。在 MVC 模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其他层中的代码。
  • 有利于分工合作。在 MVC 模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可进行开发视图层中的 JSP,而对业务熟悉的人员可开发业务层,而其他开发人员可开发控制层。
  • 有利于组件的重用。如控制层可独立成一个能用的组件,表示层也可做成通用的操作界面。可以为一个模型在运行时同时建立和使用多个视图。

# GET、POST特点和优缺点

GET

查询字符串(名称/值对)是在GET请求的URL中发送的

优点:

  • GET请求可被缓存
  • GET请求速度快
  • GET请求可被收藏为书签
  • GET请求保留在浏览器历史记录中

缺点:

  • GET请求不安全
  • GET请求有url长度限制

POST

查询字符串(名称/值对)是在POST请求的HTTP消息主体中发送的

优点:

  • POST请求对数据长度没有要求
  • POST请求相对GET请求更安全

缺点:

  • POST请求不会被缓存
  • POST请求速度慢

# 重定向与请求转发的优缺点 实现的核心代码

重定向

优点:

  • 不限制应用范围,可以重定向到服务器内部其他资源,也可以是外部的应用

缺点:

  • 重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间

核心代码:response.sendRedirect("请求地址")

请求转发

优点:

  • 安全性高,在内部发生跳转,浏览器地址不变
  • 转发只需要一次请求,就可以访问至少两个servlet或jsp页面。

缺点:

  • 只能在同一web应用内使用,不能转发到外部的url地址。

核心代码:request.getRequestDispatcher("URL地址").forward(request, response)

# JSP Servlet 区别与联系

区别:

  • jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
  • Servlet中没有内置对象,Jsp中有内置对象。
  • Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容;JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容

联系:

  • jsp是对servlet的一种高级封装。本质还是servlet。
  • jsp会由TomCat自动编译成“类servlet”。

# JSP内置对象

对象 描述
request HttpServletRequest 接口的实例
response HttpServletResponse 接口的实例
out JspWriter类的实例,用于把结果输出至网页上
session HttpSession类的实例
application ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例
pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page 类似于Java类中的this关键字
Exception Exception类的对象,代表发生错误的JSP页面中对应的异常对象

# JavaBean相关动作标记有哪些,用代码说明之

语法 描述
jsp:useBean 寻找或者实例化一个JavaBean。
jsp:setProperty 设置JavaBean的属性。
jsp:getProperty 输出某个JavaBean的属性。

<jsp:useBean id = "name" class = "package.class" scope= "page | request | session | application" />

其中:

1)id

表示 Bean 实例化对象的变量名,可以在指定范围内使用该变量名。

2)class

表示需要实例化 Bean 的类路径,指定的类必须包含 public 且无参数的构造方法。

3)scope

指定 Bean 的作用域,取值为:

  • page:只能在当前页面使用该 Bean 对象;
  • request:只能在一次请求范围内使用该 Bean 对象;
  • session:只能在一次会话范围内使用该 Bean 对象;
  • application:可以在整个应用范围内使用该 Bean 对象。

<jsp:setProperty name = "beanName" property = "attributeName" value = "attributeValue"/>

<jsp:setProperty> 通常和 <jsp:useBean> 一起使用,分为两种情况。

  • <jsp:useBean> 标签外使用<jsp:setProperty>

    以上情况,无论 <jsp:useBean> 是否实例化了 User 对象,<jsp:setProperty> 都会执行。

  • <jsp:useBean> 标签里使用 <jsp:setProperty>

    只有 <jsp:useBean> 实例化了 User 对象,<jsp:setProperty> 才会执行

<jsp:getProperty name = "beanName" property = "attributeName">

其中,name 指定需要获取属性的 Bean 的名称;property 指定 Bean 的属性,即 Bean 类中的属性。

当 property 的取值为 * 时,要求 Bean 属性的名称与类型要与 request 请求中参数的名称及类型一致,以便用 Bean 中的属性来接收客户输入的数据,系统会根据名称来自动匹配。

注意:<jsp:setProperty><jsp:getProperty> 动作都会按照 page、request、session 和 application 的顺序依次查找指定 Bean 的实例对象,直到第一个实例被找到。如果任何范围内都不存在这个 Bean 实例,则会拋出异常。

# EL与作用城相关的隐含对象有哪些

内置对象 说明
pageScope 获取 page 范围的变量
requestScope 获取 request 范围的变量
sessionScope 获取 session 范围的变量
applicationScope 获取 application 范围的变量
param 相当于 request.getParameter(String name),获取单个参数的值
paramValues 相当于 request.getParameterValues(String name),获取参数集合中的变量值
header 相当于 request.getHeader(String name),获取 HTTP 请求头信息
headerValues 相当于 request.getHeaders(String name),获取 HTTP 请求头数组信息
initParam 相当于 application.getInitParameter(String name),获取 web.xml 文件中的参数值
cookie 相当于 request.getCookies(),获取 cookie 中的值
pageContext 表示当前 JSP 页面的 pageContext 对象

EL 表达式可以输出 4 种属性范围的内容。如果在不同的属性范围中设置了同一个属性名称,则按照 page、request、session、application 的顺序依次查找。

${person.name} person存放在request属性中person对象的类yzu.Person,对象的java代码是什么(JavaBean) <%=((yzu.Person)request.getAttribute("person")).getName()%>

# 过滤器与Servlet区别与联系,他有什么作用

过滤器(Filter):对Request请求起到过滤的作用,作用在Servlet之前

Servlet:处理Request请求和Response响应

# Java和JSP的区别

  • Java是一种通用的计算机编程语言,它是并发的,基于类的,面向对象的,并且专门设计为具有尽可能少的实现依赖性。而JSP是一种技术,可帮助软件开发人员基于HTML,XML或其他文档类型创建动态生成的Web页面。
  • Java applet是使用Java编程语言编写的。JSP使用“scriptlet元素”(Java代码)和“标记”(通常是HTML或XML)的混合编程,以提供数据驱动(“动态”)网页。
  • Java为面向对象语言,JSP可以理解为一种脚本
  • Java主要负责逻辑,业务处理,而JSP主要负责页面展现
  • JSP的本质是servlet,而servlet的本质是Java类

# JSP开发的优点

  • 将内容的生成和显示分离

    借助jsp技术,web页面发开人员可以使用html或者xml标签来设计和格式化最终页面,使用jsp标签或者脚本程序来生成动态web页面的内容(页面的内容是根据请求来变化的,例如,请求账户信息或者特定的一本书的价格)。生成内容的逻辑被封装在标签和javabean组件中,并且捆绑在脚本程序中,所有的脚本程序在服务器端运行。因此,其他人能够方便地编辑和使用jsp页面,而不影响内容的生成。

  • 强调可重用的组件

    jsp页面可借助可重用的、跨平台的组件来执行应用程序所要求的极为复杂的业务逻辑。开发人员能够共享和交换执行普通操作的组件,或者让这些组件被别的开发人员或开发团队所使用。基于组件的方法加速了总体开发进程,并且使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。

  • 采用标签简化页面开发

    通过使用jsp提供的标准标签库,web页面开发人员能够访问和实例化javabean组件、设置或者检索组件属性、下载applet以及执行用其他方法更难于编码和耗时的功能。此外,web页面开发人员还可以为常用功能创建自己的标签库,这是的web页面开发人员能够使用熟悉的工具盒如同标签一样的执行特定功能的构件来工作。

  • 一次编写、处处运行

    由于jsp页面的内置脚本是基于java语言的,而且所有的jsp页面都被编译为java servlet,因此jsp页面就具有java技术的所有好处,包括健壮性和安全性等。作为java平台的一部分,jsp拥有java语言“一次编写,处处运行”的特点。jsp几乎可以运行于所有的平台,如windows nt、linux、unix等。

  • 更高的效率和安全性

    jsp程序在执行之前先被编译成字节码文件,字节码文件有java虚拟机解释执行,比源代码解释的效率高。此外,服务器端还有字节码的cache机构,能提高字节码的访问效率。第一次调用jsp网页可能稍慢,因为它被编译成cache,以后就快的多了。同时,jsp源程序不大可能被下载,特别是javabean程序,完全可能放到不对外的目录中。

Licensed under CC BY-NC-SA 4.0
最后更新于 2022-01-06 23:20:00