1.什么是JSP?
JSP是Sun 公司指定的一种服务器端动态页面技术的组件规范,Jsp是以“.jsp”为后缀的文件。重点是呈现,也就是前端处理,所以可以理解为在HTML中的JAVA代码,实现动态页面处理。(刚好与Servlet相反,Servlet可以理解为在JAVA代码中写HTML,注重的是业务逻辑)
2.JSP和Servlet的区别
☆JSP 以源文件形式部署到容器中。而 Servlet 需要编译成 class 文件后部署到容器中。
☆JSP 部署到 web 项目的根目录下或根目录下的其他子目录和静态同资源位于相同位置。 而 Servlet 需要部署到 WEB-INF/classes 目录中。
☆JSP 中的 HTML 代码会被 JSP 引擎放入到 Servlet 的 out.write()方法中。而在 Servlet 中我们需要自己通过对字符流输出流的操作生成响应的页面。
☆JSP 更擅长表现于页面显示,Servlet 更擅长于逻辑控制。
3.JSP的内置对象
JSP的内置对象 | 说明 |
request | HttpServletRequest类型的对象 |
response | HttpServletResponse类型的对象 |
session | HttpSession类型的对象(只有在包含session = "true"的页面中才可以被使用,解释这句话:因为session创建时候有true和false 系统默认设置为true 就是当你页面没有session对象时自动生成一个session对象,如果设置了false那么就算没有也不会自动生成,页面就没有session对象,当然就获取不到session了) |
application | ServletContext类型的对象 |
out | JspWriter类型对象 |
config | ServeltConfig类型对象 |
pageContext | PageContext类型对象,通过这个对象可以获取jsp中别的对象(request,session等),可以直接使用。(上下文对象) |
page | JSP本身 |
exception | 错误对象,当程序错了的时候显示异常信息,只有包含在 isErrorPage= "true" 的页面中才可以被使用 |
4.JSP的四大作用域对象
对象名称 | 作用范围(根据3中说明的对象类型理解) |
application | 整个应用都有效 |
session | 当前会话(当客户端)有效 |
request | 当前请求中有效 |
page | 当前页面有效 |
5.请求转发
这里先提一个概念 请求转发 为什么要这个呢,因为一个项目由大大小小的组件共同完成,其中有涉及MVC模式(可以简单理解为术业有专攻),JSP擅长页面处理,Servlet擅长业务逻辑,那么先在Servlet中处理属性,然后再放到JSP中继续别的处理。
6.JSP的使用
6.1JSP的三种原始标签
<%! %> 声明标签
声明标签用于在 JSP 中定义成员变量与方法的定义。标签中的内容会出现在 JSP 被编译 后的 Servlet 的 class 的{}中。
<% %> 脚本标签
脚本标签用于在 JSP 中编写业务逻辑。标签中的内容会出现在 JSP 被编译后的 Servlet 的_jspService 方法体中。
<%= %>赋值标签
赋值标签用于在 JSP 中做内容输出。标签中的内容会出现在_jspService 方法的 out.print() 方法的参数中。注意我们在使用赋值标签时不需要在代码中添加 “;”。
6.2JSP的指令标签
JSP指令标签的作用是声明JSP页面的一些属性和动作
<%@指令名称 属性 = "值" 属性 = "值"%>
指令:page(只要声明JSP页面的一些属性) include(静态包含) taglib(导入标签库)
每个指令标签都有不同的属性和动作,因为很多不常用,就不罗列了
eg. 用idea创建一个jsp文件时,它会在开头自动生成一段代码 如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
这就是page中的contentType(设置响应类型和编码),language(当前JSP可以嵌套的语言)属性。
6.3JSTL标签库
JSTL(Java server pages standarded tag library,即 JSP 标准标签库)JSTL 标签是基于 JSP 页面的。这些标签可以插入在 JSP 代码中,本质上 JSTL 也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL 的目标是 使 JSP 页面的可读性更强、简化 JSP 页面的设计、实现了代码复用、提高效率。 在 JSP2.0 版本后开始支持 JSTL 标签库。在使用 JSTL 标签库时需要在 JSP 中添加对应的 taglib 指令标签。
核心标签
找到这两个包选中导入,然后
在setting中设置配置文件
URI填的是http://java.sun.com/jsp/jstl/core
File选择包中的c.tld
然后再jsp文件中添加
格式化标签
SQL标签
XML标签
JSTL函数
7.EL表达式
7.1 什么是EL表达式
EL(Expression Language)是一种表达式语言。是为了使 JSP 写起来更加简单,减少 java 代码,可以使得获取存储在 Java 对象中的数据变得非常简单。在 JSP2.0 版本后开始支持 EL 表达式。
7.2 语法结构
7.3 表达式操作符
7.4 表达式隐含对象
使用EL表达式取出作用域中的值
获取作用域中的数据时,也可以只写属性名,EL表达式会根据作用域从小到大的顺序查找该属性的值。
${name}
7.5 标签使用示例
7.5.1核心库标签
<%--
Created by IntelliJ IDEA.
User: ShadoweI
Date: 2021/12/7
Time: 17:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:if test="true">
执行力
</c:if>
<%--从上到下获取 获取到 true 就输出 下面的不会再输出 如果没有符合的 输出otherwise--%>
<c:choose>
<c:when test="${1==1}">
执行了when1
</c:when>
<c:when test="${1==1}">
执行了when2
</c:when>
<c:otherwise>
执行了otherwise
</c:otherwise>
</c:choose>
<hr/>
<c:forEach begin="0" end="10" step="2" varStatus="var">
<%-- current 返回迭代因子 这里是循环的数字 以后集合中就是输出当前数字下标的元素 吧--%>
Foreach....${var.begin},${var.first},${var.last},${var.current}<br/>
<%-- Foreach....0,true,false,0
Foreach....0,false,false,2
Foreach....0,false,false,4
Foreach....0,false,false,6
Foreach....0,false,false,8
Foreach....0,false,true,10--%>
</c:forEach>
</body>
</html>
格式化标签
①Servlet
@WebServlet("/format.do")
public class formatServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("date",new Date());
req.setAttribute("number",2323565.23);
req.getRequestDispatcher("format.jsp").forward(req,resp);
}
}
②jsp
<%--
Created by IntelliJ IDEA.
User: ShadoweI
Date: 2021/12/9
Time: 21:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd"/>
<%-- 货币符号根据当前浏览器的语言选择 会四舍五入--%>
<fmt:formatNumber value="${requestScope.number}" type="currency"/>
</body>
</html>
test:
8.使用Foreach迭代map
需求:
创建Users对象,含有 userid,username属性。
创建一个Servlet,在Servlet中创建多个Users对象放到Map集合中,在jsp文件的页面中显示所有的USers对象的信息。
User类:
package javaClass;
public class User {
private int userid;
private String username;
public User() {
}
public User(int userid, String username) {
this.userid = userid;
this.username = username;
}
public void setUserid(int userid) {
this.userid = userid;
}
public void setUsername(String username) {
this.username = username;
}
public int getUserid() {
return userid;
}
public String getUsername() {
return username;
}
}
Servlet:
@WebServlet("/findUsers2.do")
public class findUsersServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, User> map = new HashMap<>();
User user1 = new User(1,"xdw");
User user2 = new User(2,"edg");
User user3 = new User(3,"fpx");
map.put("key1",user1);
map.put("key2",user2);
map.put("key3",user3);
req.setAttribute("map",map);
req.getRequestDispatcher("showUsers2.jsp").forward(req,resp);
}
}
JSP:
<%--
Created by IntelliJ IDEA.
User: ShadoweI
Date: 2021/12/9
Time: 21:13
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" align="center">
<tr>
<th>KEY</th>
<th>用户ID</th>
<th>用户名</th>
</tr>
<c:forEach items="${requestScope.map}" var="map">
<tr>
<td>${map.key}</td>
<td>${map.value.userid}</td>
<td>${map.value.username}</td>
</tr>
</c:forEach>
</body>
</html>
启动Tomcat 运行
结果:
9.MVC模式
User类,Servlet,Jsp 这三个就是典型的MVC模式:
MVC 模式:Model、View、Controller 即模型、视图、控制器。是软件的一种架构模式 (Architecture pattern)。MVC 要实现的目标是将软件的用户界面和业务逻辑分离,可提高 代码可扩展性、可复用性、可维护性、以及灵活性。 View(视图):用户的操作界面。如:html、jsp。 Model(模型):具体的业务模型与数据模型。如:service、dao、pojo。 Controller(控制):处理从视图层发送的请求,并选取模型层的业务模型完成响应的业务 实现,并产生响应。如:Servlet 。