目录
一、概述
二、JSP快速入门
2.1 导入JSP依赖
2.2 创建JSP页面
三、JSP原理
四、JSP脚本
4.1 JSP脚本分类
4.2 JSP的缺点
五、EL表达式
5.1 概述
5.2 代码演示
5.3 域对象
六、JSTL标签
6.1 if标签
6.2 foreach标签
6.2.1 用法一
6.2.2 用法二
七、MVC模式和三层架构
7.1 MVC模式
7.2 三层架构
7.3 MVC和三层架构
JSP(全程:Java Server pages):Java服务端页面。是一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容,也就是JSP=HTML+Java
javax.servlet.jsp
jsp-api
2.2
provided
该依赖的 scope 必须设置为 provided ,因为 tomcat 中有这个jar包了,所以在打包时我们是不希望将该依赖打进到我们工程的war包中。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
hello jsp
<%
System.out.println("hello,jsp~");
%>
JSP脚本用于在JSP页面内定义Java代码。
JSP脚本有如下三个分类
- <%...%>:内容会直接放到_jspService()方法之中
- <%=...%>:内容会放到out.print()中,作为out.pring()的参数
- <%!...%>:内容会放到_jspService()方法之外,被类直接包含
EL(全称Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。
EL表达式的主要作用是获取数据。其实就是从域对象中获取数据,然后将数据展示在页面中。
而EL表达式的语法也比较简单:${expression} 。例如:${brands} 就是获取域中存储的 key 为 brands 的数据。
package com.learn.web; /**
* @author 咕咕猫
* @version 1.0
*/
import com.learn.pojo.Brand;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 准备数据
List brands = new ArrayList();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
//2. 存储到request域中
request.setAttribute("brands",brands);
//3.转发到el-demo.jsp
request.getRequestDispatcher("el-demo.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
注意: 此处需要用转发,因为转发才可以使用 request 对象作为域对象进行数据共享
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${brands}
${pageContext.request.contextPath}
是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%>
JavaWeb中有四大域对象,分别是:
- page:当前页面有效
- request:当前请求有效
- session:当前会话有效
- application:当前应用有效
JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码。如下代码就是JSTL标签
男
女
类似于 Java 中的增强for循环。涉及到的 中的属性如下
- items:被遍历的容器
- var:遍历产生的临时变量
- varStatus:遍历状态对象
如下代码,是从域对象中获取名为 brands 数据,该数据是一个集合;遍历遍历,并给该集合中的每一个元素起名为 brand ,是 Brand对象。在循环里面使用 EL表达式获取每一个Brand对象的属性值
类似于 Java 中的普通for循环。涉及到的 中的属性如下
- begin:开始数
- end:结束数
- step:步长
MVC是一种分层开发的模式,其中:
- M:Model,业务模型,处理业务
- V:View,视图,界面展示
- C:Controller,控制器,处理请求,调用模型和视图
控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据; 控制器获取到数据后再交由视图(JSP)进行数据展示。
MVC好处:
- 职责单一,互不影响。每个角色做它自己的事,各司其职
- 有利于分工协作
- 有利于组件重用
三层架构是将我们的项目分成了三个层面,分别是表现层、业务逻辑层、数据访问层
- 数据访问层:对数据库的CRUD基本操作
- 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如:注册业务功能。我们会先调用 数据访问层 的 selectByName() 方法判断该用户名是否存在,如果不存在再调用 数据访问层 的 insert() 方法进行数据的添加操作
- 表现层:接受请求,封装数据,调用业务逻辑层,响应数据
而整个流程是,浏览器发送请求,表现层的Servlet接收请求并调用业务逻辑层的方法进行业务逻辑处理,而业务逻辑层方法 调用数据访问层方法进行数据的操作,依次返回到serlvet,然后servlet将数据交由 JSP 进行展示。
三层架构的每一层都有特有的包名称:
- 表现层: com.itheima.controller 或者 com.itheima.web
- 业务逻辑层: com.itheima.service
- 数据访问层: com.itheima.dao 或者 com.itheima.mapper
如上图上半部分是 MVC 模式,上图下半部分是三层架构。 MVC 模式 中的 C(控制器)和 V(视图)就是 三层架构中的 表现层,而 MVC 模式 中的 M(模型)就是三层架构中的 业务逻辑层 和 数据访问层。
可以将 MVC 模式 理解成是一个大的概念,而 三层架构 是对 MVC 模式 实现架构的思想。 那么我们以后按照要求将不同层的 代码写在不同的包下,每一层里功能职责做到单一,将来如果将表现层的技术换掉,而业务逻辑层和数据访问层的代码不需 要发生变化。