6-JSP详解1

一、底层概述

我们在创建Web工程初期,IDEA会自动生成一个index.jsp。这个资源是默认的,当浏览器请求资源的时候,服务器返回的是一个jsp或者处理后的数据,这些都可以。JSP本质上就是一个Servlet,Servlet作用就是处理客户端请求以及做出响应。JSP作用主要负责与用户进行交互的,将最终的界面呈现给用户,其实就是HTML+CSS+JS+JAVA的混合文件。HTML布局,CSS调整样式,JS是动作,java负责填充数据。下面我们做个测试:

package com.sunshine.servlet;

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;

/**
 * @author 田港
 * @version 1.0
 * @date 2021-03-28 16:24
 */
@WebServlet("/testservlet")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("<!DOCTYPE html>");
        resp.getWriter().write("<html>");
        resp.getWriter().write("<head>");
        resp.getWriter().write("<title>JSP测试</title>");
        resp.getWriter().write("</head>");
        resp.getWriter().write("<body>");
        resp.getWriter().write("JSP测试");
        resp.getWriter().write("<h2>JSP测试</h2>");
        resp.getWriter().write("</body>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("POST");
    }
}

我们在doGet方法中,利用resp返回HTML内筒,看看页面效果:
在这里插入图片描述
是不是有点儿那个意思,jsp 其实就是 servlet。我们看看jsp的源码,在tomcat\work\Catalina\localhost\ROOT\org\apache\jsp中(work文件夹就是存放jsp转换为servlet之后的东西),index.jsp 转为 servlet 之后的 java 文件,名字就是index_jsp.java,里面主要也是实现了service方法。顺便提一下,注意里面这个语句out.write("...");

public void _jspInit() { // init 方法
}

public void _jspDestroy() {  // destroy 方法
}

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {  // service 方法
	// ...
}

index_jsp.java 变为 index_jsp.class 只有,再运行。所以我们直接开发JSP就好。其实我们在web文件夹中写一个纯 HTML 文件也可以在浏览器中访问
的,但是无法传入数据。这就是 JSP 的作用,JSP 是我们开发过程的中间层东西。

总结:

  • JSP 本质上就是一个 Servlet ,JSP 主要负责与用户交互,将最终的界面呈现给用户,HTML+CSS+JS+JAVA 的混合文件。
  • 当服务器接收到一个后缀是 jsp 的请求时,将该请求交给 JSP 引擎去处理,每一个 JSP 页面第一次被访问的时候,JSP 引擎会将它翻译成一个 Servlet 文件,再用外部容器来调用 Servlet 完成相应。
  • 单纯从开发角度来看,JSP 就是在 HTML 中嵌入 java 程序。

二、JSP 三种嵌入方式

  • JSP 脚本:执行 Java 逻辑代码。 <% java逻辑代码 %>

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      $END$
      <%
        String str = "java";
        System.out.println(str);  // 这里输出在控制台
      %>
      </body>
    </html>
    
  • JSP 声明:用来定义 Java 方法,不能在里面调用方法。<%! 定义Java 方法 %>

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      $END$
      <%!
        public String test() {
          return "Hello JSP";
        }
      %>
      <%
        String str = "java";
        System.out.println(str); // 这里输出在控制台
        test();
      %>
      </body>
    </html>
    
  • JSP 表达式:把 Java 对象直接输出到 HTML 页面中。<%=java变量%>

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      $END$
      <%!
        public String test() {
          return "Hello JSP";
        }
      %>
      <%
        String str = test();
      %>
      <%=str%>
      </body>
    </html>
    

三、JSP 小案例

  1. 第一版:未使用 java 的 for 循环

    <%@ page import="java.util.List" %>
    <%@ page import="java.util.ArrayList" %><%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2021-03-29
      Time: 16:47
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>jsp 小案例</title>
    </head>
    <body>
    <h1>Index</h1>
    <%
        List<String> names = new ArrayList<>();
        names.add("张三");
        names.add("李四");
        names.add("王五");
    
        List<Integer> ages = new ArrayList<>();
        ages.add(20);
        ages.add(21);
        ages.add(22);
    %>
    <table>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
        </tr>
        <tr>
            <td><%=names.get(0)%></td>
            <td><%=ages.get(0)%></td>
        </tr>
        <tr>
            <td><%=names.get(1)%></td>
            <td><%=ages.get(1)%></td>
        </tr>
        <tr>
            <td><%=names.get(2)%></td>
            <td><%=ages.get(2)%></td>
        </tr>
    </table>
    </body>
    </html>
    
  2. 第二版: 使用 java 的 for 循环

    <%@ page import="java.util.List" %>
    <%@ page import="java.util.ArrayList" %><%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2021-03-29
      Time: 16:47
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>jsp 小案例</title>
    </head>
    <body>
    <h1>Index</h1>
    <%
        List<String> names = new ArrayList<>();
        names.add("张三");
        names.add("李四");
        names.add("王五");
    
        List<Integer> ages = new ArrayList<>();
        ages.add(20);
        ages.add(21);
        ages.add(22);
    %>
    <table>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
        </tr>
        <%
            for (int i = 0; i < names.size(); ++i) {
        %>
        <tr>
            <td><%=names.get(i)%>
            </td>
            <td><%=ages.get(i)%>
            </td>
        </tr>
        <%
            }
        %>
    </table>
    </body>
    </html>
    
  3. 第三版:使用面向对象思维,省去 jsp 中的 重复的 List

    • 创建 entity 包,代表实体类的包,里面创建User.java

      package com.sunshine.servlet.entity;
      
      /**
       * @author 田港
       * @version 1.0
       * @date 2021-03-29 17:11
       */
      public class User {
          private String name;
          private Integer age;
      
          public User(String name, Integer age) {
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public Integer getAge() {
              return age;
          }
      }
      
    • jsp 页面修改

      <%@ page import="java.util.List" %>
      <%@ page import="java.util.ArrayList" %>
      <%@ page import="com.sunshine.servlet.entity.User" %><%--
        Created by IntelliJ IDEA.
        User: Administrator
        Date: 2021-03-29
        Time: 16:47
        To change this template use File | Settings | File Templates.
      --%>
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>jsp 小案例</title>
      </head>
      <body>
      <h1>Index</h1>
      <%
          List<User> users = new ArrayList<>();
          users.add(new User("张三", 21));
          users.add(new User("李四", 22));
          users.add(new User("王五", 21));
      %>
      <table>
          <tr>
              <th>姓名</th>
              <th>年龄</th>
          </tr>
          <%
              for (int i = 0; i < users.size(); ++i) {
          %>
          <tr>
              <td><%=users.get(i).getName()%>
              </td>
              <td><%=users.get(i).getAge()%>
              </td>
          </tr>
          <%
              }
          %>
      </table>
      </body>
      </html>
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值