JavaWeb----JSPJSTL

目录

  • JSP
    • 显隐注释
    • 在JSP中写java程序
    • JSP的指令标签
    • JSP中的四大域对象
    • 简易版用户登录
    • EL表达式
  • JSTL
    • 条件动作标签
      • if标签
    • choose\when\otherwise标签
    • 迭代标签
    • 格式化动作标签
  • 用户登录实例
    • 查看是否安装了mysql
    • 用户登录界面
    • 后台实现

JSP

JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。

显隐注释

	<%-- 你好 --%><!-- 不好 -->

在JSP中写java程序

<% //定义局部变量String str = "Hello";String str1 = "Hello11";System.out.println(str);out.print(str);out.print(num);%><%!//声明全局变量int num = 10;%><%-- 输出表达式、变量或字面量 --%><%=str1 %>

JSP的指令标签

include静态包含
特点:

  • 最终只会生成一个源码文件,所以变量各个包含页面内的变量不能重名。

格式:

	<%@include file="header.jsp"%> <h2>主体内容</h2>

动态包含
特点:

  • 相当于方法的调用,最后生成多个源码文件,所以可以定义同名变量
  • 当动态包含不需要传递参数时,include双标签之间不要有任何内容。

格式:

	<jsp:include page="header.jsp"><h2>主体内容</h2>
  • 传递参数
	<jsp:include page="header.jsp"></jsp:include><h2>主体内容</h2><%String str = "hello";%><jsp:include page="header.jsp"><jsp:param value="admin" name="uname"/><jsp:param value="<%=str%>" name="msg"/></jsp:include>
	<h1>这是头部</h1><%String uname = request.getParameter("uname");String msg = request.getParameter("uname");out.print(uname+ ", "+msg );%>

JSP中的四大域对象

其中一个页面设置域对象

<%pageContext.setAttribute("name1", "zhangsan");request.setAttribute("name2", "lisi");session.setAttribute("name3", "王五");application.setAttribute("name4", "zhaoliu");%><%-- <jsp:forward page="header.jsp"></jsp:forward> --%><a href="header.jsp">跳转</a>

如果使用<jsp:forward page=“header.jsp”></jsp:forward>这种形式是直接显示的效果
但如果是要点击页面跳转的化,要使用a标签,这样request对象就不起作用了,session对象是可以使用的。

实例: 用户登录界面

<%out.print("page范围:" + pageContext.getAttribute("name1")+"<br/>");out.print("request范围:" + request.getAttribute("name2")+"<br/>");out.print("session范围:" + session.getAttribute("name3")+"<br/>");out.print("application范围:" + application.getAttribute("name4")+"<br/>");%>

简易版用户登录

	<form action="loginbasicSer" method="post">姓名:<input type="text" name="uname"><br>密码:<input type="password" name="upwd"><br><button>登录</button><span style="color: red; font-size: 12px"><%=request.getAttribute("meg") %></span><!-- <button>登录</button><span style="color: red; font-size: 12px">${meg}</span> --></form></form>
package servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/loginbasicSer")
public class lbasicSer extends HttpServlet{@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setHeader("content-type", "text/html;charset=utf-8");String uname = request.getParameter("uname");String upwd = request.getParameter("upwd");//uname.trim()确保输入的字符串不为空或不只是空白字符if ( uname == null || "".equals(uname.trim())) {request.setAttribute("meg", "用户姓名不能为空");request.getRequestDispatcher("loginbasic.jsp").forward(request, response);return;}//判断账号密码是否正确  uname=admin   upwd=adminif ( !"admin".equals(uname) || !"admin".equals(upwd)) {request.setAttribute("meg", "登录错误。");request.getRequestDispatcher("loginbasic.jsp").forward(request, response);return;}//		登录成功
//		设置登录信息到session作用域request.getSession().setAttribute("uname", uname);response.sendRedirect("ind.jsp");}
}

EL表达式

默认重小到大,找到即可;当域对象找完了还未找到返回空字符串“”

	<%pageContext.setAttribute("name1", "zhangsan");request.setAttribute("name", "lisi");session.setAttribute("name", "王五");application.setAttribute("name", "zhaoliu");%>获取域对象: ${name}<br/>获取指定范围的域对象:${applicationScope.name}
  • 获取List
	<%List<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");request.setAttribute("list", list);%><h4>获取List</h4>获取List的size: ${list.size()}<br/>获取List的指定下标的值:${list[1]}<%Map map = new HashMap();map.put("aaa", "111");map.put("bbb", "222");map.put("ccc", "333");map.put("ddd", "444");request.setAttribute("map", map);%><h4>获取map</h4>获取map的size: ${map.size()}<br/>获取map的指定下标的值:${map['aaa']}
  • 获取JavaBean对象
    JavaBean中的属性字段必须要提供Get和set方法
JavaBean对象<%User user = new User();user.setUserId(1);user.setUname("钟子扬");user.setUpwd("123456");request.setAttribute("user", user);%>获取javaBean对象<br/>获取javaBean中的属性:${user.uname} --- ${user.getUserId()}
package entity;public class User {private int userId;private String uname;private String upwd;public int getUserId() {return userId;}public String getUname() {return uname;}public String getUpwd() {return upwd;}public User(int userId, String uname, String upwd) {super();this.userId = userId;this.uname = uname;this.upwd = upwd;}public void setUserId(int userId) {this.userId = userId;}public void setUname(String uname) {this.uname = uname;}public void setUpwd(String upwd) {this.upwd = upwd;}public User() {super();}}
  • empty 判断是否为空
    如果域对象不存在,空字串串或者null的 会返回true
<%request.setAttribute("str1", "aaa");request.setAttribute("str2", "");request.setAttribute("str3", null);%><div>判断字符串是否存在</div>${empty str}<br /> ${empty str1}<br /> ${empty str2}<br /> ${empty str3}<br /> 

在这里插入图片描述

  • 判断数组是否存在
    null或者没有长度都会返回true
	<%List list1 = new ArrayList<>();List list2 = null;List list3 = new ArrayList<>();list3.add(1);request.setAttribute("list1", list1);request.setAttribute("list2", list2);request.setAttribute("list3", list3);%><hr /><div>判断List是否存在</div>${empty list1}<br /> ${empty list2}<br /> ${empty list3}<br /> 

在这里插入图片描述

  • 判断JavaBean类型的对象是否存在
    只有为null时是空的,一经创建就不为空
	<%User user1 = new User();User user2 = null;User user3 = new User();user3.setUname("钟子扬");request.setAttribute("user1", user1);request.setAttribute("user2", user2);request.setAttribute("user3", user3);%><hr /><div>判断user是否存在</div>${empty user1}<br /> ${empty user2}<br /> ${empty user3}<br /> 

在这里插入图片描述

注意: 判断域对象不为空

${!empty user1}
  • 等值判断
	<%request.setAttribute("a", 10);request.setAttribute("b", 2);request.setAttribute("c", "aa");request.setAttribute("d", "dd");%>${ a==b}${ c eq "bb"}${ d =="dd" }${ a+b }${b/a } 等价于 ${b div a } ${ a+b >10 || a-b <5 }

JSTL

Java Server Pages Standard Tag Library(JSTL):JSP标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题。例如迭代一个映射或者集合、条件测试、XML处理,甚至数据库和访问数据库操作等。

  • 核心标签库( c )
    包括循环、表达式赋值、基本输入输出等
  • 格式化标签库( fmt )
    格式化显示数据。对不同区域的日期格式化

需要先下载两个jar包(1.1.2版本的就行)

  • 链接: standard

  • 链接: jstl

然后将jar拷贝到lib文件夹下
在这里插入图片描述
在这里插入图片描述
在jsp页面输入

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

接下来操作的所有标签都是域对象标签,都是对域对象标签进行操作的。

条件动作标签

if标签

  • test:做条件判断,操作的是域对象
<%request.setAttribute("num", 10);%><c:if test="${num > 0}" var="flag" scope="request"><h3>数值大于0</h3></c:if> ${requestScope.flag}

choose\when\otherwise标签

  • 替代else的标签
    choose when替代case
    otherwise替代default
  • choose 和otherwise标签没有属性, when标签只有一个属性
  • when标签和otherwith标签可以嵌套其他标签
	<%request.setAttribute("score", 80);%><c:choose><c:when test="${score > 60 && score < 80}"><h4>你好牛</h4></c:when><c:when test="${score == 60 }"><h4>刚及格</h4></c:when><c:when test="${score < 60 }"><h4>小渣渣</h4></c:when><c:otherwise><h2>厉害的嘞</h2></c:otherwise></c:choose>

迭代标签

  • 首先,我一定要说,我们需要将和核心标签库的地址改成
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

好,现在开始说jstl中的foreach

  • 第一种:简单的通过移动步长来输出数字
    需要有var begin end step
  • 第二种:简单的遍历一个string类型的list
    需要有items(存储的是域变量) 和 var(循环的临时变量)
  • 第三种:循环javaBean中的对象(后期配合数据库使用)
    • 例如本例,先创建一个User的类
    • 在jsp页面编写java代码,通过request设置域对象
    • 使用JSTL和EL表达式进行判断输出到页面
<%@page import="entity.User"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ 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><c:forEach var="i" begin="1" end="10" step="2">${i} &nbsp;</c:forEach><%List<String> list = new ArrayList<>();for ( int i = 1; i <= 10; i++) {list.add("A:"+i);}pageContext.setAttribute("li", list);%><c:forEach items="${li}" var="item">${item} &nbsp;</c:forEach><hr/><%List<User> userList = new ArrayList<>();User user1 = new User(1, "张三", "123");User user2 = new User(2, "李四", "345");User user3 = new User(3, "王五", "567");userList.add(user1);userList.add(user2);userList.add(user3);request.setAttribute("uLi", userList);%><c:if test="${!empty li }"><table align="center" width="800" border="1" style="border-collapse: collapse"><tr><th>用户编号</th><th>用户名称</th><th>用户密码</th><th>用户操作</th></tr><c:forEach items="${uLi}" var="user"><tr  align=center><td>${user.userId}</td><td>${user.uname}</td><td>${user.upwd}</td><td><button>操作</button></td></tr></c:forEach></table></c:if></body>
</html>

格式化动作标签

	<%request.setAttribute("mydate", new Date());%><fmt:formatDate value="${mydate }" type="date"/><br><fmt:formatDate value="${mydate }" type="time"/><br><fmt:formatDate value="${mydate }" type="both"/><br><fmt:formatDate value="${mydate }" type="both" dateStyle="FULL"/><br><fmt:formatDate value="${mydate }" type="both" pattern="yyyy-MM-dd hh:mm:ss"/><br>

在这里插入图片描述

用户登录实例

查看是否安装了mysql

win+R 输入 services.msc 看服务 

在这里插入图片描述

用户登录界面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<div style="text-align: center"><form action="/login" method="post" id="loginForm">姓名:<input type="text" name="uname" id="uname"><br>密码:<input type="password" name="upwd" id="upwd"><br><button type="button" id="loginid">登录</button><button>注册</button><br><span id="msg" style="font-size:12; color: red"></span></form>
</div><script type="text/javascript" src="js/jquery-3.7.1.js"></script>
<script type="text/javascript">/*登录表单验证1.给登录按钮绑定点击事件(id)2.获取用户姓名和密码的值3.判断姓名是否为空如果为空,提示用户(span标签赋值),并且return 4.判断密码是否为空如果为空,提示用户,并且return 5.如果都不为空,则手动提交表单*/$("#loginid").click(function(){var uname = $("#uname").val();var upwd = $("#upwd").val();//判断姓名是否为空if( isEmpty(uname)){$("#msg").html("用户姓名不可为空。");return;}//判断密码是否为空if( isEmpty(upwd)){$("#msg").html("用户密码不可为空。");return;}//如果都不为空,则手动提交表单$("#loginForm").submit();});function isEmpty(str) {if ( str == null || str.trim() == ""){return true;}return false;}	
</script>
</html>

后台实现

  • 分层思想

    • controller层
      接收请求、响应结果
      调用service层,返回结果
    • service层
      业务逻辑判断
      例如判断参数是否为空,这个数据是否存在与逻辑相关的
    • mapper层(dao层)
      接口类
      mapper.xml mybatis与数据库的相关操作
      增删改查
    • util
      工具类
      参数的非空判断,字符串的各种判断
      通用方法,通用类
    • test
      测试类/方法
    • entity(po, model)
      javaBean实体
  • 登录功能思路

    1. 接收客户端的请求(接收参数:姓名、密码)
    2. 参数的非空判断
      如果参数为空
      通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
      将消息模型对象设置到request作用域中
      请求转发到登录页面
      return
    3. 通过用户姓名查询用户对象
    4. 判断用户对象是否为空
      如果为空,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
      将消息模型对象设置到request作用域中
      请求转发到登录页面
      return
    5. 将数据库中查询到的用户名和密码与前台传递的密码做比较
      如果不相等,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
      将消息模型对象设置到request作用域中
      请求转发到登录页面
      return
      如果相等,表示登录成功
      将用户信息设置到session作用域中
      重定向跳转到首页
  • 各个层的任务

    • controller层(接收请求,响应结果)
    1. 接收客户端的请求(接收参数:姓名、密码)
    2. 调用service层的方法,返回消息模型对象
    3. 判断消息模型的状态码
      如果状态码是失败,将消息模型对象设置到request作用域中,请求转发到login.jsp页面
      如果状态码是成功,将消息模型对象设置到session作用域中,重定向跳转到index.jsp页面
    • service层
    1. 参数的非空判断。如果参数为空,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
    2. 调用Dao层的查询方法,通过用户名查询用户对象
    3. 判断用户对象是否为空,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
    4. 判断数据库中查询到的用户名密码与前台传递过来的密码做比较,如果不相等,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
    5. 登录成功,将成功状态、提示信息、用户对象设置到消息模型对象,并return
    • mapper层(Dao层)
      定义对应的接口,说白了就是定义对应的查询方法

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

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

相关文章

电机控制杂谈——增量式的预测电流控制的优势在哪?

1.前言 前几天看到这么个问题。“模型预测控制如何消除静态误差” 评论说用增量式的预测控制。 这个回答让我想起来我大四下看的这篇论文。现在都一百多被引用了。 但是苦于当时能力有限&#xff0c;没办法复现这个文章。 所以现在想重新验证一下。 2.静态误差和电机磁链有…

[CP_AUTOSAR]_分层软件架构_内容详解

目录 1、软件分层内容1.1、Microcontroller Abstraction Layer1.2、ECU Abstraction Layer1.2.1、I/O HW Abstraction1.2.2、Communication Hardware Abstraction1.2.3、Memory Hardware Abstraction1.2.4、Onboard Device Abstraction1.2.5、Crypto Hardware Abstraction 1.3、…

Apache Seata分布式事务启用Nacos做配置中心

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Seata分布式事务启用Nacos做配置中心 Seata分布式事务启用Nacos做配置中心 项目地址 本文作…

便携式气象站:探索自然的智慧伙伴

在探索自然奥秘、追求科学真理的道路上&#xff0c;气象数据始终是我们不可或缺的指引。然而&#xff0c;传统的气象站往往庞大而笨重&#xff0c;难以在偏远地区或移动环境中灵活部署。 便携式气象站&#xff0c;顾名思义&#xff0c;是一种小巧轻便、易于携带和安装的气象观测…

VitePress美化

参考资料&#xff1a; https://blog.csdn.net/weixin_44803753/article/details/130903396 https://blog.csdn.net/qq_30678861/category_12467776.html 站点信息修改 首页部分的修改基本都在.vitepress/config.mts,这个文件内修改。 title 站点名称 description 描述 top…

Vben:表格的表头和表格的内容对不齐,以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 基于Vue-Vbne-admin框架进行前端开发的时候&#xff0c;调用表格useTable函数实现表格之后&#xff0c;发现表格的表头和表格的内容对不齐。如下图所示。针对这种情况&#xff0c;本文记录了解决方法。 调用的模块如下&#x…

【力扣 - 每日一题】3099. 哈沙德数 | 模拟 (Go/C++)

题目内容 如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&#xff1…

使用 ESP32-WROOM + DHT11 做个无屏温湿度计

最近梅雨天&#xff0c;有个房间湿度很大&#xff0c;而我需要远程查看温湿度&#xff0c;所以无所谓有没有显示屏&#xff0c;某宝上的温湿度计都是带屏的&#xff0c;如果连WIFI查看温湿度操作也比较麻烦&#xff0c;还需要换电池&#xff0c;实在不能满足我的需求&#xff0…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目&#xff0c;请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求&#xff0c;通过客户端请求的参数&#xff0c;以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

笔记:SpringBoot+Vue全栈开发

笔记&#xff1a;SpringBootVue全栈开发 1. 开发环境热部署2. SpringBoot RestController的使用3. SpringBoot实现文件上传4. 配置拦截器5. Restful服务Swagger6. 使用MyBatis-Plus进行数据库操作7. 多表查询、条件查询及分页查询 1. 开发环境热部署 使用spring-boot-devtools…

泛微开发修炼之旅--31海康威视综合安防管理系统组织机构同步代码方案及源码

31海康威视综合安防管理系统组织机构同步代码方案及源码 一、使用场景 我们在一个项目中有一个和海康威视综合安防管理系统进行组织机构同步接口&#xff0c;接下来我们看下实现的源码 31海康威视综合安防管理系统组织机构同步代码方案及源码

【qt】如何获取本机的IP地址?

需要用到这个类QHostInfo和pro里面添加network模块 用这个类的静态函数forName()来获取该主机名的信息 返回的就是这个类 这个QHostInfo类就包括主机的IP地址信息 用静态函数addresses()来获取 返回的是一个QHostAddress的容器 QList<QHostAddress>addrList hostIn…

【车载开发系列】GIT安装详细教程

【车载开发系列】GIT安装详细教程 【车载开发系列】GIT安装详细教程 【车载开发系列】GIT安装详细教程一. GIT软件概念二. GIT安装步骤三. GIT安装确认三. GIT功能使用1&#xff09;Git Bash2&#xff09;Git CMD3&#xff09;Git FAQs4&#xff09;Git GUI 一. GIT软件概念 G…

[CTF]-PWN:House of Banana堆块题型综合分析

搭配largebin attack&#xff1a; 例题&#xff08;ISCC2024 heapheap)&#xff1a; 版本&#xff1a;glibc2.31 知识点&#xff1a;largebin attack、house of banana、uaf 查看保护 查看ida delete存在uaf漏洞 largebin attack手法&#xff1a; #创建4个堆块&#xff0…

Django学习第六天

启动项目命令 python manage.py runserver 取消模态框功能 js实现列表数据删除 第二种实现思路 使用jquery修改模态框标题 编辑页面拿到数据库数据显示默认数据功能实现 想要去数据库中获取数据时&#xff1a;对象/字典 三种不同的数据类型 使用Ajax传入数据实现表单编辑&…

星辰宇宙动态页面vue版,超好看的前端页面。附源码与应用教程(若依)

本代码的html版本&#xff0c;来源自“山羊の前端小窝”作者&#xff0c;我对此进行了vue版本转换以及相关应用。特此与大家一起分享~ 1、直接上效果图&#xff1a; 带文字版&#xff1a;文字呼吸式缩放。 纯净版&#xff1a; 默认展示效果&#xff1a; 缩放与旋转后&#xf…

anaconda中下载压缩包并用conda安装包

有时直接conda安装包时会出错&#xff1b;报错PackagesNotFoundError: The following packages are not available from current channels 比如 conda install -y bioconda::ucsc-gtftogenepred #直接安装报错 #直接下载压缩包安装https://blog.csdn.net/weixin_45552562/ar…

02:C语言数据类型

C语言数据类型 1、整型变量2、浮点型变量3、字符型变量4、有符号数和无符号数 1、整型变量 #include <stdio.h>int main(void) { /* int a; //定义一个整型变量aint b; //定义一个整型变量bint c; //定义一个整型变量c */ /* int a,b,c; //也可以这样定义a 25;b 6; *…

liunx文件系统,日志分析

文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…

Windows如何查看端口是否占用,并结束端口进程

需求与问题&#xff1a;前后端配置了跨域操作&#xff0c;但是仍然报错&#xff0c;可以考虑端口被两个程序占用&#xff0c;找不到正确端口或者后端接口书写是否规范&#xff0c;特别是利用Python Flask书写时要保证缩进是否正确&#xff01; Windows操作系统中&#xff0c;查…