day42_jsp

news2024/12/29 9:54:43

今日内容

零、 复习昨日
一、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强调业务和视图分离。
  • 三层架构是“数据访问层”、“业务逻辑层”、“表示层”,指的是代码之间的解耦,方便维护和复用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8.3:加强堆的应用

8.3&#xff1a;加强堆的应用 题目要求&#xff1a; 做一个加强堆的题目&#xff0c;给定一个整型数组&#xff0c;int[] arr&#xff1b;和一个布尔类型数组&#xff0c;boolean[] op 两个数组一定等长&#xff0c;假设长度为N&#xff0c;arr[i]表示客户编号&#xff0c;op…

【程序人生】上海城市开发者社区小聚有感

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

shell脚本入门-编写格式以及执行方式

Shell介绍 通过编写shell命令发送给linux内核去执行&#xff0c;操作就是计算机硬件&#xff0c;所以Shell命令是用户操作计算机硬件的桥梁 Shell是命令&#xff0c;类似与windows系统的Dos命令 Shell是一门程序设计语言&#xff0c;shell里面含有变量&#xff0c;函数&#xf…

低代码助力企业数字化转型:构建高效业务系统的新选择

在当今数字化时代&#xff0c;企业数字化转型已经成为业界的热门话题。随着全球各大企业逐渐意识到数字化转型的重要性&#xff0c;越来越多的公司开始采用低代码开发平台作为数字化转型的工具&#xff0c;以低成本高效率构建业务系统&#xff0c;实现数字化转型。 但现实情况是…

Less基础速学 —— 混入、运算、继承

Less 混合 在上一篇内容中就已经简单的了解了关于CSS预处理器 —— Less&#xff0c;本篇就往下讲Less中的混合&#xff0c;什么是混合&#xff1f;就是将一系列属性从一个规则集引入到另外一个规则集的方式。下面来看一下它的混合方式有哪些&#xff1f; 普通混合 <div …

使用OpenCvSharp来计算图像的清晰度(可实现相机自动对焦)

相机自动对焦&#xff0c;其实是对相机成像的清晰值得计算&#xff0c;若对焦不清晰&#xff0c;成像的清晰度低&#xff0c;视觉效果模糊。若是在工业检测行业&#xff0c;对焦不准确&#xff0c;可能导致信息不正确&#xff1b;对焦准确的图像&#xff0c;其清晰度高&#xf…

长连接心跳原理与机制工程上踩坑与优化

QA: 业务上对于心跳间隔一般怎么确定? 心跳间隔的确定一般需要根据具体业务场景和需求来进行。以下是一些常见的确定心跳间隔的方法&#xff1a; 根据应用场景和需求来确定心跳间隔。例如&#xff0c;在智能手环等健康监测设备中&#xff0c;心跳间隔通常设置为几秒钟到几分钟…

华为OD机试之过滤组合字符串(Java源码)

过滤组合字符串 题目描述 每个数字关联多个字母&#xff0c;关联关系如下&#xff1a; 0 关联 “a”,”b”,”c”1 关联 “d”,”e”,”f”2 关联 “g”,”h”,”i”3 关联 “j”,”k”,”l”4 关联 “m”,”n”,”o”5 关联 “p”,”q”,”r”6 关联 “s”,”t”7 关联 “u”…

六级备考24天|CET-6|翻译技巧4|翻译红楼梦|22:40~23:40

目录 作题步骤 红楼梦 12 PRACTICE ANSWER​ 时态问题 3 ANSWER 4 PRACTICE ANSWER ​ 5​ PRACTICE ANSWER 合并 ​ 全文翻译​ 作题步骤 不要拿到题目就动笔、一定要先读题、重建逻辑、找句子主干、有能力可以润色简化&#xff01; 红楼梦 12 PRACTICE Dream of th…

【java】leetcode 二叉树展开为链表

二叉树展开为链表 leetcode114 .二叉树展开为链表解题思路二叉树专题&#xff1a; leetcode114 .二叉树展开为链表 114 leetcode 链接。可以打开测试 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#x…

【Redis】共同关注列表与基于Feed流的关注消息滚动分页推送的实现

目录 一、共同关注 1、思路 2、实现步骤 二、Feed流 1、概念 2、需求 3、TimeLine的三种模式 1.拉 2.推 3.推拉结合 4、TimeLine三种模式的区别 三、关注推送 1、需求 2、实现思路 3、Redis数据结构的选择 4、滚动分页 5、代码实现 1.博主 2.粉丝 一、共同关…

Packet Tracer - 在 VTY 线路上配置 ACL

Packet Tracer - 在 VTY 线路上配置 ACL 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 路由器 F0/0 10.0.0.254 255.0.0.0 不适用 PC NIC 10.0.0.1 255.0.0.0 10.0.0.254 笔记本电脑 NIC 10.0.0.2 255.0.0.0 10.0.0.254 拓扑图 目标 第 1 部分&#…

企业性能测试全面解析,一步步教你进行性能测试!

目录 前言&#xff1a; 性能需求调研 性能测试计划制定 性能测试执行 性能测试结果分析与优化 结尾&#xff1a; 前言&#xff1a; 在软件开发过程中&#xff0c;性能测试是一个非常重要的环节。性能测试的主要目的是评估系统在负载情况下的响应时间、吞吐量、稳定性等指…

【C语言】二分查找(含图解)

文章目录 1. 二分查找思想2. 代码实现2.1 未封装函数2.2 封装函数&#xff08;使用while循环&#xff09;2.3 封装函数&#xff08;使用递归&#xff09; 1. 二分查找思想 二分法&#xff1a;二分查找算法是一种在有序数组中查找某一特定元素的搜索算法&#xff0c;其思想就是…

【Linux】多线程操作

文章目录 一. 线程库二. 多线程操作1. 线程创建2. 线程等待3. 线程退出4. 线程取消5. 线程分离6. 返回值 三. 多线程理解结束语 一. 线程库 在Linux下&#xff0c;并没有真正的线程&#xff0c;只有用进程模拟的轻量级进程&#xff0c;所以Linux并没有提供可以直接创建线程的接…

JavaScript教程(三)之 jQuery

JavaScript库 即library&#xff0c;是一个封装好的特定的集合&#xff08;方法和函数&#xff09;。从封装一大堆函数的角度理解库&#xff0c;就是在这个库中&#xff0c;封装了很多预先定义好的函数在里面&#xff0c;比如动画animate、hide、show&#xff0c;比如获取元素…

每日学术速递5.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Chupa: Carving 3D Clothed Humans from Skinned Shape Priors using 2D Diffusion Probabilistic Models 标题&#xff1a;Chupa&#xff1a;使用 2D 扩散概率模型从蒙皮形状先验雕…

理解Window和WindowManager(一)

理解Window和WindowManager(一) Window是一个抽象类,它的具体实现是PhoneWindow,创建一个WindowManager就可以创建一个Window&#xff0c; Window的具体实现位于WindowManagerService中,WindowManager和WindowManagerService是一个IPC过程 为什么使用Window 首先就是Window…

redis持久化【RDB+AOF】持久化双雄

这是redis系列文章之《redis持久化【RDBAOF】持久化双雄》&#xff0c;上一篇文章【redis基础】redis的十大数据类型_努力努力再努力mlx的博客-CSDN博客 感谢大家的支持~ 目录 RDB 什么是RDB RDB的作用 配置文件关于RDB部分 6vs7 操作步骤 修改配置文件&#xff08;本案…

通过python采集整站lazada商品列表数据,支持多站点

要采集整站lazada商品列表数据&#xff0c;需要先了解lazada网站的结构和数据源。Lazada是东南亚最大的电商平台之一&#xff0c;提供各种商品和服务。Lazada的数据源主要分为两种&#xff1a;HTML和API。 方法1&#xff1a;采集HTML数据 步骤1&#xff1a;确定采集目标 首先…