当前位置: 首页 > news >正文

Day39

Day39

JSP

JSP底层

全称为Java Server Pages,JSP实际上就是一个servelet

JSP:HTML页面+Java代码,本质:servlet。

public class login_jsp{//JSP的9大内置对象private JSPWriter out;//当前JSP输出流对象private HttpServletRequest request;//请求对象private HttpServletResponse response;//响应对象private HttpSession session;//会话对象private ServletContext application//全局域对象--表示整个项目private ServletConfig config;//当前JSP配置文件对象private Object page = this;//当前JSP对象private PageContext pageContext;//当前JSP上下文关系对象:可以获取8大内置对象//exception/**9大内置对象中的四大域:理解:这四大域都可以存储数据,本质是类对象作为容器存储数据、传递数据。请求域:将数据存储到请求对象中,返回响应后,这个请求对象就会被销毁。request.setAttribute(key,value);Object obj = request.getAttribute(key);会话域:将数据存储到会话域对象中,会话超时(默认30分钟)或者单个用户断连时该会话域对象销毁。session.setAttribute(key,value);object obj = session.getAttribute(key);全局域:将数据存储到全局中,项目关闭时数据才会销毁。application.setAttribute(key,value);Object obj = application.getAttribute(key);页面域:将数据存储到当前页面中,当JSP在当前页面处理完请求并生成响应后,这个对象会被销毁,其他页面无法获取。page.setAttribute(key,value);Object obj = page.getAttribute(key);注:一般的servlet只有前面的三大域,jsp有四大域。*///jsp文件底层逻辑:public void jsp_service(HttpServletRequest req,HttpServletResponse resp){//JSP文件中遇到HTML代码,就用输出流传输给客户端out.writer("<html>\n\r");out.writer("<head>\n\r");...//JSP文件遇到java代码直接执行}
}

注意:1.要导入相应的包。

2.login.jsp在底层实际上是login_jsp.java

JSP语法

JSP模版元素

JSP表达式

JSP脚本片段

JSP注释

JSP指令

JSP标签

JSP内置对象

如何查找JSP页面中的错误:

写一个jsp页面用来展示希望展示的错误信息。然后在web.xml配置文件里进行配置。

如:

	<!-- 通用错误页面 --><error-page><exception-type>java.lang.Throwable</exception-type><location>/error.jsp</location></error-page><!-- 404 错误页面 --><error-page><error-code>404</error-code><location>/error.jsp</location></error-page><!-- 500 错误页面 --><error-page><error-code>500</error-code><location>/error.jsp</location></error-page>

JSP中的page指令:

​ 异常页面:exceptionPage.jsp

EL表达式

功能:取值

要导包

以下是项目中将原来的JSP脚本元素(java代码)转换为EL的具体实现:

注册:

${msg}

登录:

${msg}

详情页面:(EL表达式可以找页面域、请求,会话域,全局域,优先级从高到低)

<h2>欢迎${name}${(role eq "student")?"同学":""}${(role eq "teacher")?"老师":""}进入学生管理系统!</h2><a href="StuInitModifyServlet?username=${usernmae}">修改信息</a><a href="TeaInitModifyServlet?username=${usernmae}">修改信息</a>

修改密码:

${msg}<input type="hidden" name="username" value="${username}"/><input type="hidden" name="role" value="${username}"/>账号:${username}<br/>

修改信息:(直接获取属性(底层通过反射获取值))

<input type="hidden" name="username" value="${stu.username}"/>姓名:<input type="text" name="name" value="${stu.name}" /><br />年龄:<input type="text" name="age"  value="${stu.age}" /><br />

修改老师信息:

<input type="hidden" name="username" value="${tea.username}"/>姓名:<input type="text" name="name" value="${tea.username}" /><br />

分页:

<a href="QueryAllStuServlet?curPage=${curPage-1}">上一页</a><a href="QueryAllStuServlet?curPage=${curPage+1}">下一页</a><a href="QueryAllStuServlet?curPage=${totalPage}">尾页</a>
JSTL-标准标签库

功能:做逻辑

要导包

选择核心库

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

以下是项目中将原来的JSP脚本元素(java代码)转换为EL和JSTL语句的具体实现:

详情页面:

<c:if test="${role eq 'student'}"><a href="StuInitModifyServlet?username=${username}">修改信息</a></c:if><c:if test="${role eq 'teacher'}"><a href="TeaInitModifyServlet?username=${username}">修改信息</a><a href="QueryAllStuServlet?curPage=1">查询学生</a></c:if>

修改信息:(核心库+函数库,函数库中有包含的方法)

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 性别:<input type="radio" name="sex" value="man" <c:if test="${stu.sex eq 'man'}">checked="checked"</c:if>/>男<input type="radio" name="sex" value="woman"<c:if test="${stu.sex eq 'woman'}">checked="checked"</c:if>/>女爱好:<input type="checkbox" name="hobbies" value="football" <c:if test="${fn:contains(stu.hobbies,'football')}">checked="checked"</c:if>/>足球<input type="checkbox" name="hobbies" value="basketball"<c:if test="${fn:contains(stu.hobbies,'basketball' )}">checked="checked"</c:if>/>篮球<input type="checkbox" name="hobbies" value="shop" <c:if test="${fn:contains(stu.hobbies,'shop')}">checked="checked"</c:if>/>购物

修改老师信息:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><input type="hidden" name="username" value="${tea.username}"/><br/>姓名:<input type="text" name="name" value="${tea.username}" /><br />课程:<select name="courseId"><c:forEach items="${courseList}" var="course"><option value="${course.id}"<c:if test="${tea.CourseId==course.id}">selected</c:if>>${course.name}</option></c:forEach></select>

分页:

<c:forEach items="${stuList}" var="stuDto"><tr><td>${stuDto.stu.username}</td><td>${stuDto.stu.name}</td><td>${stuDto.sex}</td><td>${stuDto.stu.age}</td><td>${stuDto.hobbies}</td><td><a href="#">修改</a><a href="#">删除</a></td></tr></c:forEach><a href="QueryAllStuServlet?curPage=1">首页</a><c:if test="${curPage>1}"><a href="QueryAllStuServlet?curPage=${curPage-1}">上一页</a></c:if><c:if test="${curPage<totalPage}"><a href="QueryAllStuServlet?curPage=${curPage+1}">下一页</a></c:if><a href="QueryAllStuServlet?curPage=${totalPage}">尾页</a>

写一个rememberMe.jsp

<%@ page import="java.net.URLDecoder" %><%--Created by IntelliJ IDEA.User: GuDate: 2024-06-15Time: 14:54To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%Cookie[] cookies = request.getCookies();if(cookies!=null){int count=0;for(Cookie cookie:cookies){String key = cookie.getName();String value = URLDecoder.decode(cookie.getValue(),"UTF-8");if(key.equals("username")){session.setAttribute("username",value);count++;}if(key.equals("name")){session.setAttribute("name",value);count++;}if(key.equals("role")){session.setAttribute("role",value);count++;}}if(count==3){response.sendRedirect("index.jsp");}}%>
</body>
</html>

把login.jsp中的java代码放进来,在login.jsp前面用include导入java代码。

<!--物理包含:直接将rememberMe.jsp的代码添加到当前jsp中-->
<%@include file="rememberMe.jsp" %>

编译时没有rememberMe.jsp,此时是物理包含,直接将rememberMe.jsp的代码放到了login.jsp文件中。

WEB学生管理系统-优化分页查询

封装分页查询

在pojo文件夹中创建一个Page类,存储url、当前页、总页数、数据源等,创建有参构造方法,getset方法,toString方法等。

package com.qf.pojo;import java.util.List;public class Page<T> {private String url;private int curPage;private int totalPage;private List<T> list;public Page(String url, int curPage, int totalPage, List<T> list) {this.url = url;this.curPage = curPage;this.totalPage = totalPage;this.list = list;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public int getCurPage() {return curPage;}public void setCurPage(int curPage) {this.curPage = curPage;}public int getTotalPage() {return totalPage;}public void setTotalPage(int totalPage) {this.totalPage = totalPage;}public List<T> getList() {return list;}public void setList(List<T> list) {this.list = list;}@Overridepublic String toString() {return "Page{" +"url='" + url + '\'' +", curPage=" + curPage +", totalPage=" + totalPage +", list=" + list +'}';}
}

然后在分页查询的Servlet(QueryAllStuServlet)中把数据封装到Page对象中。

package com.qf.servlet;import com.qf.dto.StudentDto;
import com.qf.pojo.Page;
import com.qf.pojo.Student;
import com.qf.utils.DBUtil;
import com.qf.utils.DtoUtil;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;
import java.sql.SQLException;
import java.util.List;@WebServlet("/QueryAllStuServlet")
public class QueryAllStuServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");String url = "QueryAllStuServlet?curPage=";int curPage = Integer.parseInt(request.getParameter("curPage"));int count = 15;//每一页的数据条数int offset = (curPage-1)*count;//计算偏移量int allCount = DBUtil.getAllCount("select count(username) from student");//总条数int totalPage;//总页数if(allCount%count == 0){totalPage = allCount/count;}else{totalPage = allCount/count + 1;}try {String sql = "select * from student limit ?,?";List<Student> stuList = DBUtil.commonQueryList(Student.class,sql,offset,count);List<StudentDto> stuDtoList = DtoUtil.studentListHandler(stuList);//将数据封装到对象中Page<StudentDto> page = new Page<>(url,curPage,totalPage,stuDtoList);//将数据传回前端request.setAttribute("page",page);request.getRequestDispatcher("stuList.jsp").forward(request,response);} catch (SQLException | InstantiationException | IllegalAccessException e) {throw new RuntimeException(e);}}}
//      假数据
//    public static void main(String[] args) {
//        for(int i=0;i<100;i++){
//            String sql = "insert into student values (?,?,?,?,?,?)";
//            try {
//                DBUtil.commonInsert(sql,"jiashuju"+i,"123123","假数据"+i,"man",18,"football");
//            } catch (SQLException e) {
//                throw new RuntimeException(e);
//            }
//        }
//    }

创建一个新的jsp用于写首页、上下页、尾页等。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<a href="${page.url}1">首页</a>
<c:if test="${page.curPage>1}"><a href="${page.url}${page.curPage-1}">上一页</a>
</c:if><c:if test="${page.curPage<page.totalPage}"><a href="${page.url}${page.curPage+1}">下一页</a>
</c:if>
<a href="${page.url}${page.totalPage}">尾页</a>

此时用逻辑包含放到查询的jsp(stuList.jsp)中:

<!--逻辑包含:当前jsp引用了page.jsp文件,底层是两个单独的jsp文件-->
<jsp:include page="page.jsp"/>

注:逻辑包含编译有jsp.java和jsp.class文件,相当于当前jsp引用了page.jsp文件,底层是两个单独的jsp文件。

相关文章:

Day39

Day39 JSP JSP底层 全称为Java Server Pages&#xff0c;JSP实际上就是一个servelet JSP:HTML页面Java代码&#xff0c;本质&#xff1a;servlet。 public class login_jsp{//JSP的9大内置对象private JSPWriter out;//当前JSP输出流对象private HttpServletRequest request;…...

Nginx之HTTP模块详解

Nginx是模块化的代码架构&#xff0c;其代码由核心代码与功能模块代码构成。Nginx的主要功能模块是HTTP功能模块&#xff0c;HTTP功能模块在HTTP核心功能的基础上为Nginx对HTTP请求的处理流程提供了扩展功能&#xff0c;这些扩展功能可以让用户很方便地应对访问控制、数据处理、…...

JCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNNGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分类效果 格拉姆…...

最新Prompt预设词分享,DALL-E3文生图+文档分析

使用指南 直接复制使用 可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; 支持GPTs SparkAi SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。支持GPT-4o…...

基于SpringBoot+Vue会所产后护理系统设计和实现

基于SpringBootVue会所产后护理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…...

Linux中的EINTR和EAGAIN错误码

Linux中的EINTR和EAGAIN错误码 在Linux系统中&#xff0c;进行系统调用时经常会遇到各种错误码。其中&#xff0c;EINTR&#xff08;Interrupted system call&#xff09;和EAGAIN&#xff08;Resource temporarily unavailable&#xff09;是两个较为常见的错误码&#xff0c…...

用户需求分析揭秘:最佳实践与策略

大多数产品团队都有自己处理客户需求的一套流程。但是那些潜在的客户和他们的需求呢&#xff1f;如果在产品管理上已经有一定的资历&#xff0c;很可能对此见惯不怪了。 通常&#xff0c;这些需求是销售人员跑来告诉你的&#xff0c;大概就是说&#xff1a;“超棒的潜在客户一…...

批量创建文件夹 就是这么简单 一招创建1000+文件夹

批量创建文件夹 就是这么简单 一招创建1000文件夹 在工作中&#xff0c;或者生活中&#xff0c;我们经常要用到批量创建文件夹&#xff0c;并且根据不同的工作需求&#xff0c;要求是不一样的&#xff0c;比如有些人需要创建上千个不一样名称的文件夹&#xff0c;如果靠手动创…...

LogicFlow 学习笔记——8. LogicFlow 基础 事件 Event

事件 Event 当我们使用鼠标或其他方式与画布交互时&#xff0c;会触发对应的事件。通过监听这些事件&#xff0c;可以获取其在触发时所产生的数据&#xff0c;根据这些数据来实现需要的功能。详细可监听事件见事件API。 监听事件 lf实例上提供on方法支持监听事件。 lf.on(&…...

Nginx缓存之代理缓存配置

Nginx 的缓存功能是集成在代理模块中的&#xff0c;当启用缓存功能时&#xff0c;Nginx 将请求返回的响应数据持久化在服务器磁盘中&#xff0c;响应数据缓存的相关元数据、有效期及缓存内容等信息将被存储在定义的共享内存中。当收到客户端请求时&#xff0c;Nginx 会在共享内…...

【Android】使用SeekBar控制数据的滚动

项目需求 有一个文本数据比较长&#xff0c;需要在文本右侧加一个SeekBar&#xff0c;然后根据SeekBar的上下滚动来控制文本的滚动。 项目实现 我们使用TextView来显示文本&#xff0c;但是文本比较长的话&#xff0c;需要在TextView外面套一个ScrollView&#xff0c;但是我…...

新能源汽车的能源动脉:中国星坤汽车电缆在新能源汽车电气化中的应用!

随着新能源汽车行业的蓬勃发展&#xff0c;汽车电缆组件作为汽车电气系统的核心组成部分&#xff0c;其重要性日益凸显。中国星坤汽车电缆组件以其卓越的性能和创新技术&#xff0c;为汽车的电能传输、信号传递和控制提供了坚实的保障。本文将深入解析星坤汽车电缆组件的特性、…...

AVL许可证查询系统

在数字化时代&#xff0c;软件已经成为企业运营的核心组成部分。然而&#xff0c;随着软件应用的不断增加&#xff0c;许可证管理也变得越来越复杂。AVL许可证查询系统作为企业软件资产管理的重要工具&#xff0c;能够帮助企业实现对软件许可证的全面掌控。本文将深入探讨AVL许…...

四个步骤,帮你成为价值导向型项目经理

在企业数字化转型的浪潮下&#xff0c;项目管理的方向逐渐从任务导向转变为以价值交付为导向。在快速变化的市场环境中&#xff0c;仅仅关注项目任务的完成已不足以确保项目的成功&#xff0c;需要更加注重项目的最终成果和价值&#xff0c;确保项目能够为组织带来实际的价值和…...

Python3 使用 clickhouse-connect 操作 clickhouse

版本&#xff1a; Python 3.7 x86 clickhouse 24.6.1.3573 clickhouse-connect 0.6.22 代码一&#xff1a; # pip install clickhouse-connectimport clickhouse_connect# 准备参数 host "192.168.1.112" port 8123 username "default" passw…...

Python脚手架系列-DrissionPage

记录DrissionPage模块使用中的一些常常复用的代码,持续更新… 接管谷歌浏览器 from DrissionPage import ChromiumPage, ChromiumOptionsco ChromiumOptions().set_local_port(4249) driver ChromiumPage(addr_or_optsco)创建driver&#xff0c;如果浏览器已开启优先接管&am…...

Java中如何调用mysql中函数

在Java中调用MySQL中的函数&#xff08;无论是存储函数还是自定义函数&#xff09;&#xff0c;通常是通过JDBC&#xff08;Java Database Connectivity&#xff09;来完成的。以下是一个简单的步骤说明和示例代码&#xff0c;展示如何在Java中调用MySQL中的函数。 步骤 添加…...

Huggingface-cli 登录最新版(2024)

安装Huggingface-cli pip install -U "huggingface_hub[cli]"设置好git的邮箱和用户名和huggingface的github账号一致 git config --global user.mail xxx git config --global user.name xxx登录 复制token&#xff0c;划红线的地方&#xff0c;在命令行中点击右…...

Java学习 - Docker管理和容器命令 实例

docker管理 查看docker版本&#xff0c;检测是否可用 sudo docker version查看docker 系统信息 sudo docker infodocker容器命令 容器状态 容器标识 容器长uuid容器短uuid容器名字 查看容器状态 sudo docker status [容器标识1] [容器标识2] [容器标识n]深入查看容器信息 su…...

下载工程resources目录下的模板excel文件

一、添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.1.0</version> </dependency> 二、编写接口 GetMapping("/downloadTemplate")public void downlo…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...