JSP模式&EL&JSTL

EL

Expression Language。主要作用:获取数据、执行运算、获取 Web 开发常用对象。为了使用JSP写起来更加简单。表达式语言的灵感来自于,ECMAScript和Xpath表达式语言,它提供了在JSP中简化表达式的方法,让Jsp的代码更加简化。

EL的语法

以“ ” 符 号 开 始 以 “ ” 符 号 结 束 : {” 符号开始以“}”符号结束: { 表达式}

EL的使用:内置对象

在这里插入图片描述

  • 获得指定作用域的数据
<%--初始化数据--%>
<%
	pageContext.setAttribute("name","pValue");
	reauest.setAttribute("name","rValue");
	session.setAttribute("name","SValue");
	appplication.setAttribute("name","aValue");
%>

<%--使用JSP脚本获得--%>
<%=pageContext.getAttribute("name")%><!--如果没有找到 返回null-->
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>

<%--获得指定作用域的数据--%>
${pageScope.name}<!--如果没有找到,返回的是“ ”-->
${requestScope.name}
${sessionScope.name}
${applicationScope.name}

<%--依次获得数据--%>
${ name } <%--底层使用pageContext.findAttribute("name"),依此从page、request、session、application获得数据,如果都没有返回null--%>
  • 请求参数
//请求路径:/day18/a_el.jsp?username=jack&hobby=xxx&hobby=yyy
<%--
	param.xxx  对应request.getParamter("xxx");
	paraValue.xxx 对应request.getParamterValue("xxx");
--%>
	${param.username}<br/>
	${param.hobby}<br/> <%--获取hobby下第一个参数--%>
	${paramValues.hooby}<br/><%--获得一组数据,使用数组--%>
	${paramValues.hobby[1]}<br/><%--如果是数组,可以使用下标获得--%>
  • 请求头
<%--
	header.xxx  对应request.getHeader("xxx");
	headerValues.xxx  对应request.getHeader("xxx");
--%>
${header.accept}<br/>.
\${header.accept-Encoding}<br/><%--非法的,有异常,“-”被解析成减号。使用“/”进行单个el表达是转义--%>
${header.['accept-Encoding']}<br/>
${headerValue['accept-Encoding'][0]}<br/>
  • pageContext
<%--pageContext对应pageContext对象--%>
jsp: <%={HttpServletRequest}pageContext.getRequest()).getContextPath()%><br/>
el: ${pageContext.request.contextPath}<br/>
  • 全局初始化参数
<%--
	web.xml 配置
	<context-param>
			<param-name>person</param-name>
			<param-value>gua</param-value>
	</context-param>
	
	${initParam.person}对应servletContext.getInitParameter("person");
--%>
  • cookie
<%--
	cookie 没有对应api 底层使用request.getCookies()获得所有cookie,然后遍历并存放到Map中(Map<name,obj>)
--%>
 ${cookie} <br/>   <%--使用Map存所有cookie,Map<名称,对象>--%>
 ${cookie.company} <%--map.key获得对应value--%>
 ${cookie.company.name} <%--通过javabean属性获得属性,获得cookie的名称,对应方法getName()--%>
 ${cookie.company.value} <%--通过javabean属性获得属性,获得cookie的值,对应方法getValue--%>
  • .和[ ]的区别
1)[ ] 用于有下标的数据(数组,list集合) .用于有属性的数据(map,对象)
2)如果属性名中包含有特殊的字符,必须使用[ ]

EL的使用:获得数据

  • 自定义数据,必须存放在作用域
<%
	String str = "瓜";
%>
${str} <%--无法获得,str不在域中--%>
  • 获得字符串
<%
	String str ="瓜"
	//将输出存放到作用域
	pageContext.setAttribute("string",str);
%>
${string} <br/>
${pageScope.string} <br/>
  • 获得数组
String[] arr = {"A","B","C"};
pageContext.setAttribute("arr",arr,PageContext.REQUEST_SCOPE);
${arr} <br/>
${arr[1]} <br/>
  • 获得List数据
<%
	//模拟数据
	List<String> list = new ArrayList<String>();
	list.add("gua1");
	list.add("gua2");
	list.add("gua3");
	pageConte
%>
${list} <br/> <%--输出格式:[ , , ]--%>
${list[2]} <br/>
  • Map<String,String>数据
<%
	Map<String ,String> map = new HashMap<String,String>();
	map.put("li","小李");
	map.put("guo","小郭");
	map.put("wang","小王");
	pageContex.setAttribute("map",map);
%>
${map} <br/> <%--输出结果 :k=v ,。。。--%>
${map.li}<br/> <%--通过key获得数据--%>
  • 获得Map<String,JavaBean>数据
<%
	Map<String,User> Map2 = new HashMap<String,User>();
	map.put("u1",new User("u001","jack",18));
	map.put("u2",new User("u002","rose",21));
	map.put("u3",new User("u003","tom".25));
	pageContext.setAttribute("map2",map2);
%>
${map2} <br/>
${map2.u2} <br/>  <%--通过key获得数据--%>
${map2.u2.userName} <%--通过javabean属性获得数据--%>
${map2['3'].userName} <%--可以通过字符串‘3’获得数据,注意:Map.key类型为Integer将不能获得数据--%>

EL的使用:运算符

  • 模拟数据
pageContext.setAttribute("n1","10");
pageContext.setAttribute("n2","20");
pageContext.setAttribute("n3","30");
pageContext.setAttribute("n4","40");
  • 算术运算符
    在这里插入图片描述
${n1+n2+n3}
${1+1}<br/>
${"1"+1}<br/><%--将字符串转换成数字,然后计算--%>
${'1'+1}<br/><%--el没有字符--%>
${”a“+1}<br/><%--将a转换为数字,发生异常--%>
${a+1}<br/><%--a将作用域获得数据,如果没有--%>
  • 逻辑运算符
    在这里插入图片描述

  • 关系运算符
    在这里插入图片描述

  • 三元运算符
    ${n1<n2?“正确”:“错误”}

  • empty运算符

<$--
	1.对象是否为null
	2.字符串是否为”“
	3.集合是否为0
--%>
${user == null} = ${empty user}
${user!=null} = ${not empty user}

JSTL

概述

JSTL(JSP standard Tag Libary,JSP标准标签库) JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已!
JSTL一共包含四大标签库:
core:核心标签库,重点;
fmt:格式化标签库,只需学习两个标签;
sql:数据库标签库,过时;
xml:xml标签库,过时。

导入JSTL

除了JSP动作标签外,使用其他第三方的标签库都需要:

  • 导包;
  • 在使用标签的JSP页面中使用taglib指令导入标签库;

下面是导入JSTL的core标签库:

<%@ taglib prefix="c"uri="http://java.sun.com/jstl/core" %>
//    prefix="c":指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c;
 //  uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件;

常用标签库

out 和set 标签

<c:out value=”aaa”/>输出aaa字符串常量
<c:out value="${aaa}"/>输出与${aaa}相同的值
<c:out value="${aaa}" default=“xxx”/>当${aaa}不存在时,输出xxx字符串
<%request.setAttribute(“a”,“”);%><c:out value="${a }" default=“xxx” escapeXml=“false” />当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

set 标签

<c:set var=”a” value=”hello”/>pageContext中添加name为a,value为hello的数据。
<c:set var=”a” value=”hello” scope=”session”/>在session中添加name为a,value为hello的数据。

remove标签

<%
                   pageContext.setAttribute("a","pageContext");
                   request.setAttribute("a","session");
                   session.setAttribute("a","session");
                   application.setAttribute("a","application");
  %>
<c: remove var=“a”/>删除所有域中name为a的数据!
<c:remove var=“a” scope=”page”/>删除pageContext中name为a的数据
 <c: out value="${a}" default="none"/> 

url标签

<c:url value="/"/>输出上下文路径:/项目名/
<c:url value="/" var=“a” scope=“request”/>把本该输出的结果赋给变量a。范围为request
<c:url value="/AServlet"/>输出:/项目名/AServlet
<c:url value="/AServlet"> <c:param name=“username” value=“abc”/> <c:param name=“password” value=“123”/>输出:/项目名/AServlet?username=abc&password=123,如果参数中包含中文,那么会自动使用URL编码!

if标签

  • 语法1:没有标签体的情况,将结果存放到指定的作用域(不常用)
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]/>

上述语法格式中,<c:if>标签有三个属性:

test属性用于设置逻辑表达式
var属性用于接收逻辑表达式中变量的名字
scope属性用于指定var变量的作用范围
但如果test为false则都不执行

  • 语法2
    if标签的test属性必须是一个boolean类型的值,如果tetst的值为true,那么执行if标签的内容,否则不执行
//如果a为空,执行输出a
<c: set var="a" value="hello'/>
<c: if test="${not empty a}">
	<c:out value="${a }"
</c: if>

forEach标签

在JSP页面中 ,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个<c:forEach>标签,该标签专门用于迭代集合对象的元素,如,Set、List、Map、数组等,并且能重复执行标签体中的内容,它有两种语法格式:

  • 1.迭代包含多个对象的集合( 循环遍历集合,类似for(Object o : 集合){};)
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end'] [step="step"]>
	body content
</c: forEach>

实例

%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
	<c:out value="name: ${item }"/><br/>
</c:forEach>

  • 2.迭代指定范围内的集合(使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {};)
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]
	body content
</c:forEach>

实例

<c:set var="sum" value="0" /> 

<c:forEach var="i" begin="1" end="10"> 
	<c:set var="sum" value="${sum + i}" /> 
</c:forEach>

<c:out value="sum = ${sum }"/>

<c:set var="sum" value="0" />

<c:forEach var="i" begin="1" end="10" step ="2">
	<c:set var="sum" value="${sum + i}" />
</c:forEach>

<c:out value="sum = ${sum }"/>
  • var属性用于是当前迭代到的元素保存到page域中的名字,类似i
  • items属性用于指定将要迭代的集合对象,类似for(Object o : 集合){}中的集合
  • varStatus用于指定当前迭代状态信息的对象保存到page域中的名称,该属性用于设置一 个javax.servlet.jsp.jstl.core.LoopTagStatus 类型的变量,这个变量包含了从集合中取出元素的状态信息。使用<c:forEach>标签 的varStatus属性可以获取以下信息:
    • count:表示元素在集合中的序号,从1开始计数;
    • index:表示当前元素在集合中的索引,从0开始计数;
    • first:表示当前是否为集合中的第-一个元素:
    • last:表示当前是否为集合中的最后一个元素;
  • begin,end属性用于指定从集合第几个元素开始迭代默认从首到尾
  • step属性迭代步长

实例
遍历
在这里插入图片描述
结果
在这里插入图片描述

MVC设计模式

MVC设计模式: Model-View-Controller简写。

MVC是软件工程中的一种软件架构模式,它是一种分离业务逻辑与显示界面的设计方法。它把软件系统分为三个基本部分:模型(Model)、 视图(View) 和控制器( Controller)。

  ●  控制器Controller:对请求进行处理,负责请求转发;
  ●  视图View:界面设计人员进行图形界面设计;
  ●  模型Model:编写程序应用的功能(实现算法等等)、数据库管理;

在这里插入图片描述
MVC可对程序的后期维护和扩展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序简化,更加直观。
注意,MVC不是Java的特有的,几乎现在所有B/S结构的软件都采用了MVC设计模式。

JSP 对应的开发模式

JSPModel2
Model2使用到的技术有: Servlet、 JSP、JavaBean。Model2是MVC设计模式在Java语言的具体体现。
- JSP: 视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;
- Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;
- JavaBean:模型层,完成具体的业务工作,例如:转账等。

三层架构

JSP模式是理论基础,但实际开发中,我们常将服务器端程序,根据逻辑进行分层。–般比较常见的是分三层,我们称为:经典三层体系架构。三层分别是:表示层、业务逻辑层、数据访问层。

  • 表示层:又称为web层,与浏览器进行数据交互的。
  • 业务逻辑层: 又称为service层,专门用于处理业务数据的。
  • 数据访问层:又称为dao层,与数据库进行数据交换的。将数据库的一.条记录与JavaBean进行对应。

在这里插入图片描述

总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值