day42_jsp

今日内容

零、 复习昨日
一、JSP
二、EL
三、JSTL
四、MVC

零、 复习昨日


一、JSP

1.0 引言

现有问题

在之前学习Servlet时,服务端通过Servlet响应客户端页面,有什么不足之处?

  • 开发方式麻烦:继承父类、覆盖方法、配置Web.xml或注解
  • 代码修改麻烦:重新编译、部署、重启服务
  • 显示方式麻烦:获取流、使用println(“”);逐行打印
  • 协同开发麻烦:UI负责美化页面,程序员负责编写代码。UI不懂Java,程序员又不能将所有前端页面的内容通过流输出

1.1 介绍

JSP: Java Server Pages,简单编写页面.

JSP可以简化之前响应时写页面的步骤.

JSP本质是Servlet.

JSP = html + java

1.2 入门示例

需求: 编写index.jsp作为登录页面,登录页输入用户名,发请求登录,将登录信息展现到ok.jsp页面

登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>

<form action="/login" method="post">
    用户名<input type="text" name="username"><br>
    <input type="submit" value="登录"><br>
</form>

</body>
</html>

后台Servlet

package com.qf.servlet;

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 java.io.IOException;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        // 接收请求数据
        String username = req.getParameter("username");
        System.out.println(username );
        // 调用业务层...

        // 假设直接登录成功,跳转页面至ok.jsp
        req.setAttribute("username",username);
        // 因为是请求域,只能使用请求转发,否则另一个servlet接收不到数据
        req.getRequestDispatcher("/ok.jsp").forward(req,resp);


    }
}

ok.jsp

<%--
  +------------------+
      天 道 酬 勤    
  +------------------+
  Created by QiuShiju.
  Date: 2023/5/26
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<body>
<h1>登录成功,欢迎...<%=request.getAttribute("username")%></h1>
</body>
</html>

1.3 原理[重点]

JSP = HTML+Java , JSP是Servlet

JSP实现原理
image-20230524200535949

服务器启动,将编写的jsp文件,转译成java文件,再编译成class文件运行

转译后的文件在

C:\Users\用户名\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\684fa9cd-6aa0-42f4-a531-5bd22be4fbf5\work\Catalina\localhost\day43\org\apache\jsp

打开转译后文件,发现原本在jsp写的标签,其实是使用响应对象在拼接字符串

image-20230524202750143

另外, 转译后的jsp文件继承了org.apache.jasper.runtime.HttpJspBase类,该类又继承HttpServlet,那么就说明我们编写JSP本质就是Servlet

1.4 脚本[重点]

jsp内的脚本,可以在标签内写java代码.

有两种

  • <% java代码 %>

     <body>
      <hr>
      <hr>
      <h2>java脚本1</h2>
      <%
            Object obj = new Object();
            System.out.println(obj );
            out.write(obj.toString());
      %>
      <hr>
      <hr>
      <%
        out.write(obj.toString());
      %>
      </body>
    

    ps: 注意结合转译 后的index_jsp.java去查看

  • <%=代码 %>,这种方式是一种简化,简化输出用的

    <%--  <%= 相当于out,直接将结果输出到浏览器    --%>
    <%=new Object() %>
    

    应用: 产生10行表格

    IDUsernamePassword
       <table border="2" align="center">
            <tr>
                <td>ID</td>
                <td>Username</td>
                <td>password</td>
            </tr>
      <%
          for (int i = 0; i < 10; i++) {
      %>
            <tr>
                <td>ID</td>
                <td>Username</td>
                <td>password</td>
            </tr>
      <%
            }
      %>
    

1.5 指令

JSP的指令,主要是对当前JSP页面设置属性.

  • page: 设置当前当前jsp的属性 [重要]

  • taglib: 用来给当前jsp引入jstl标签库

  • include: 包含,将其他内容包含至当前页面 [了解]

  • 指令语法

    <%@指令名 属性名=属性值 %>

1.5.1 page

语法: <%@page 属性=“值” 属性=“值” %>

属性:

属性描述
contentType指定当前JSP页面的MIME类型和字符编码格式
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面
import导入要使用的Java类
language定义JSP页面所用的脚本语言,默认是Java
session指定JSP页面是否使用session。默认为true立即创建,false为使用时创建
pageEncoding指定JSP页面的解码格式
  • ​ errorPage : 当前jsp中如果有异常,跳转至该页面

image-20230524202801447

  • import: 在当前jsp导入其他java包

image-20230524202809623

  • ​ session: true|false,默认是true,设置当前页面是否可以直接使用session对象

​ false,就是没有session对象,使用时编译报错

1.5.2 taglib

语法: <%@ taglib uri=“” prefix=“” %>

用法: 引入jstl标签库

1.5.3 include

语法: <%@ include file=“路径”>

作用: 将file指定路径的文件加入到当前页面,已达到复用的效果

场景:页面的头尾重复部分的内容.

1.6 内置对象

内置对象,就是jsp页面中可以直接使用的对象.

对象名类型说明
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
sessionjavax.servlet.http.HttpSession由session=“true”开关
applicationjavax.servlet.ServletContext
configjavax.servlet.ServletConfig
exceptionjava.lang.Throwable由isErrorPage=“false”开关
outjavax.servlet.jsp.JspWriterjavax.servlet.jsp.JspWriter
pageContextjavax.servlet.jsp.PageContext
pagejava.lang.Object当前对象this当前servlet实例

这九个对象可以在转译后的xxx_jsp.java中找到这些对象

通过pageContext获得其他八个对象

1.7 四大域(scope)[熟悉]

内置对象中有四个可以当做域对象,存取数据,分别是

解释值的范围
pageContext页面域只有当前页面能使用
request请求域在一次请求转发中有效
session会话域在一次会话中有效
application应用域在整个web应用中有效

四大域都有相同的取值赋值方法:

- 域对象.setAttribute("key",value);
- 域对象.getAttribute("key");

pageContext

二、 EL表达式

2.1 概念

EL表达式,主要用于简化取值操作.

2.2 作用

纯jsp取值: <%=request.getAttribute(“username”) %>

现在EL取值,${username}

作用: 简化取值操作

语法: ${域key}

2.3 取域中的值[重点]

四大域中的值都可以取

${key},如果四大域中key值一样,按照page–>request–>session–>application的顺序依次取值,取到值即停止.


如果四大域中key值一样,也可以指定取出某个域中的值

${域对象.key} -->  ${sessionScope.el}
-----------------------------------
<h2>存入四大域值,key=el</h2>
<%
    application.setAttribute("el","appValue");
    pageContext.setAttribute("el","pageValue");
    request.setAttribute("el","reqValue");
    session.setAttribute("el","seValue");
%>
<h3>el取值结果:${el}</h3>
<h3>指定取某个域的值: ${sessionScope.el}</h3>

2.4 取值[重点]

(字符串,基本类型,对象,数组,集合)

<%@ page import="com.qf.model.User" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %><%--
  +------------------+
      天 道 酬 勤    
  +------------------+
  Created by QiuShiju.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>取值</title>
</head>
<body>
<%
    //先向域中存值
    request.setAttribute("str","字符串");
    request.setAttribute("num",100);

    User user = new User( );
    user.setUsername("牛彩云");
    user.setPassword("123456");

    request.setAttribute("user",user);

    int[] array = {11,22,33};
    request.setAttribute("array",array);



    Map map = new HashMap();
    map.put("aka","阿浩");
    map.put("ak47","阿卡司机");
    request.setAttribute("map",map);

%>
<h2>取字符串:${str}</h2>
<h2>取数字:${num}</h2>
<h2>取对象:${user}</h2>
<!-- 对象取值是重点 -->
<h2>取对象的属性:${user.username}</h2>  
<h2>取出数组:${array[0]}</h2>
<h2>取出map:${map.get('aka')}</h2>
map取值${map['一']}<br>
map取值${map['二']}<br>
map取值${map['仨']}<br>
</body>
</html>

2.5 运算符

一样可以在el表达式是内部做运算: 算术,关系,逻辑,三目运算

<%--
  +------------------+
      天 道 酬 勤    
  +------------------+
  Created by QiuShiju.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>运算</title>
</head>
<body>
<%
    request.setAttribute("num",10);
    request.setAttribute("num2",null);
    request.setAttribute("sex",2);
%>
${num + 1}
${num - 1}
${num * 2}
${num / 2}
${num == 2}
${num != 2}
${num > 2}
${num < 2}
${num > 2 && num > 3}
${num < 2 || num > 3}
${empty num2}
${empty num}
${num > 2 ? '200':0}
<input type="radio" value="1" name="sex"  ${sex == 1?'checked':''} >男
<input type="radio" value="2" name="sex"  ${sex == 2?'checked':''}>女
</body>
</html>

2.6 隐式对象

EL表达式内部,可以直接使用的对象.

隐式对象解释
pageContextpage域
pageScopepage域
requestScope请求域
sessionScope会话域
applicationScope应用域
cookie获得cookie
常用的有一个:
${pageContext.request.contextPath}了获得项目名
<a href="${pageContext.request.contextPath}/login">登录3</a><br>

三、JSTL

3.1 现有问题

  • EL主要是用于作用域获取数据,虽然可以做运算判断,但是得到的都是一个结果,做展示。
  • EL不存在流程控制。比如判断。
  • EL对于集合只能做单点访问,不能实现遍历操作。比如循环。

3.2 什么是 JSTL?

JSTL:全称Java Server Pages Standard Tag Library JSP标准标签库(JSTL)是一个JSP标签集合。

3.3 JSTL的作用

可对EL获取到的数据进行逻辑操作。 与EL合作完成数据的展示。

3.4 JSTL的使用步骤

  1. 项目加入jstl和standard的jar包,或者引入pom依赖

      <!-- jstl -->
        <dependency>
          <groupId>javax.servlet.jsp.jstl</groupId>
          <artifactId>jstl-api</artifactId>
          <version>1.2</version>
          <exclusions>
            <exclusion>
              <groupId>javax.servlet</groupId>
              <artifactId>servlet-api</artifactId>
            </exclusion>
            <exclusion>
              <groupId>javax.servlet.jsp</groupId>
              <artifactId>jsp-api</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
    
        <dependency>
          <groupId>org.glassfish.web</groupId>
          <artifactId>jstl-impl</artifactId>
          <version>1.2</version>
          <exclusions>
            <exclusion>
              <groupId>javax.servlet</groupId>
              <artifactId>servlet-api</artifactId>
            </exclusion>
            <exclusion>
              <groupId>javax.servlet.jsp</groupId>
              <artifactId>jsp-api</artifactId>
            </exclusion>
            <exclusion>
              <groupId>javax.servlet.jsp.jstl</groupId>
              <artifactId>jstl-api</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
    
  2. 在需要使用jstl标签的页面,中使用taglib引入库

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
  3. 在需要的地方写标签 <c:if >

3.5 核心标签的使用[重点]

3.5.1 判断标签

<body>
    <%
        request.setAttribute("num",0);
    %>
    <%
        int num = (int)request.getAttribute("num");
        if (num > 0) {
            out.write("num > 0");
        } else {
            out.write("num < 0");
        }
    %>
    <hr>
    <c:if test="${num > 0}">
        num > 0
    </c:if>
    <hr>
    <c:choose>
        <c:when test="${num > 0}">
            num > 0
        </c:when>
        <c:when test="${num < 0}">
            num < 0
        </c:when>
        <c:otherwise>
            num = 0
        </c:otherwise>
    </c:choose>
</body>

3.5.2 循环标签[重点]

<%--
循环 var是变量
    begin从哪里开始
    end 到哪结束
    step 步长默认为1
--%>
<c:forEach var="i" begin="1" end="10" step="2">
    ${i}<br>
</c:forEach>
<hr>
<%--
循环
    items 就是域中的集合
    var 每次循环得到的对象
--%>
<c:forEach var="user" items="${list}">
    <div>${user}</div>
</c:forEach>

四、MVC框架(Model-View-Controller)


4.1 MVC概念

MVC又称为编程模式,是一种软件设计思想,将数据操作、页面展示、业务逻辑分为三个层级(模块),独立完成,相互调用

  • 模型层(Model)

  • 视图(View)

  • 控制器(Controller)

4.2 MVC模式详解

MVC并不是Java独有的,现在几乎所有的B/S的架构都采用了MVC模式。

  • 视图View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等。
  • 控制器Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责流程跳转(转发和重定向)。
  • 模型Model:对客观世界的一种代表和模拟(业务模拟、对象模拟)。
MVC流程
image-20230524201854973

4.3 优点

  • 低耦合性:模块与模块之间的关联性不强,不与某一种具体实现产生密不可分的关联性
  • 高维护性:基于低耦合性,可做到不同层级的功能模块灵活更换、插拔
  • 高重用性:相同的数据库操作,可以服务于不同的业务处理。将数据作为独立模块,提高重用性

4.4 MVC在框架中应用

MVC模式被广泛用于Java的各种框架中,比如Struts2、SpringMVC等等都用到了这种思想。

4.5 三层架构与MVC

4.5.1 三层架构

View层(表示|界面层)、Service层(业务逻辑层)、DAO层(数据访问层)

三层架构流程
image-20230524201905004

4.5.2 MVC与三层架构的区别

  • MVC强调的是视图和业务代码的分离。严格的说MVC其实关注的是Web层。View就是单独的页面,如JSP、HTML等,不负责业务处理,只负责数据的展示。而数据封装到Model里,由Controller负责在V和M之间传递。MVC强调业务和视图分离。
  • 三层架构是“数据访问层”、“业务逻辑层”、“表示层”,指的是代码之间的解耦,方便维护和复用。

据作为独立模块,提高重用性

4.4 MVC在框架中应用

MVC模式被广泛用于Java的各种框架中,比如Struts2、SpringMVC等等都用到了这种思想。

4.5 三层架构与MVC

4.5.1 三层架构

View层(表示|界面层)、Service层(业务逻辑层)、DAO层(数据访问层)

三层架构流程
image-20230524201905004

4.5.2 MVC与三层架构的区别

  • MVC强调的是视图和业务代码的分离。严格的说MVC其实关注的是Web层。View就是单独的页面,如JSP、HTML等,不负责业务处理,只负责数据的展示。而数据封装到Model里,由Controller负责在V和M之间传递。MVC强调业务和视图分离。
  • 三层架构是“数据访问层”、“业务逻辑层”、“表示层”,指的是代码之间的解耦,方便维护和复用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/25588.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Proteus仿真】51单片机+步进电机驱动

【Proteus仿真】51单片机步进电机驱动 &#x1f516;Proteus仿真基础实验-步进电机驱动&#x1f33f;Proteus8.12平台 &#x1f4cb;步进电机简介 步进电机是一种将电脉冲转换为角位移的开环控制元步进电机。一般地&#xff0c;当步进驱动器接收到脉冲信号时&#xff0c;它将根…

【工作流】Activiti工作流简介以及Spring Boot 集成 Activiti7

文章目录 前言一、activiti介绍二、工作流引擎三、BPMN四、数据库五、Spring Boot 集成 Activiti7安装插件引入依赖配置文件 总结 前言 什么是工作流&#xff1f; 工作流指通过计算机对业务流程进行自动化管理&#xff0c;实现多个参与者按照预定义的流程去自动执行业务流程。 …

Linux :: vim 编辑器:详解:文本复制/粘贴/剪切/删除 与 撤销普通操作及撤销撤销操作

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 前文&#x…

【哈希】位图/布隆过滤器

位图 前言 在实现位图结构之前我们先看一个问题&#xff1a; 给出40亿个不重复的无符号整型&#xff0c;并且是无序的。然后给一个无符号整数&#xff0c;怎样快速判断这个数是否在40亿个数之中。 方法一&#xff1a;对40亿个数据进行遍历。我们会发现&#xff0c;时间复杂度…

使用kotlin用回溯法解决电话号码的字母组合问题

17. 电话号码的字母组合 难度中等 2474 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#…

C++const函数的运用:深度解析const函数的魅力

C 深度解析const函数的魅力 1. C const函数的基本概念&#xff08;Basic Concepts of const Functions in C&#xff09;1.1 const函数的定义与特性&#xff08;Definition and Characteristics of const Functions&#xff09;1.2 const函数的使用场景&#xff08;Usage Scena…

Spring(四)基于xml的自动装配

自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。 首先我们来熟悉三层架构的创建过程&#xff1a; 三层架构为controller层&#xff0c;service层&#xff0c;dao层。 在service层里面创建ser…

php内置类小结

文章目录 php内置类小结Error、Exception进行xss、绕过hash比较Error类Exception类使用Error、Exception内置类绕过md5、sha1等哈希比较Error类详解Exception类详解例题&#xff1a;[2020 极客大挑战]Greatphp 使用DirectaryIterator、Filesystemlterator、Globlterator内置类读…

为什么要“内卷”创始人?如何内卷?

受疫情影响&#xff0c;近几年各个行业都受到很大的冲击&#xff0c;同时有许多知识创业者反而逆势增长&#xff0c;这是为什么呢&#xff1f;因为有一个好的领导者&#xff01;一家企业的发展&#xff0c;和创始人的心力和决心紧密联系着&#xff0c;只有好的将军才能带领出好…

如何解决航空企业数字化转型中的痛点?

数字化时代&#xff0c;越来越多的企业开始关注数字技术&#xff0c;希望通过数字化改造提高企业效率和竞争力&#xff0c;为企业创造更多的商机和利润。今天就来同大家探讨航空领域&#xff0c;小程序在企业数字化转型中发挥的作用、 航空业员工端App的敏捷转型挑战 技术上的…

资源配额(ResourceQuota) 资源限制(LimitRange)

资源配额 ResourceQuota 资源配额 ResourceQuota&#xff1a;限制命名空间总容量。 当多个团队、多个用户共享使用K8s集群时&#xff0c;会出现不均匀资源使用&#xff0c;默认情况下先到先得&#xff0c;这时可以通过ResourceQuota来对命名空间资源使用总量做限制&#xff0c;…

Aerial Vision-and-Dialog Navigation阅读报告

Aerial Vision-and-Dialog Navigation 本次报告&#xff0c;包含以下部分&#xff1a;1摘要&#xff0c;2数据集/模拟器&#xff0c;3AVDN任务&#xff0c;4模型&#xff0c;5实验结果。重点介绍第2/3部分相关主页&#xff1a;Aerial Vision-and-Dialog Navigation (google.com…

基于C#的串口扫描枪通信实战

今天搞大事&#xff0c;观众们动起来&#xff0c;搞事的目的是 掌握串口通信及winform开发技术 硬件设备&#xff1a;1、串口激光扫描枪&#xff0c;注意是串口&#xff0c;不是USB口 2、USB转串口的连接线一根&#xff0c;如图连接所示 3、USB扩展器一个&#xff0c;如果你电…

iphone苹果手机如何备份整个手机数据?

手机上的数据变得越来越重要&#xff0c;大家也越来越注重数据安全。如果手机设备丢失的话&#xff0c;不仅是设备的丢失&#xff0c;还是数据的丢失。因此&#xff0c;备份数据就显得很重要。那么&#xff0c;iphone如何备份整个手机&#xff0c;苹果怎么查备份的照片&#xf…

Python量化交易:策略创建运行流程

学习目标 目标 知道策略的创建和运行知道策略的相关设置知道RQ的策略运行流程应用 无 1、体验创建策略、运行策略流程 1.1 创建策略 1.2 策略界面 2、 策略界面功能、运行介绍 2.1 一个完整的策略需要做的事情 选择策略的运行信息&#xff1a; 选择运行区间和初始资金选择回…

笔记本安装CentOS

目标: 1.利用闲置笔记本 2.省电/提高利用率/不安装图形桌面/最小化安装/附加选项:开发工具 step1&#xff1a;镜像下载 CentOS-7.9 163镜像 阿里云镜像 清华大学镜像 随便选一个 step2: 下载U盘系统盘制作工具Rufus U盘写入镜像/安装 step3: 安装完毕进入系统 …

【Linux】文件的压缩和解压

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、压缩格式 2、压缩软件 3、tar 命令简介 4、tar 命令压缩 5、总结 1、压缩格式 在市面上有非常多的压缩格式&#xff0c;…

《面试1v1》类加载过程

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你了解Java的类加载过程吗?跟我聊聊classes是如何加载到JVM中的。 候选人&#xff1a; Java的类加载过程由加载、验证、准备、解析和初始化5个…

JAVA变量在不同情况下未赋值与默认初始值

目录 一、默认初始值 二、本地变量 代码 运行结果 二、实例变量 代码 运行结果 三、本地变量和实例变量的区别 1.作用域 2.生命周期 3.初始化 一、默认初始值 数据类型初始值数据类型初始值byte0long0Lchar‘u0000’float0.0fshort0double0.0int0booleanfalse引用nul…

【react全家桶】react-Hook (下)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 15【react-Hook &#xff08;下&#x…