JSP详解
概念
jsp(java server pages):
java服务器端页面,可以理解为一个特殊的页面,其中既可以定义html,也可以定义java代码
用于简化书写!!!
原理
jsp本质上就是servlet
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGsgCwp6-1631205417783)(C:\Users\Sir. Alexander\Downloads\未命名文件 (1)].jpg)
JSP指令
-
jsp指令:用于配置JSP页面,导入资源文件
-
格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 …%>
-
分类:
-
page:配置 JSP页面
content-type: 等同于response.setContentType()
1.设置响应体的mime类型及字符集 。
2.设置当前JSP页面的编码(只有高级的IDE才能生效,如果使用低级工具,则需要使用pageEncoding属性来设置当前页面的字符集编码)。
language: 页面的语言(只写"java")。
buffer: 设置缓冲区大小。
import:用来导包,将来会写到jsp文件生成的servlet类当中去。
errorPage:当前页面发生异常时,会自动跳转到指定的异常页面。
isErrorPage:标识当前页面是否时异常页面。为true的话,可以使用内置对象exception。默认情况下为false。
-
include:导入页面的资源文件。可以用来导入其他 JSP文件
例如<%@ include file=“head.jsp” %>
-
taglib:导入资源
例如<%@ taglib prefix=“c” uri=“XXXXXX” %>
-
JSP注释
1.html注释: ,只能用于注释html标签
2.jsp注释:<%-- --%>,可以注释所有内容(推荐使用)
JSP脚本
jsp脚本:jsp定义定义Java代码的方式
-
<% 代码 %>:定义的代码在service方法中。service方法中可以定义什么,该脚本就可以定义什么。
-
<%! 代码 %>:定义的代码,在JSP转换为servlet的代码后,位于成员变量位置。
-
<%= 代码 %>:定义的代码,会输出到页面,输出语句可以定义什么,该脚本就可以定义什么。
JSP内置对象
-
jsp内置对象:在jsp页面中,不需要获取和创建,可以直接使用的对象。
-
jsp一共有9个内置对象:前四个为域对象
变量名 真实类型 作用 pageContext(域对象) PageContext 当前页面共享数据,还可以获取其他八个内置对象 request(域对象) HttpServletRequest 一次请求访问的多个资源之间共享数据(请求转发) session(域对象) HttpSession 一次会话的多个请求间共享数据 application(域对象) ServletContext 所有用户间共享数据 response HttpServletResponse 响应对象 page Object 当前页面(servlet)的对象,可以理解为this out JspWriter 输出对象,将数据输出到页面 config ServletConfig servlet的配置对象 exception Throwable 异常对象,只有在声明了isErrorPage=true的页面可以使用
-
request
-
response
-
out:字符输出流对象,可以将数据输出到页面上。和response.getWriter()类似
response.getWriter().write()和out.write()的区别:
在tomcat真正给浏览器做出响应之前,会先找response.getWriter()输出流的缓冲区,再找out输出流的缓冲区,所以 response.getWriter().write输出的数据永远在out.write()输出的数据之前
-
pageContext
-
session
-
application
-
page
-
config
-
exception
MVC开发模式
jsp演变历史
- 早期只有servlet,只能使用response输出标签数据,非常麻烦、
- 后来有了JSP,简化了servlet的开发,但过度使用jsp,在jsp中既写Java代码,又写html标签,难于维护
- 再后来,Java的web开发借鉴了MVC开发模式,使得程序的设计更加具有合理性
MVC开发模式
M:model(模型)用JavaBean实现,完成具体的业务操作如:查询数据库,封装对象
V: view(视图) 用JSP实现,用于展示数据
C:controller(控制器)用Servlet实现,用于:1.获取用户的输入 2.调用模型 3.将数据交给view来展示
MVC的优缺点
优点:1.耦合性低,方便维护,便于分工合作 2.重用性高
缺点:1.使得项目的架构变得复杂,对开发人员要求变高
2.不适合中小型项目
EL表达式
概念:
Expression Languuage 表达式语言
作用:
替换和简化jsp页面中Java代码的编写
语法:
${表达式}
-
注意:jsp默认是支持el表达式的,如果不想el被解析,(1)则需要在jsp的指令配置中将isELIgnored=“true”(不解析所有的el), (2)或者在el表达式前加上,例如 \${3>4}
-
使用:
-
运算
运算符 符号 算术运算符 + - * / 比较运算符 > < >= <= == != 逻辑运算符 &&(and) ||(or) !(not) 空运算符 empty(用于判断字符串,集合,数组对象是否为null或者长度为0) -
获取值:
el表达式只能从域对象中获取值,如果el没有找到对应的键名,el会返回空字符串,而不是null或其他,这样不会影响页面布局
语法:
- ${域名.键名}:从指定域中获取指定键的值
域名 对应的域对象 pageScope pageContext requestScope request sessionScope session applicationScope application 举例:在request域中存储了name=张三 ,获取:${requestScope.name}
- ${键值}:只写了键名并且多个域对象设置了相同的键名时,按域对象范围从小到大,找指定的值
<%@ page contentType="text/html;charset=GBK" language="java" %> <html> <head> <title>Title</title> </head> <body> <% request.setAttribute("张三",1914111111); session.setAttribute("李四","你是一个笨蛋"); pageContext.setAttribute("王五","teacher1"); application.setAttribute("name","hhaahhaa"); application.setAttribute("王五","teacher2"); %> ${ 张三 } ${李四} ${王五} ${applicationScope.王五} ${name} </body> </html>
-
获取 对象、list集合、map集合 的值
-
获取对象的属性: ${域名称.键名.属性名}
el表达式获取对象属性的原理:
例如:el要获取Student 类里面 的name 属性,它会找Student类里面的 getName()方法,并将其返回值作为输出,出,如果没有对应的getter方法,则会报错。
-
获取list集合内的元素: ${ 域名称.键名[索引] } ps:角标越界会输出空字符串而不是null
-
获取map集合内的元素: ${ 域名称.键名.key名} 或者 ${ 域名称.键名[“key名”]} ps:找不到key名会输出空字符串而不是null
-
-
隐式对象:
-
el表达式中有11个隐式对象(可以在el表达式中直接使用)
-
pageContext:
功能:获取jsp其他8个内置对象
例如: ${pageContext.request.contextPath} (动态获取虚拟目录)
JSTL标签
概念:
javaserver pages tag library (jsp标准标签库),是由apache组织提供的开源免费的jsp标签
作用:
用于简化和替换jsp页面上的Java代码
使用步骤:
- 导入jstl相关的jar包
- 引入标签库:taglib指令<%@ taglib %>
- 使用标签
常用的jstl标签:
-
if标签:相当于if语句
属性:test为必要属性,接受Boolean类型的值,一般情况test属性值会结合el表达式一起使用,如果表达式为true,显示标签体内的内容;如果为false,则不显示
注意:if标签没有else,如果想用,在添加一个if标签即可
-
choose标签:相当于switch语句
使用:1. 使用choose标签声明 (相当于switch)2.使用when标签选择(相当于case)3.使用otherwise标签做其他情况声明(相当于default)
-
foreach标签:相当于for语
功能:1. 执行重复操作 2.遍历容器
执行重复操作属性: begin(起始值) end(结束值) var(临时变量) step(步长) varStatus(循环状态对象,有两个属性值,index:循环的索引,从0开始;count:循环的次数,从1开始)
遍历容器属性:items(容器对象) var(临时变量) varStatus(循环状态对象,有两个属性值,index:循环的索引,从0开始;count:循环的次数,从1开始)
<%@ page import="cn.zgq.javaweb.Student" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=GBK" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Student student = new Student("董",20,new Date());
HashMap hashMap = new HashMap();
hashMap.put("name","佳节");
hashMap.put("details",student);
session.setAttribute("hashMap",hashMap);
session.setAttribute("num", 3);
%>
<h1>if标签的用法</h1>
${num}
<c:if test="true">
大家好,我是渣渣辉
</c:if>
<c:if test="${num mod 2==0}">
<h2>我是偶数</h2>
</c:if>
<c:if test="${num mod 2==1}">
<h2>我是奇数</h2>
</c:if>
<h1>choose 标签的用法</h1>
<c:choose>
<c:when test="${num==1}"><h2>星期一</h2></c:when>
<c:when test="${num==2}"><h2>星期二</h2></c:when>
<c:when test="${num==3}"><h2>星期三</h2></c:when>
<c:when test="${num==4}"><h2>星期四</h2></c:when>
<c:when test="${num==5}"><h2>星期五</h2></c:when>
<c:when test="${num==6}"><h2>星期六</h2></c:when>
<c:when test="${num==7}"><h2>星期天</h2></c:when>
<c:otherwise ><h2>num值错误</h2></c:otherwise>
</c:choose>
<h1>for标签的用法</h1>
<c:forEach begin="1" end="10" step="2" var="i">
<h2>${i}</h2>
</c:forEach>
<c:forEach items="${hashMap}" var="h" varStatus="s">
<h2>${h} "第"+${s.count}+"个" </h2>
<h2>${h} "索引为"+${s.index}+"个"</h2>
</c:forEach>
</body>
</html>
三层架构
-
概念:软件设计架构
-
详情
-
界面层:用户看得见的界面。用户可以通过界面上的组件和服务器进行器件。
-
业务逻辑层:处理业务逻辑。
-
数据访问层:操作数据存储文件。
r=“i”>
-
${i}
${h} "第"+${s.count}+"个"
${h} "索引为"+${s.index}+"个"
</c:forEach>
# 三层架构
1. 概念:软件设计架构
2. 详情
- 界面层:用户看得见的界面。用户可以通过界面上的组件和服务器进行器件。
- 业务逻辑层:处理业务逻辑。
- 数据访问层:操作数据存储文件。