JavaWeb快速入门--MVC&EL&JSTL

  • JSP Model1第二代:JSP Model1第二代有所改进,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。虽然第二代比第一代好了些,但还让JSP做了过多的工作,JSP中把视图工作和请求调度(控制器)的工作耦合在一起了。
  • JSP Model2:JSP Model2模式已经可以清晰的看到MVC完整的结构了。
  • JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户
  • Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图
  • JavaBean:模型层,完成具体的业务工作
JSP Model2适合多人合作开发大型的Web项目,各司其职,互不干涉,有利于开发中的分工,有利于组件的重用。但是,Web项目的开发难度加大,同时对开发人员的技术要求也提高了

JavaWeb经典三层框架

JavaWeb的三层框架表示的时:所谓三层是表述层(WEB层)、业务逻辑层(Business Logic),以及数据访问层(Data Access)。

  • WEB层:包含JSP和Servlet等与WEB相关的内容;

  • 业务层:业务层中不包含JavaWeb API,它只关心业务逻辑;

  • 数据层:封装了对数据库的访问细节;

注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层依赖数据层,而Web层依赖业务层!

EL表达式


EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本语言(java)的编写。它的格式非常简单,具体格式为:${表达式},因此EL表达式可以简化我们的JSP页面,使我们的程序段更加简洁

EL运算符:EL表达式中支持运算符

  • 1. 算数运算符: +-*/或div%或mod

  • 2. 比较运算符: ><>=<===!=

  • 3. 逻辑运算符: &&(and) ||(or) !(not)

  • 4. 空运算符: empty

功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0

${empty list}:判断字符串、集合、数组对象是否为null或者长度为0

${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0

EL最主要的作用是获得四大域中的数据,格式:${EL表达式}

  • EL获得pageContext域中的值:${pageScope.key};

  • EL获得request域中的值:${requestScope.key};

  • EL获得session域中的值:${sessionScope.key};

  • EL获得application域中的值:${applicationScope.key};

  • EL从四个域中获得某个值:${key};

依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找,EL表达式只能从域对象中取值。

忽略el表达式

jsp默认支持el表达式的。如果要忽略el表达式,我们可以设置jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式,或者设置:\${表达式} :忽略当前这个el表达式

案例对比:

JSP代码

<%= a+b%>

<%

User user=(User)session.getAttribute(“userObj”);

String name =user.getName();

out.print(name);

%>

EL表达式:

${a+b}

${sessionScope.userObj.name}

EL表达式访问JavaBean对象与集合

在JSP页面中,如果我们想要访问JavaBean中的对象,我们会用到<jsp:getProperty>动作标记,通过使用EL表达式可以简化这个过程。我们只需要使用${域名称.对象名称.属性名称}${对象名称.属性名称}即可。而想要获取List集合时采用${域名称.键名[索引]},获取Map集合时使用:${域名称.键名.key名称}

隐式对象: EL表达式功能强大之处在于它能访问session、cookie、表单等对象,在它其中共包含11个隐式对象

| 隐式对象 | 说明 |

| — | — |

| applicationScope | 应用程序范围内的scoped变量组成的集合 |

| sessionScope | 所有会话范围的对象的集合 |

| requestScope | 所有请求范围内的对象的集合 |

| pageScope | 页面范围内所有对象的集合 |

| cookie | 所有cookie组成的集合 |

| header | HTTP请求头部,字符串 |

| headerValues | HTTP请求头部,字符串集合 |

| initParam | 全部应用程序参数组成的集合 |

| pageContext | 当前页面的怕个Context对象,提供了对页面属性的访问 |

| param | 所有请求参数字符串组成的集合 |

| paramValues | 所有作为字符串集合的请求参数 |

  • 与范围有关的隐式对象包括:pageScope、requestScope、sessionScope、applicationScope,则四个对象与jsp的pageContext、request、session、application一样。但只能取值,即只能getAttribute(String name);

  • 语法格式:

${appicationScope.username}

${sessionScope.username}

${requestScope.username}

${cookieScope.username}

  • 与输入有关的隐式对象:包括param与paramValues,它相当于JSP语句中的request.getParameter(String name);request.getParameterValues(String name);,语法格式${param.name}、${paramvalues.name}

  • cookie隐式对象

输出user:cookie:${cookie.user}

输出user的name:cookie:${cookie.user.name}

输出user的value:cookie:${cookie.user.value}

  • header 和 headerValues:header存储用户浏览器和服务器用来沟通的数据。 例如,获取用户浏览器的版本: ${header["User-Agent"]};,headerValues用于同一标头拥有不同的值的情况。

  • initParam:用于取得设定web站点的环境参数:${initParam.userid}

  • pageContext:用来取得其他相关用户要求或页面的详细信息:${pageContext.request.contextPath}

JSTL


什么是JSTL

JSTL(JavaServer Pages Tag Library):JSP标准标签库,是由Apache组织提供的开源的免费的jsp标签,apache对EL表达式的扩展,通过使用JSTL可以简化和替换jsp页面上的java代码。JSTL是标签语言,它与JSP动作标签一定,只不过它不是JSP内置的标签,需要我们自己导包(jstl-1.2.jar)到指定标签库。

JSTL一共包含四大标签库:core:核心标签库、fmt:格式化标签库、sql:数据库标签库、xml:xml标签库。除了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找到标签库的描述文件

core标签库常用标签:

  • out: out标签可以在JSP页面中输出指定字符串,起作用类似于"<%= %>",可以认为这个标签是一个增强了的EL表达式

out中的主要属性:

| 属性名称 | 说明 |

| — | — |

| value | 需要输出的值 |

| default | 如果value的值为null,显示default的值 |

| escapeXML | 是否转换特殊字符串 |

  • 样例:

  • 输出aaa字符串常量:<c:out value="str"/>

  • ${str}相同:<c:out value="${str}"/>

  • ${str}不存在时,输出xxx字符串:<c:out value="${str}" default="xxx"/>

  • escapeXml为false时不会识别字符串中的标签<c:out value="${str}" default="xxx" escapeXml="false" />

  • set: set标签用来声明一个变量,我们可以声明在JSP页面中或JavaBean属性中。

set中的主要属性:

| 属性名称 | 说明 |

| — | — |

| value | 要被存储的值 |

| var | 要存入的变量名称 |

| scopevar | 变量的JSP范围 |

| traget | 一个JavaBean或Map对象 |

| property | 指定target对象的属性 |

  • 样例:

  • 将属性值存储在session中:<c:set value=" value" var="name" default="xxx" scope="session"/>

  • 在pageContext中添加数据:<c:set var="name" default="xxx"/>

  • 将本体内容存储在范围为scope的name变量中:<c:set var="name" default="xxx" scope="{page|request|session|application}"/>

  • remove:remove标签用于移除指定范围内的变量,与set标签刚好相反。

删除所有域中指定名字的数据:<c:remove var="name"/><c:out value="${name}" default="none"/>

删除pageContext中指定名字的数据:<c:remove var="a" scope="page"/>

  • url:该标签会在需要URL重写时添加sessionId

url中的主要属性:

| 属性名称 | 说明 |

| — | — |

| value | 被包含文件的地址 |

| context | 相同服务器下的其他Web站点必须以'/'开头 |

| var | 存储被包含文件的内容 |

| scope | v

必看视频!获取2024年最新Java开发全套学习资料 备注Java

ar变量的存储范围 |

  • 样例:

  • 输出上下文路径:<c:url value="/"/>

  • 把本该输出的结果赋给变量,范围为request:<c:url value="/" var="name" scope="request"/>

  • 输出:/demo/Servlet1?username=abc&password=123

如果参数中包含中文,那么会自动使用URL编码!

<c:url value="/Servlet1">

<c:param name="username" value="abc"/>

<c:param name="password" value="123"/>

</c:url>

  • if:该标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行

if中的主要属性:

| 属性名称 | 说明 |

| — | — |

| test | 表达式结果为true执行,否则不执行 |

| var | 存储test的运算结果 |

| scope | var变量的JSP范围 |

  • 样例:

<c:set var=“test” value=“hello”/>

<c:if test=“${not empty test}”>

<c:out value=“${test}”/>

</c:if>

  • choose:choose标签对应Java中的if/else if/else结构。when标签的test为true时,会执行这个when的内容。当所有when标签的test都为false时,才会执行otherwise标签的内容

<c:set var=“score” value=“${param.score }”/>

<c:choose>

<c:when test=" s c o r e > 100 ∣ ∣ s c o r e < 0 " > 错误的分数: {score > 100 || score < 0}">错误的分数: score>100∣∣score<0">错误的分数:{score }</c:when>

<c:when test=“${score >= 90 }”>A级</c:when>

<c:when test=“${score >= 80 }”>B级</c:when>

<c:when test=“${score >= 70 }”>C级</c:when>

<c:when test=“${score >= 60 }”>D级</c:when>

<c:otherwise>E级</c:otherwise>

</c:choose>

forEach:用来循环遍历数组、集合,还可以用来计数方式来循环,forEach当前就是循环标签了,forEach标签有两种使用方式: 使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {}

循环遍历集合,类似for(Object o : 集合)

forEach中的主要属性:

| 属性名称 | 说明 |

| — | — |

| var | 临时变量 |

| begin | 循环开始位置 |

| end | 循环结束位置 |

| step | 设置步长,等同于Java中i++或i+=2,默认为1 |

| count | 循环次数,从1开始 |

| items | 遍历的集合对象 |

| varStatus | 循环状态对象 |

样例:

<c:forEach var=“i” begin=“1” end=“10”>

${i}

</c:forEach>

<c:forEach begin=“1” end=“10” var=“i” step=“2” varStatus=“s”>

${i} ${s.index} ${s.count}

</c:forEach>

<c:forEach items=“${list}” var=“str” varStatus=“s”>

${s.index} ${s.count} ${str}

</c:forEach>

fmt标签库常用标签

fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。 格式化时间:

<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>

<%

Date date = new Date();

总结

虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。

架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。

如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

image

${s.index} ${s.count} ${str}

</c:forEach>

fmt标签库常用标签

fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。 格式化时间:

<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>

<%

Date date = new Date();

总结

虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。

架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。

如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

[外链图片转存中…(img-sZDy5AMu-1716451695613)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值