JSP
1.jsp介绍
jsp全称Java server Pages , java的服务页面. 。既可以写java代码又可以写html等前端代码,都有智能提示,开发效率高。
JSP=HTML + JAVA

2.JSP运行原理——

只有jsp文件被修改了才会在访问的时候将其翻译生成java文件
3.脚本代码3种方式
脚本代码片段
代码片段生成的位置:翻译成java文件在service处理请求方法内部
脚本表达式
代码片段生成的位置:翻译成java文件在service处理请求方法内部
脚本声明
代码片段生成的位置:翻译成java文件在service处理请求方法外部
总结:

4.三大指令

taglib:标签库指令
作用:用于导入标签库,在页面上使用
格式:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
include:包含另一个页面指令
语法:
<%@include file="URL" %> 指定要导入的地址
5.jsp的动作标签
include,forword,param
include——
作用:用于一个jsp页面动态包含另一个jsp页面
语法:
<jsp:include page="URL"/> URL是被包含的JSP页面
include动作与include指令的区别

forward——
作用:用于页面的转发,与
request.getRequestDispatcher("/URL").forword(request,response);
语法:
<jsp:forword page="URL"/> 转发
param
作用:用于页面的转发跳转的时候传递参数数据,经常与<jsp:forward>配合使用
语法:
<jsp:param name="参数名" value="参数值"/>
EL表达式
(使用el代替页面上的脚本表达式,简化输出)
格式
Expression Language;
${域里面的key脚本表达式}
作用:
1.从域里面获取数据进展示
2.可以使用运算符表达式
△(简化输出,代替脚本表达式)
以后servlet从数据库获取的数据放到域对象中,jsp使用el技术从域里面获取数据显示
JSP四大内置域对象——
pageContext,页面域
在一个页面内(一个资源内)有效,一个servlet内,不能实现资源之间传递数据的
request,请求域
一次请求内有效,适合转发传递数据
session
会话域,一次会话内有效,应用场景存储验证码和用户登录数据
servletContext(application别名)
上下文域,整个应用程序有效,存储的数据所有用户共享,应用场景统计某个资源访问量等等
pageContext相关方法:
页面域独有方法:
Object findAttribute(String key)
自动从四个作用域中去查某个键,从小到大的范围来查找,如果找到就停止。如果没有找到,返回null
作用:jsp的内置页面域对象,在一个页面内数据共享
EL作用1-获取指定域对象里面的数据
<p>pageContext的域数据:${pageScope.one}</p>
4个域对象里获取数据

获取域中不同类型的数据
1.el获取域里面常用类型的数据(javaBean,Map,数组,List)
2.数据一定要存储在域里面,el就可以获取
el作用2-el中使用运算符表达式
算术表达式:

比较表达式:

逻辑表达式:

JSTL核心标签库
Java Standard Tag Library Java标准标签库,apache开源组织开发的
如何在jsp页面上使用jstl标签?
1.导入jstl的jar包
2.在jsp页面上使用taglib资料导入标准标签库
jstl常用标签1-if和choose分支标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>if标签【重点】</h2>
<%--
作用:用于条件判断,相当于java代码if语句块
格式:<c:if test="${ 条件 }">
符合条件允许的代码
</c:if>
需求:往session域里面写入登录数据,使用if标签判断是否有登录数据,显示不同的信息
--%>
<%
//写入登录数据到session
session.setAttribute("loginUser","admin");
%>
<%--jsp页面使用if判断是否登录--%>
<c:if test="${empty loginUser}">
<p>请登录。。。</p>
</c:if>
<c:if test="${not empty loginUser}">
<p>欢迎您${loginUser}登录成功!</p> <%--结果为这个数据--%>
</c:if>
<h2>choose标签</h2>
<%--
作用:用于条件判断,相当于java代码if-else的语句块
格式:<c:choose>
<c:when test="${ 条件1 }"></c:when> ---》if
<c:when test="${ 条件2 }"></c:when> ---》else if
<c:otherwise></c:otherwise> ---》else
</c:choose>
需求:往session域里面写入登录数据,使用if标签判断是否有登录数据,显示不同的信息
--%>
<%
//写入登录数据到session
session.setAttribute("loginUser",null);
%>
<c:choose>
<c:when test="${empty loginUser}">
<p>请登录。。。</p> <%--结果为这个数据--%>
</c:when>
<c:otherwise>
<p>欢迎您${loginUser}登录成功!</p>
</c:otherwise>
</c:choose>
</body>
</html>
jstl常用标签2-foreach循环标签
<%@ page import="com.itheima.entity.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>foreach标签</h2>
<%--
作用:用于循环
1.次数循环格式:
<c:forEach begin="开始数字" end="结束数字" var="循环变量名称,相当于i" step="步长默认为1,循环变量递增值,类似i++">
循环体代码
</c:forEach>
2.List集合、数组循环格式【以后使用最多】:
<c:forEach items="使用el获取遍历的集合" var="集合的每个元素" varStatus="循环过程信息">
循环体代码
</c:forEach>
varStatus,循环过程信息,在线循环过程中foreach标签将一些数据放入到这个属性中,循环过程信息如下:
index,循环的索引,从0开始
count,循环的次数,从1开始
3.Map循环格式:
<c:forEach items="使用el获取遍历的Map集合" var="集合的每个元素类似每个entry" varStatus="循环过程信息">
获取每个元素的key=${entry.key} 获取每个元素的value=${entry.value}
</c:forEach>
java代码分析:
Set<Entry<String,Object>> set= Map.entrySet();
一个Entry包含着一个键值对
--%>
<h4>1.次数循环</h4>
<%--目标:输出5遍hello world--%>
<c:forEach begin="1" end="5" step="1">
<p>hello world</p>
</c:forEach>
<h4>2.List集合、数组循环</h4>
<%--目标:遍历用户列表集合--%>
<%
//定义用户列表List集合
List<User> userList = new ArrayList<>();
userList.add(new User("张三",20));
userList.add(new User("李四",22));
userList.add(new User("王五",23));
//写入域中
request.setAttribute("userList",userList);
%>
<c:forEach items="${userList}" var="user" varStatus="status">
<p>${status.count},${user.username},${user.age}</p>
</c:forEach>
<h4>3.Map循环格式</h4>
<%--目标:遍历用户列表Map集合--%>
<%
Map<String,User> map = new HashMap<>();
map.put("zhangsan", new User("张三",20));
map.put("lisi", new User("李四",22));
map.put("wangwu", new User("王五",23));
request.setAttribute("map",map);
%>
<c:forEach items="${map}" var="entry" varStatus="status">
<p>${status.index},${entry.key},${entry.value.username},${entry.value.age}</p>
</c:forEach>
</body>
</html>
MVC+三层架构开发模式
传统三层架构的问题

MVC结构

现代模式:MVC+三层架构模式

-使用MVC优化传统三层架构-
servlet职责:调用业务获取数据,存储到域,跳转到jsp页面
jsp职责:专门用于展现数据,使用el获取域里面的数据进行展现
网友评论