Web核心—JSP入门/EL/JSTL标签/MVC+三层架构/一文速通

(一)概念:

Java Serve Page,是Java服务端页面。

(二)作用:

既能写html/css/js这样的前端语言,又能写java代码

(三)原理:

复制代码
为什么可以写html语句又可以写java代码?
答:因为jsp本质上就是Servlet,其继承自HTTPServlet,Servlet能写java代码,jsp继承了它自然也能写

(四)产生原因:

在一般的service()方法中编写一个页面的html语句实在太过麻烦,需要调用成百上千行的重复代码,例如字符输出流的write()方法,光这句代码就要连续上百行。因此诞生了jsp帮助我们快速简化代码。

复制代码
简化原理:这涉及到jsp文件在服务器中的变化过程。事实上,浏览器发送请求到tomcat服务器后,jsp文件会被转换成Servlet的java代码,需要我们原来自己苦逼敲代码生成的write语句都在这个java代码里面,只是它帮我们写好了。最后被转为class的字节码文件响应回浏览器。

(五)快速上手代码:

(1)配置jsp依赖
java 复制代码
<dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.2.1</version>
          <scope>provided</scope>
      </dependency>
(2)创建jsp文件

注意这个jsp文件一定要在webapps目录下,不是在web-Inf。

(3)编写jsp代码
java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
        <h1> Hello jsp </h1>>
        <%
            //这里不使用System即可,也不用在上方导入什么java.lang.System。更不用去下载什么Tomcat8的版本,不仅难下(既要设置好plugins语句,还要在下方设置好下载路径,因为目前的tomcat中央仓库没有tomcat8这个版本),而且即使配置成功,启动tomcat8的方式也与tomcat7不一样,,也不用专门去下一个jdk1.8版本(还要创建一个账户)。就算配置好了,不把System删了还是一点作用都没有
            out.println("hello world");
            // Tomcat7在某些配置下无法识别java核心类,我使用的搭配是jdk-17 + Tomcat7版本的搭配。
            application.log("hello world");
        %>
</body>
</html>

注意输出语句不要写成System.out.println()这个语句,因为Tomcat7在某些配置下是无法识别java里面的核心类的。如果实在想输出到输出台上,则可以使用application.log(String s )这个方法。而去掉了System的输出语句将会输出到页面里

JSP脚本:

(1)概念 :JSP页面内的java代码
(2)规范格式 有三种写法:

当jsp文件在服务器内部被转换成java文件后:

  1. <% ... %>

    这个格式里面的代码会被放入_jspservice()方法里mian

  2. <%= ... %>

    这个格式里面的代码会被放入out.println()里面作为参数

  3. <%! ... %>

    这个格式里面代码会被放入service()方法外面,直接作为类的一部分

等到黑马程序员演示如何在jsp文件中,将循环分割成两部分并在其中插入html语句,并且再次对代码进行分割的时候,我就意识到jsp是一个阅读起来极其不方便的技术。而且更重要的原因是在实际的业务中,前端人员不懂后端,后端人员不懂前端。加之需要更为严苛的依赖环境,就像我刚才无法正常使用System.out.println()语句是因为其配置问题。况且现在已经前后端分离了...基本不会再使用到jsp。

技术的演进

一开始我们把所有的代码都写在了Servlet [1] 里面,因此后续推出jsp [2] ,可以在jsp页面中同时编写html/java代码,但是由于可读性弱,因此采用Servlet + jsp [3] 模式,也就是将java代码移至Servlet中,负责一些关键的操作,例如数据库的连接。而jsp直接呈现页面,内容涵盖一些非java代码形式的代码 ,这也就是接下来着重要介绍的EL表达式JSTL标签。前者替换获取数据的java代码,后者替换循环遍历的java代码。

EL表达式

核心代码:

java 复制代码
${brands};

示例:

Java文件

java 复制代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        req.setAttribute("list",list);
        req.getRequestDispatcher("/hello.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }


}

jsp文件:

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>

<html>
<head>
    <title>Title</title>
</head>
<body>

           ${list};

</body>
</html>

注意,创建好数据一定要把数据手动放入req域中。访问网址后如果只显示${list}而不显示里面的内容,则只需在jsp文件中写入<% page isELIgnored="false" %>即可

复制代码
补充知识:JavaWeb四大域,由里到外,由小范围到大范围,分别是page,request,session,application.
1.page:在当前页面内资源有效,可以互通
2.request:在当前请求域内资源有效....
3.session:在当前会话内资源有效....
4.application:在当前应用内.....
EL表达式获取数据会从最低域开始级级向上,直到获取到信息为止。而未来我们使用的最多的就是request,session。page太小,而application又太大。

JSTL标签:

概念: JSP Standard Tag Library(JSP标准标签库)
快速入门:

  1. 创建依赖
  2. 在jsp页面上引入JSTL标签库
  3. 编写代码(其实就类似于导包)
(1)c:if

核心代码:

java 复制代码
<c:if test="${flag=1}">

</c:if>


<c:if test="${flag=2}">

</c:if>

这不像寻常的if-else嵌套结构。而是每一个条件代码都自成一块。

示例代码:
hello.jsp

java 复制代码
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>

<html>
<head>
    <title>Title</title>
</head>
<body>

<%-- test就是一个属性,其实就类似于if条件语句括号内的条件判断,为true则运行,为false则不能运行 --%>
          <c:if test="true">
              <h1> true </h1>>
          </c:if>>

<%--记住test=""的双引号之间不要只像if-else结构一样只写条件,不要忘了${} --%>
          <c:if test="${status == 1}">
              <h1> 启用 </h1>
          </c:if>

</body>
</html>

ServletDemo2:

java 复制代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        List<Brand> list = new ArrayList<>();
//        list.add(new Brand("1","三只松鼠","三只松鼠",100,"三只松鼠",1));
//
//        req.setAttribute("list",list);
        req.setAttribute("status",1);

        req.getRequestDispatcher("/hello.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }


}
(2)c:foreach

核心代码:

java 复制代码
<c:foreach items="..." var="...">

</c:foreach>

其实就是java里面的增强for循环,items就是你的那个待遍历的数据结构,var就是冒号前面那个你定义的承接数据结构元素的变量。

示例代码:
Brand:

java 复制代码
public class Brand {
    String id;
    String brandName;
    String companyName;
    int ordered;
    String description;
    int status;
    public Brand(String id, String brandName, String companyName, int ordered, String description, int status) {
        this.id = id;
        this.brandName = brandName;
        this.companyName = companyName;
        this.ordered = ordered;
        this.description = description;
        this.status = status;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public int getOrdered() {
        return ordered;
    }

    public void setOrdered(int ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

ServletDemo2:

java 复制代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Brand> list = new ArrayList<>();
        list.add(new Brand("1","三只松鼠","三只松鼠",100,"三只松鼠",1));
        list.add(new Brand("2","优衣库","优衣库",1,"优衣库",0));
        list.add(new Brand("3","小米","小米",10,"小米",1));

        req.setAttribute("list",list);
//        req.setAttribute("status",1);

        req.getRequestDispatcher("/hello.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }


}

hello.jsp:

java 复制代码
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>

<html>
<head>
    <title>Title</title>
</head>
<body>

<%-- test就是一个属性,其实就类似于if条件语句括号内的条件判断,为true则运行,为false则不能运行 --%>
<%--          <c:if test="true">--%>
<%--              <h1> true </h1>>--%>
<%--          </c:if>>--%>

<%--&lt;%&ndash;记住test=""的双引号之间不要只像if-else结构一样只写条件,不要忘了${} &ndash;%&gt;--%>
<%--          <c:if test="${status == 1}">--%>
<%--              <h1> 启用 </h1>--%>
<%--          </c:if>--%>
<table border="1" style="width: 100%; border-collapse: collapse;">
    <c:forEach items="${list}" var="brand" varStatus="Status">
        <tr align="center">
<%-- count就是说现在遍历到几个了,index就是当前元素的索引。后续不会太使用提前定好的那个id,因为如果缺了一个数据后面就全乱了--%>
            <td>${Status.count}</td>
            <td>${brand.brandName}</td>
<%--    这个时候会调用这个变量名的内部信息,不过倒不是这个变量内部的成员变量,而是这个变量内部getbrandName()/getID()这样的方法--%>
            <td>${brand.companyName}</td>
            <td>${brand.ordered}</td>
            <td>${brand.description}</td>
            <td>${brand.status}</td>
        </tr>
    </c:forEach>
</table>

</body>
</html>

注意:那个align在原先的IDEA中被划线了,意思是说这个玩意过时将被淘汰了,但目前还能用。
最终实现效果:

此外,c:foreach循环还有一种写法:

java 复制代码
<c:foreach begin="0" end="10" step="1" var="i">
</c:foreach>

begin是起始索引,end是终止索引,step是步长,var是循环变量

示例代码:

java 复制代码
<c:forEach begin="1" end="10" step="1" var="i">
        <a href="#" > ${i} </a>>
    </c:forEach>
//注意:第二行的那个{}里面写的不是var,直接就是i
<a...></a>是html中典型的定义超链接的语句
href=""里面定义的就是跳转到的链接/目标地址

这就是超链接:

注意:这跟重定向虽然十分相似,都是去往新的网址,但是重定向是从服务器返回状态码,然后由浏览器发送新的请求,而点击这个超链接是浏览器的主动发送请求数据

MVC模式和三层架构:

(1)MVC模式:Model + View + Controller

复制代码
1.Model:模型,常用javaBean
2.View:视图,常用JSP
3.Controller:控制器,实际上就是Servlet

而三层架构实际上就是对MVC模式的一种落地设计

(2)三层架构:表现层 + 业务逻辑层 + 数据访问层

复制代码
1.表现层:接收请求数据,调用业务逻辑层,响应回浏览器
2.业务逻辑层:组合数据访问层的操作,封装业务逻辑
3.数据访问层:与数据库交互,执行增删查改等操作

三层架构在项目中的应用较广,并且诞生了三大主流框架来简便其操作,提高其代码效率。例如:

复制代码
表现层---SpringMVC
业务逻辑层---Spring
数据访问层---Mybatis

而就三层架构对MVC实现的途径,下图能很好反应它们之间的关系

相关推荐
寒月霜华3 小时前
java-高级技术(单元测试、反射)
java·开发语言·单元测试·反射
独自破碎E3 小时前
Leetcode2166-设计位集
java·数据结构·算法
Cikiss3 小时前
LeetCode160.相交链表【最通俗易懂版双指针】
java·数据结构·算法·链表
很㗊3 小时前
C与C++---指针、引用、结构体及内存管理
c语言·开发语言
怪力左手3 小时前
地图下载工具
开发语言·ios·swift
wjs20244 小时前
C 标准库 - `<time.h>`
开发语言
聪明的笨猪猪4 小时前
Java Redis “Sentinel(哨兵)与集群”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
222you4 小时前
Mybatis(1)
java·tomcat·mybatis
靠近彗星4 小时前
1.5操作系统引导
java·linux·服务器·操作系统