Servlet + (JSP、EL表达式、JSTL标签库)的 数据流转

两个Servlet之间的数据流转:靠的是作用域
作用域是数据流转的载体

  • 用request举例
    传统方式:在jsp界面中使用java脚本段

servlet的流程:

  1. 设置请求编码格式
    req.setCharacterEncoding("utf-8");
  2. 设置响应编码格式
    resp.setContentType("text/html;charset=utf-8");
  3. 获取请求信息
    String msg = req.getParameter("msg")
  4. 处理请求信息
    System.out.println("根据"+msg+"与数据库进行数据交互...");
  5. 响应处理结果
    进 行 数 据 流 转 进行数据流转
    //普通字符串的流转
    req.setAttribute("msg1","msg1普通字符串的流转");
    
    //对象类型
    User user = new User(1, "闪电", "打电动");
    req.setAttribute("user",user);
    
    //集合类型
    	/*--------------------List集合----------------------------------------*/
    	//List集合
    		//存储普通字符串
    		List<String> list1 = new ArrayList<String>();
    		list.add("沙妖str");
    		list.add("雪妖str");
    		list.add("火人str");
    		req.setAttribute("listStr", list1);
    		
    		//存储对象
    		List<User> list2 = new ArrayList<User>();
    		User user2 = new User(2, "美队", "打电动", new Address("美国"));
    		User user3 = new User(3, "钢铁侠", "打电动", new Address("美国"));
    		list.add(user2);
    		list.add(user3);
    		req.setAttriute("listObj", list2);
    		
    	/*---------------------Map集合----------------------------------------*/
    	//Map集合
    		//存储普通字符串
    		Map<String, String> map1 = new HashMap<String, String>();
    		map.put("k1", "北京str");
    		map.put("k2", "上海str");
    		map.put("k3", "广州str");
    		req.setAttribute("mapStr", map1);
    
    		//存储对象
    		Map<String, User> map2 = new HashMap<String, User>();
    		map2.put("ok1", new User(3, "成龙", "打电动"));
    		map2.put("ok2", new User(4, "小玉""打电动"));
    		map2.put("ok3", new User(5, "特鲁""吃"));
    		map2.put("ok4", new User(6, "老爹""古老魔法"));
    		req.setAttribute("mapObj", map2);
    
    请 求 转 发 请求转发
    req.geRequestDispatcher("msg.jsp").forward(req,resp);  	
    return;
    
    重 定 向 重定向
    req.sendRedirect("main.jsp"); 
    

get请求中传数据

localhost:8080/Myservlet/MySource?fm1=你好&fm2=JSP世界

jsp中获取数据

	<b><%=request.getAttribute("msg1")%></b><br/>			//界面输出:msg1普通字符串的流转
	<%=((User)request.getAttribute("user")).getName()%><br/>	//界面输出:闪电
	
<%!-- ********************************List集合********************** --%>
	<%=((ArrayList)req.getAttribute("listStr")).get(1)%><br/>	 //界面输出:雪妖str
	<%=((User)((ArrayList)req.getAttribute("listObj")),get(1)).getName()%><br/> //界面输出:钢铁侠
	<%=(ArrayList<User>)req.getAttribute("listObj").get(0).getName()%><br/>	 //界面输出:美队
	
<%!-- *******************************Map集合************************* --%>
	<%=((HashMap)req.getAttribute("mapStr")).get("k1")%>	  //界面输出:北京str
	<%=((User)((HashMap)req.getAttribute("mapObj")).get("ok4")).getSkill()%> //界面输出:古老魔法

传统作用域数据:
缺点:
1. 需要导包
2. 需要强转
3. 获取数据麻烦
所以使用EL表达式


EL表达式

1、全称:Expression Language,一种写法非常简介的表达式。
2、作用:让 jsp 书写起来更加的方便。不需要导包、不需要强转、方便
3、语法结构:${表达式},提供{}[]两种运算符来存取数据。

  • 获取请求数据:
    request对象存储了请求数据 => param.键名 直接返回值
    request对象存储了请求数据 => paramValues.键名 返回的是数组
  • 通过setAttribute方法存储到作用域对象中的数据
    ${键名} 返回所对应的值
    注意:如果是普通字符串,则直接返回
               如果是对象,则返回的是对象

使用:
a) 获取请求数据
i. 获取用户请求数据
ii. 获取请求头数据
        ${header}
iii. 获取 Cookie 数据
        ${cookie}

b) 获取作用域数据
i. 获取作用域数据
ii. 作用域查找顺序
        => 从小到大查找,找到就不再获取;
pageContext:当前界面
request:一次请求
session:一次会话
application:项目内,服务器启动时创建,服务器关闭 是消亡

iii. 获取指定作用域中的数据
        ${pageScope.msg1}
        ${requestScope.msg1}
        ${sessionScope.msg1}
        ${applicationScope.msg1}

c) 运算操作
i. 算术运算
        ${1+2}—— ${2*2} —— ${4/2} —— ${4%3}
        ${1+“2”} => 输出:3
ii. 关系运算
        ${4== 4} —— ${4>2}
        ${sex==1 ? ‘男’ : ‘女’ }
iii. 逻辑运算
        && 、|| 、!

d) 空值判断 empty
${empty obj} //输出true、false
Servlet + (JSP、EL表达式、JSTL标签库)的 数据流转_第1张图片

EL 中获取数据

	${param.fm1}		//获取get请求中的数据;界面输出:你好
	<b>${msg1}</b><br/>			//界面输出:msg1普通字符串的流转
	<%=((User)request.getParameter("user")).getName()%><br/>	
	${user.name}<br/>		//界面输出:闪电	
   
    <%!-- ********************************List集合************ --%>
	<%=((ArrayList)req.getAttribute("listStr")).get(1)%><br/>					
	${listStr[1]}<br/>		 //界面输出:雪妖str
	<%=((User)((ArrayList)req.getAttribute("listObj")),get(1)).getName()%><br/>
	${listObj[1].name}<br/>	 //界面输出:钢铁侠
	<%=(ArrayList<User>)req.getAttribute("listObj").get(0).getName()%><br/>	 
	${listObj.name}<br/>		//界面输出:美队
	
	<%!-- *******************************Map集合*************** --%>
	<%=((HashMap)req.getAttribute("mapStr")).get("k1")%>				   	 
	${mapStr.k1}			 //界面输出:北京str
	<%=((User)((HashMap)req.getAttribute("mapObj")).get("ok4")).getSkill()%>
	${mapObj.k1.skill}		 //界面输出:古老魔法

JSTL 标签库

1、 什么是 JSTL 标签库
JSTL 是 apache 对 EL 表达式的扩展(也就是说 JSTL 依赖 EL)
JSTL 是标签语言!JSTL 标签使用以来非常方便,它与 JSP 动作标签一样,只不过它不是 JSP 内置的标签,需要我们自己导包,以及指定标签库而已!

如果你使用 MyEclipse 开发 JavaWeb,那么在把项目发布到 Tomcat 时,你会发现,MyEclipse 会在 lib 目录下存放 jstl 的Jar 包!如果你没有使用 MyEclipse 开发那么需要自己来导入这个JSTL 的 Jar 包:jstl-1.2.jar。

2、 JSTL 标签库的作用
用来提升在 JSP 页面的逻辑代码的编码效率, 使用标签来替换逻辑代码的直接书写,高效,美观,整洁,易读。

3、 使用 JSTL 标签库
a) 内容:
i. 核心标签库(学习)
ii. 格式化标签库(了解)
iii. 函数标签库(了解)
iv. XML 标签库(了解)
v. SQL 标签库(了解)

b) 使用:
i. 导包
ii. 使用 taglib 标签引入资源 ( 核心标签库 )

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

iii. 核心标签库

<%request.setAttribute("str", "I'm OK!");%>

//1. 基本标签<c:out >c:out> => 输出
<c:out value="哈哈">c:out><br/>	//界面输出:哈哈		
<c:out value="${str}" default="hiahia">c:out><br/> //界面输出:I'm OK!	
${str}

//2. 基本标签<c:set >c:set>	=> 设置域中的数据
<c:set var="msg" value="msg:I’m pageContext" scope="page"><c:set>	//向当前作用域中设置值
<c:set var="msg" value="msg:I’m request" scope="request"><c:set>
<c:set var="msg" value="msg:I’m session" scope="session"><c:set>
<c:set var="msg" value="msg:I’m application" scope="application"><c:set>
<c:out value="${msg}">c:out><br/>				//界面输出:I’m pageContext
<c:out value="${requestScope.msg}">c:out><br/>	//界面输出:I’m requestContext
<c:out value="${sessionScope.msg}">c:out><br/>	//界面输出:I’m sessionContext
<c:out value="${applicationScope.msg}">c:out><br/>	//界面输出:I’m applicationContext

//3. 基本标签<c:remove />
<c:remove var="msg" scope="request" />	//在不指定作用域的情况下,4个作用域全删
<c:out value="${msg}"><c:out><br/>

//4. 逻辑标签<c:if test="${表达式}"> 前端代码 <c:if>
<c:set var="a" value="4">c:set>
<c:if test="${a>2}">
	<h4>今天天气有点凉 ·…· h4><br/>
c:if>

//5. 逻辑标签<c:choose ><c:when test="">c:when>...<c:otherwhise>c:otherwhise>c:choose>
<c:set var="score" value="90">c:set>
<c:choose >
	<c:when test="${score>=95}">A+c:when>
	<c:when test="${score>=90}">Ac:when>
	...
	<c:otherwhise>
		<c:set var="msg" value="不及格">c:set>
		<c:out value="${msg}">c:out>
	c:otherwhise>
c:choose>

//6.循环标签<c:forEach begin="1" end="4" step="2">c:forEach>
<c:set var="info"
 		value="jc:记录循环脚标、次数、是否为第一次、是否为最后一次;存在作用域中">
c:set>
<c:out value="${info}">c:out>

<c:forEach begin="0" end="4" step="2" varStatue="jc">
	循环体<br/>
	${jc.index}---${jc.count}---${jc.first}---${jc.last}
c:forEach>


<c:forEach items="${list}" var="user">
	循环体<br/>
	var:声明每次循环变量的值
	${user.name}
c:forEach>

iv. 格式化标签库
Servlet + (JSP、EL表达式、JSTL标签库)的 数据流转_第2张图片
在这里插入图片描述

你可能感兴趣的:(Servlet)