15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(2)

大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(2)

时间:2023-09-26 04:36:01 | 来源:网站运营

时间:2023-09-26 04:36:01 来源:网站运营

大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(2):

1.6 JSP优化

1.6.1 JSP的内置对象

上一个案例中我们虽然实现了页面展示数据库数据的效果,但是很遗憾的是页面由于加入了 Java代码,页面变得异常混乱,那么如果将Java代码和前端页面分开呢?

怎么分?一个功能分为两个终端(客户端与服务端)(前端与后端),客户端接收数据 提交给服务 端 服务端处理 然后把结果给客户端展示,这个就是一个完整的请求/响应模式;

但是模式是好模式可以分开又面临一个问题,数据如何在页面与页面之间传递呢,此时我们就 可以使用JSP的内容对象来解决

JSP内置对象是 Web 容器创建的一组对象

JSP内置对象的名称是JSP 的保留字,JSP内置对象是可以直接在JSP页面使用的对象,无需使 用“new”,直接使用。那么像这样的对象一共有9个

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、 pagecontext、config、page、exception

1、request对象

request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请 求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请 求方式以及请求参数等)。request对象的作用域为一次请求。

2、response对象

response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。 response对象也具有作用域,它只在JSP页面内有效。

3、session对象

session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map 类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂 的对象类型,而不仅仅局限于字符串类型。

4、application对象

application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保 存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类 似于系统的“全局变量”。

5、out 对象

out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他 的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

6、pageContext 对象

pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、 request、reponse、session、application 等对象。pageContext对象的创建和初始化都 是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

7、config 对象

config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些 信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境 中的Servlet程序和JSP页面提供初始化参数。

8、page 对象

page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

9、exception 对象

exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以 被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所 有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在

Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获 到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错 误页面中,然后在错误页面中处理相应的 exception 对象。

那我们经常使用的有五个 :

1.6.2 request对象

重要程度 : ☆☆☆☆☆ (最重要)

request对象主要用于处理客户端请求

举个例子 : 传输一个HelloWorld

a.jsp 有一个form表单需要往b.jsp传入一个 name="userName"的文本框内容

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>数据发送</title></head><body> <div> <form action="b.jsp" method="get"> 年轻的挑战者呀,请留下你的大名 : <input type="text" name="userName" /> <button type="submit">提交到服务器</button> </form> </div></body></html>b.jsp接收这个内容展示即可

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 获取a.jsp提交的数据 String userName = request.getParameter("userName"); out.print("欢迎你," + userName + ",欢迎来到JSP的世界;");%>此处需要注意的就是在接收页面数据的时候 需要根据页面 form表单中封装的 input标签的 name值来进行接收

并且此处接收到的数据只能是String 类型 ,因为这是我们的数据传输协议(HTTP协议)限制的




HTTP协议 :

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP初的目的是为了提供一种发布和接收HTML页面的方 法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本 (hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同 合作研究,终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。




根据上面的案例我们可知,request对象可以在请求与相应之间进行数据的传递,request对象的常用方法有:

根据不同的方法我们可以完成不同的功能 : 比如说 处理页面post请求乱码的问题 当我们把a.jsp的form提交方式改成post就会出现乱码问题:

这种情况就需要设置一下request的请求编码了

注意此时设置编码的位置一定是在接收数据之前!

设置成功,刷新页面再访问,就不会出现乱码情况了

再比如 接收页面复选框的值

已知页面有一组复选框

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>数据发送</title></head><body> <div> <form action="b.jsp" method="get"> <p> 年轻的挑战者呀,请留下你的大名 : <input type="text" name="userName" /> </p> <p> 年轻的挑战者呀,请选择你的特征 : <br /> <input type="checkbox" name="tedian" value="好看" />好看<br /> <input type="checkbox" name="tedian" value="年轻" />年轻<br /> <input type="checkbox" name="tedian" value="善良" />善良<br /> <input type="checkbox" name="tedian" value="有钱" />有钱<br /> </p> <p> <button type="submit">提交到服务器</button> </p> </form> </div></body></html>效果:

大家注意细节,复选框的name值都是统一的,所以接收这样的数据就需要特殊对待了;

<%@page import="java.util.Arrays"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 设置请求流编码 request.setCharacterEncoding("UTF-8"); // 接收单个name标签的值 String userName = request.getParameter("userName"); // 接收一堆 name相同的复选框的值 String[] tedians = request.getParameterValues("tedian"); out.print("欢迎您" + userName + "欢迎来到JSP的世界!<br />"); out.print("你居然是一个<strong>"+Arrays.toString(tedians)+"</strong>的人");%>此处注意,以为是多个name,一个用String变量,多个就需要用String[] 接收了;

后,request 还有一个方法就是 getRequestDispatcher 这个方法可以帮助request在多个 页面之间跳转并且传递的数据还会被转发过程中包含的页面共享,

那么我们看下用法

比如有这么一个系统,有两种类型的用户,一种普通用户,一种是贵宾用户vip,

要求

1. 普通用用户与VIP贵宾登录的时候提交到统一的地址

2. 服务器接收到用户姓名再判断用户身份跳转到不同页面展示

实现这个需求我们就可以使用request对象的转发功能来实现

具体实现步骤:

1. 创建用户的登录页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>用户登录</title></head><body> <div> <form action="login_server.jsp" method="post"> <p> 请输入您的用户名 : <input type="text" name="userName" /> </p> <p> <button type="submit">确定登录</button> </p> </form> </div></body></html>2. 创建login_server.jsp页面

<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 模拟数据库定义两组人 // 普通用户 String[] losers = {"赵文明","孙建国","王小花","李建军"}; // VIP用户 String[] vips = {"汤姆","杰瑞"}; // 设定编码 request.setCharacterEncoding("UTF-8"); // 接收页面请求 String userName = request.getParameter("userName"); // 定义最终的展示结果页 String result = "error.jsp"; //默认错误页 // 判断是不是普通用户 for(String a:losers){ if(userName.equals(a)){ result = "loser.jsp"; break; } } // 判断是不是VIP用户 for(String b:vips){ if(userName.equals(b)){ result = "vip.jsp"; break; } } // 根据业务结果转发到对应页面 request.getRequestDispatcher(result).forward(request, response);%>此处调用就是request对象的getRequestDispatcher方法,这个方法有一个参数是用来设定将请求发送的地址,页面发起请求先由统一的一个服务页面接收,然后根据业务不同再转发给其他页面进行操作;

后面的forward()方法叫做转发方法,也就是将现在的请求处理再交给其他程序处理,里面有两 个参数 request,response(下一章讲解)

注意 : 转发的写法 是 先设定请求地址 getRequestDispatcher("x.jsp") 然后再调用转 发方法 forward(request, response) 缺一不可!

3. 创建结果展示页

普通用户loser.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>普通用户</title></head><body> <div> 欢迎,<%=request.getParameter("userName") %> </div> <marquee behavior="alternate" scrollamount="20" onMouseOut="this.start()" onMouseOver="this.stop()"> <h1 style="color: red;font-size: 100px;"> 请赶紧充钱成为VIP用户 </h1> </marquee></body></html>


会员用户 vip.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html><html ><head> <meta charset="UTF-8"> <title>炫酷炸天VIP登录</title> <style type="text/css">html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}</style> <style type="text/css"> @import url(https://fonts.googleapis.com/css?family=Concert+One); h1 { animation:glow 10s ease-in-out infinite; /* For less laggy effect, uncomment this: animation:none; -webkit-text-stroke:1px #fff; =========== */ } * { box-sizing:border-box; } body { background:#0a0a0a; overflow:hidden; text-align:center; } figure { animation:wobble 5s ease-in-out infinite; transform-origin:center center; transform-style:preserve-3d; } @keyframes wobble { 0%,100%{ transform:rotate3d(1,1,0,40deg); } 25%{ transform:rotate3d(-1,1,0,40deg); } 50%{ transform:rotate3d(-1,-1,0,40deg); } 75%{ transform:rotate3d(1,-1,0,40deg); } } h1 { display:block; width:100%; padding:40px; line-height:1.5; font:900 8em 'Concert One', sans-serif; text-transform:uppercase; position:absolute; color:#0a0a0a; } @keyframes glow { 0%,100%{ text-shadow:0 0 30px red; } 25%{ text-shadow:0 0 30px orange; } 50%{ text-shadow:0 0 30px forestgreen; } 75%{ text-shadow:0 0 30px cyan; } } h1:nth-child(2){ transform:translateZ(5px); } h1:nth-child(3){ transform:translateZ(10px);} h1:nth-child(4){ transform:translateZ(15px); } h1:nth-child(5){ transform:translateZ(20px); } h1:nth-child(6){ transform:translateZ(25px); } h1:nth-child(7){ transform:translateZ(30px); } h1:nth-child(8){ transform:translateZ(35px); } h1:nth-child(9){ transform:translateZ(40px); } h1:nth-child(10){ transform:translateZ(45px); } </style></head><body> <figure> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1> <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1></figure></body></html>这里大家要考虑一个问题,不管是哪个展示页面其实地址栏中的地址始终停留在开始被请 求的login_server.jsp

我们可以观察下地址栏




地址栏中请求的地址还是停留在login_server.jsp,这就是转发特性了面对客户端来说它只知 道请求传递给了login_server.jsp,然后login_server.jsp再把请求交给谁处理就是服务器内部 的事情了

就好比我们的信息是一个快递,你发快递是发给 中通 顺丰 圆通 这就是请求的总地址,那么到 底是顺丰的哪个分部帮你处理了这个快递你其实是不知道的,但是因为人家又非常严密的链路结构,所以你的快递会顺利到 达终点,但是中间导了几手我们是不知道的,虽然我们不能很明确的知道内部细节,但是终结果就是不管导了多少手,数 据的传输肯定是通畅的,所以在request内部进行这种请求转发处理的时候不管转了多少次,都是可以接收到开始请求的 数据的;

而这种数据传输处理的方式 叫做request的请求转发链 它的特点就是发生在 服务器内部 浏览器看不到 每个内部的处理环节都可以处理请求的数据;

为了让大家更加清楚的知道转发的实际用途,我们接下来做个实战吧!




1.6.3 案例实战 : MVC模式与JSTL和EL表达式

1) 案例需求 : 页面1 发起请求希望能够展示所有人员信息 页面2接收并处理请求之后转发给 页面3展示数据;

2) 具体实现

1. 编写开始的请求页面 page1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>转发案例</title></head><body> <div> <h1>欢迎使用人员信息管理系统</h1> <h2>请选择一个功能吧!</h2> <ol> <li> <a href="page2.jsp" target="_blank">查询全部人员信息</a> </li> </ol> </div></body></html>效果 :

2. 编写page2.jsp 用来处理本次请求

<%@page import="java.util.List"%><%@page import="com.hnxy.db.Person"%><%@page import="org.apache.commons.dbutils.handlers.BeanListHandler"%><%@page import="com.hnxy.db.JdbcUtil"%><%@page import="org.apache.commons.dbutils.QueryRunner"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 获取数据 // 编写SQL语句 String sql = "select * from person"; // 创建SQL执行对象 QueryRunner qr = new QueryRunner(JdbcUtil.getDataSource()); // 占位符赋值 // 执行 List<Person> persons = qr.query(sql,new BeanListHandler<Person>(Person.class)); // 保存数据 request.setAttribute("list", persons); // 转发 request.getRequestDispatcher("page3.jsp").forward(request, response);%>需要留意page2.jsp调用了一个request.setAttribute(key, val); 的方法 将我们自己的list集合 用 名称 persons 保存在了request对象中,
此处大家需要注意的就是 request对象不仅能够保存页面中的提交元素,其实我们自己也可以往request里放入各种各样的值

3. page3.jsp展示数据

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>转发案例</title></head><body> <div> <h1>展示人员信息</h1> <table border="1"> <tr> <th>编号</th> <th>姓名</th> <th>性别</th> <th>年龄</th> <th>籍贯</th> </tr> <c:forEach var="p" items="${list}"> <tr> <td>${p.id}</td> <td>${p.name}</td> <td>${p.sex}</td> <td>${p.age}</td> <td>${p.from}</td> </tr> </c:forEach> </table> </div></body></html>大家 注意下这个数据的展示页面,完全没有java代码,但是还能展示出来数据

这个数据的展示页中我们应用一个EL表达式和JSTL表达式,这个我们放在下一个章节再说,这 里我们主要濑说明下现在我们的程序设计风格;




1.6.4 案例实战总结1 : MVC模式

1) 什么是软件设计模式?

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目 的、代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

2) 什么是MVC?

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,

一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部 件里面,在改进和个性化定制界面及用户交互的同时,

不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的 图形化用户界面的结构中。

视图(View)-对应组件:JSP或者HTML文件

控制器(Controller)-对应组件:Servlet(光写Java代码的

JSP)

模型(Model) -对应组件:JavaBean

总的来说 MVC 的软件设计模式是我们软件设计中非常常用的设计模式它能够使我们的各个 组件得以大限度的复用,降低各大组件的耦合,还是相当不错的

MVC设计模式 用在了 JavaWEB 请求与响应的被动服务应用程序中

3) MVC的发展历程

第一阶段 : 现在

第二阶段 : 马上要学习

第三阶段 : 框架设计阶段 springMVC --> spring

4) MVC设计模式的优缺点

MVC 优点
多视图共享一个模型,大大提高代码的可重用性
MVC三个模块相互独立,松耦合架构
控制器提高了应用程序的灵活性和可配置性
有利于软件工程化管理

MVC 缺点
原理过于复杂
增加了系统结构和实现的复杂性,难度;
视图对模型数据的低效率访问

5) 总结

现在我们就处在原始的model1的开发模式中 用一个JSP发送请求给 另一个jsp,接收请求 的这个JSP作为控制器,完成对数据的封装(我们通过查询可以获取对象或者list)

这就形成了模型,然后我们通过JSP内置对象转发给下一个JSP页面来展示数据,这个页面就 是视图;

当然,model1设计模式虽然好,但是在面对大型复杂业务的时候封装度还是不够,代码编写 麻烦,重复率高,所以后来我们还是要稳定在model2的时代来愉快的编程;




1.6.5 案例实战总结2 : EL与JSTL

1.6.5.1 EL表达式 重要程度 ★★★★

1) 为什么需要EL表达式

小脚本式取值对于页面来说来事过于繁琐,所以我们采用EL表达式的形式获取某个值是非 常轻松的

比如 :

小脚本 :

EL表达式

在获取某个值的时候因为不会再涉及Java代码,所以取值更灵活;




2) EL表达式概述

什么是EL

Expression Language(表达式语言)-- JSP内部一组已经定义好的获取数据的规范 ${已经存在的值}

EL的功能

替代JSP页面中数据访问时的复杂编码

EL的特点

自动转换类型 : EL得到某个数据时可以自动转换类型,所以不管从处理什么类型数据其实都是一样的

使用简单

3) EL表达式的语法

我们可以通过变量名取值,通过对象.属性的方式取值,通过集合名称获取集合元素

举例 :

先写个简单点的,比如你想获取你的web项目的项目名,也就是绝对定位到你的项目下,你可以这么写${pageContext.request.contextPath}它又什么用呢?以后我们向项目中引入CSS JS 的时候会用它这里我们要记住它的写法获取单个变量 : // 在Servlet或JSP中保存数据request.setAttribute("username", "admin");// 在JSP中访问数据姓名: ${username}如果获取对象属性 : // 在Servlet或JSP中保存数据request.setAttribute("p", person);// 在JSP中访问数据人员编号: ${p.id} 人员名称 : ${p.name} .......获取集合对象List : // 在Servlet或JSP中保存数据List names = new ArrayList();names.add(0, "LiYang");names.add(1,"WangHua");request.setAttribute("names",names);// 在JSP中访问数据姓名${ names[0] }<br/>姓名${ names[1] }<br/>注意 : 此处是用 变量[索引] 的方式获取集合中元素的值Map :// 在Servlet或JSP中保存数据Map names = new HashMap();names.put("one", "LiYang");names.put("two", "WangHua");request.setAttribute("names", names);// 在JSP中访问数据姓名${ names.one }<br/>姓名${ names["two"] }<br/>注意 : 其实获取map值只是把索引换成key而已4) EL表达式的基本操作符

关系操作符

逻辑操作符

empty操作符

5) 总结 : 以后我们页面取值的话,肯定都统一使用EL表达式进行取值和值的各种判断,所以 ${参数名称} 这种EL表达式取值一定要记住




1.6.5.2 JSTL表达式 重要程度 ★★★★

1) 为什么使用JSTL?

使用EL表达式可以简化JSP页面编码,封装了数据访问的功能,但是如果需要进行逻辑判断和 循环控制EL表达式是办不到的,而JSTL标签库整合弥补了这一问题;

JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能,二者结合使用才能完整实 现动态页面的开发需求;

2) 什么是JSTL?

JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开 放源代码的JSP标签库,是由apache的jakarta小组来维护的。

JSTL的优点是提供一组标准标签,可用于编写各种动态功能;

3) 怎么用JSTL

1. 引入jar包

jstl.jar : jstl标签的核心jar包

standard.jar : JSP标准标签库

2. 导入头部信息

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" p refix="c" %> 4) JSTL的常用标签

1. 页面赋值标签 <c:set> 页面取值标签 <c:out >

语法 :

<c:set var="变量名称" value="变量值" />

<c:out value="变量名称" />

举例 :

<div> <h1>set out 标签展示</h1> <!‐‐ set保存一个值 ‐‐> <c:set var="msg" value="hello,jstl!" /> <!‐‐ out取值 ‐‐> out 标签 :<h2><c:out value="${msg}" /></h2> <!‐‐ 直接取值也可以 ‐‐> 直接取值 :<h2>${msg}</h2></div>效果 :

2. remove标签:删除set标签设置的值

代码 :

<div> <h1>set out 标签展示</h1> <!‐‐ set保存一个值 ‐‐> <c:set var="msg" value="hello,jstl!" /> <!‐‐ 删除 ‐‐> <c:remove var="msg"/> <!‐‐ out取值 ‐‐> out 标签 :<h2><c:out value="${msg}" /></h2> <!‐‐ 直接取值也可以 ‐‐> 直接取值 :<h2>${msg}</h2> </div>效果 :

3. if标签

举例 :

<div> <!‐‐ 比如保存一个数字 ‐‐> <c:set var="num" value="10" /> <h1>if标签举例</h1> <h2>输入数字为:${num}</h2> <c:if test="${num%2==0}"> <h2>判断结果 : 偶数</h2> </c:if> <c:if test="${num%2!=0}"> <h2>判断结果 :基数</h2> </c:if> </div> 效果 :

问题 : JSTL中没有 if-else这种灵活的结构,如果希望拥有一个if-else怎么办呢?

4. choose标签 : if else 结构

举例 :

<div> <!‐‐ 比如保存一个数字 ‐‐> <c:set var="num" value="10" /> <h1>choose标签举例</h1> <h2>输入数字为:${num}</h2> <c:choose> <c:when test="${num%2==0}"> <h2>判断结果 : 偶数</h2> </c:when> <c:otherwise> <h2>判断结果 :基数</h2> </c:otherwise> </c:choose> </div>效果:

5. forEach : 实现对集合的遍历

forEach 有两种组合用法 :

第一种就是用于遍历集合元素的

<div> <h1>forEach编辑集合元素</h1> <% List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); // 保存到request中 request.setAttribute("list", list); %> <!‐‐ 遍历集合 ‐‐> <c:forEach var="s" items="${list}" varStatus="sta"> <p>第${sta.index+1}次循环 : 集合元素为 : ${s}</p> </c:forEach> </div>效果 :

第二种就是按次数遍历的,比如遍历十次输出1-10

代码 :

<!‐‐ 按次数遍历 ‐‐> <c:forEach var="i" begin="1" end="10"> ${i} </c:forEach>结果 :

1.6.5.3 拓展: 其他JSTL表达式

fmt 标签 : 用于数据格式化的标签

头部信息

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>举例说明 : 1. 数字格式化成 钱 的格式展示

代码 :

<div> <h1>格式化标签使用 : </h1> <c:set var="money" value="123.456" /> <p>没有格式化数字 : ${money}</p> <p>已经格式化数字 : <fmt:formatNumber type="currency" value="${money}" /> </p> </div>效果:

2. 格式化时间

代码:

<div> <h1>格式化标签使用 : </h1> <% Date date = new Date(); %> <c:set var="now" value="<%=date %>" /> <p>正常时间 : ${now}</p> <p>格式化好之后的时间:<fmt:formatDate value="${now}" pattern="yyyy-MM-dd"/></p> <p>格式化好之后的时间:<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日"/></p> <c:set var="money" value="123.456" /> <p>没有格式化数字 : ${money}</p> <p>已经格式化数字 : <fmt:formatNumber type="currency" value="${money}" /> </p> </div>效果:




1.6.3 response对象

重要程度 : ☆☆ (一般重要)

1) 刚才我们在写转发请求的时候涉及到了一个对象叫做response对象,那么接下来我们就介绍一下这个response对象

response对象 用于响应客户请求并向客户端输出信息

什么意思? 举个例子

request 是页面发送请求到服务器 然后服务器接收数据再做处理 因为客户端与服务器之间 传输的都是字符流 所以我们把request 叫做请求流

response正好相反,服务器处理完了页面请求之后需要发送结果给页面,此时就可以使用

response对象,因为它是服务器向客户端发送信息的对象 所以我们把response对象 叫做 响 应流

B/S 请求 与 响应 模式

request form数据 从页面带到服务端 1) 设置编码 2) 接收数据 3) 保存数据 4) 转发数据

对于我们来说 response 有一个方法我们需要留意一下 就是 void

sendRedirect(String location) 重定向

sendRedirect 方法叫做重定向,表示本次请求已经处理完,客户端将重新发送请求到指定的 URL;

重定向的特点是 重定向后 request对象会被重置,也就是说request中的信息都会丢失,并且 地址栏也会发生改变,改变成新的地址

看下效果:

login.jps发送请求给服务器login_server.jsp,如果login_server.jsp使用重定向方式跳转页面的话

<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 模拟数据库定义两组人 // 普通用户 String[] losers = {"赵文明","孙建国","王小花","李建军"}; // VIP用户 String[] vips = {"汤姆","杰瑞"}; // 设定编码 request.setCharacterEncoding("UTF-8"); // 接收页面请求 String userName = request.getParameter("userName"); // 定义最终的展示结果页 String result = "error.jsp"; //默认错误页 // 判断是不是普通用户 for(String a:losers){ if(userName.equals(a)){ result = "loser.jsp"; break; } } // 判断是不是VIP用户 for(String b:vips){ if(userName.equals(b)){ result = "vip.jsp"; break; } } // 根据业务结果转发到对应页面 // request.getRequestDispatcher(result).forward(request, response); // 重定向到结果页面 response.sendRedirect(result);%>效果

你看本来该展示会员名字的地方就已经没有数据了!

总结来看 :

转发与重定向的具体应用

什么时候用重定向?

因为它的流程是 页面请求 --> 服务器处理 --> 页面展示 这样三方处理需要数据不丢失的传递下去此时,我们需要用转发做页面与服务器之间的跳转




但是当我们做 添加 修改 删除 操作的时候,这三种操作都会影响我们保存的数据,所以只要你 做了三种操作中的任意一种,你之前保存的数据就都不对了,所以

我们需要重新查询数据 从定向 代表本次操作已经完成了 然后开启下一次操作,如果使用重 定向也意味着 页面请求 --> 服务器操作 此时服务器操作完 这个业务就结束了;




什么时候用转发?

比如说我们做查询的时候 这个时候 第一个页面发起请求 --> 服务端 处理 数据--> 第三个 页面展示 这几个页面之间需要保证是在一次转发链之中 所以他们之间的跳转必须用转发才 能完成!




根据我们业务进行区分的话

1) 数据操作的时候

1. 事务操作 添加 修改 删除

2. 非事务的 查询

2) jdbc操作

1. queryrunner update 添加 修改 删除

2. queryrunner query 查询

3) 页面操作的时候

1. 重定向 添加操作 更新操作 删除操作 完成之后 肯定是从定向到 查询请求上

2. 转发 查询的时候因为要保存数据 所以基本都采用转发的形式 跳转下一个页面



关键词:数据,基础,交互,动态,入门,深入

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭