一、底层概述
我们在创建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 小案例
-
第一版:未使用 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>
-
第二版: 使用 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>
-
第三版:使用面向对象思维,省去 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>
-