JSP入门

Mr.he...大约 4 分钟JavaWebJSP

1. 概念

Java Server Pages(java服务器端页面)可以理解为,一个特殊的页面;其中既可以指定定义html标签,又可以定义java代码,作用是用于简化书写,减少写过多的类,并更好的实现页面的交互功能。

2. 原理

JSP本质上就是一个Servlet。

2.1. 解析

  1. 启动一个JavaWEB项目,找到控制台中Using CATALINA_BASE中的路径   C:\Users\HK\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Tomcat_8_5_311_Test
  2. 打开该路径,在work路径下可以找到.jsp文件被转化的后的.java文件和编译后的.class文件;
  3. 打开被转化后的.java文件,发现该类继承了org.apache.jasper.runtime.HttpJspBase类;
  4. 打开Tomcat的源码找到该类,可以发现该类继承了HttpServlet,因此JSP本质上就是一个Servlet。

3. JSP的脚本

JSP定义Java代码的方式,主要有下面三种:

  • <% 代码 %>:定义的java代码,相当于在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
  • <%! 代码 %>:定义的java代码,相当于在jsp转换后的java类的成员位置(成员变量、成员方法、静态代码块),比较少用。
  • <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

3.1. 代码解析

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      <%
      //写入到service方法中
        System.out.println("hello jsp");
        int i = 5;
        String contextPath = request.getContextPath();
        System.out.print(contextPath);
      %>

      <%! int i = 3;//相当于声明java的成员变量 %> 
      
      <%= i //定义的java代码的值,会输出到页面上,相当于out.print(i) %>
  </body>
</html>

4. JSP的内置对象

在jsp页面中不需要获取和创建,可以直接使用的对象,一共有9个内置对象。

目前主要学习以下3个:

  1. request
  2. response
  3. out:字符输出流对象,可以将数据输出到页面上,和response.getWriter()类似。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>输出流区别</title>
  </head>
  <body>
  <%!int i =8;//定义成员变量%>
  <%-- 定义的java代码的值,会输出到页面上,相当于out.print(i) --%>
  <%= i %//输出成员变量的值>
  <% out.write("out");%>
  <% response.getWriter().write("response");%>
  <%-- 页面上的输出为 response 8 out --%>     
  </body>
</html>

response.getWriter()out.write()的区别主要为,在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。因此response.getWriter()数据输出永远在out.write()之前。在实际使用中为避免混乱一般只用out.write()

5. 案例:改造Cookie案例

这种方式的代码很乱,后期会更多学习别的方式来简化。

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.UnsupportedEncodingException" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<%
    //1.设置响应编码
    response.setContentType("text/html;charset=utf-8");
    //2.从浏览器获取Cookie的数组
    Cookie[] cs = request.getCookies();
    //3.判断数组中是否存在Cookie内容
    //3.1存在Cookie内容
    if (cs != null && cs.length > 0) {
        //4.设置标签判断是否存在名为lastTime的cookie,然后遍历Cookie数组
        boolean flag = false;
        for (Cookie c : cs) {
            //5.判断是否存在名为lastTime的cookie
            //5.1存在名为lastTime的cookie
            if (c.getName().equals("lastTime")) {
                //标签变为真
                flag = true;
                //5.1.1输出上次登录时间
                %>欢迎你,你上次登录的时间为<%= URLDecoder.decode(c.getValue())%><%
                //5.1.2调用getCookie()的方法获取经过处理后的当前时间
                String nowTime = getCookie();
                //5.1.3将当前的时间存到名为lastTime的cookie中,对上次登录的时间进行更新
                c.setValue(nowTime);
                //5.1.4更新名为lastTime的cookie的值
                response.addCookie(c);
                //5.1.5停止当前循环
                break;
            }
        }
        //5.2如果标签为假,不存在名为lastTime的cookie,用户首次登录
        if (flag == false) {
            firstTime(response);
            %>欢迎你,这是你的首次登录<%
        }
    }
    //不存在Cookie内容,用户首次登录
    else {
        firstTime(response);
        %>欢迎你,这是你的首次登录<%
        }
%>
<%!
    /**
     * 用户首次登录的方法
     * @param response lastTime的Cookie
     * @throws IOException
     */
    private void firstTime(HttpServletResponse response) throws IOException {
        //1.调用getCookie()的方法获取经过处理后的当前时间
        String nowTime = getCookie();
        //2.生成cookie
        Cookie lastTime = new Cookie("lastTime", nowTime);
        //3.设置过期时间为一个月
        lastTime.setMaxAge(60 * 60 * 24 * 30);
        //4.添加名为lastTime的cookie到浏览器
        response.addCookie(lastTime);
    }
%><%!
    /**
     * 获取当前的时间
     * @return 处理后的当前时间
     * @throws UnsupportedEncodingException
     */
    private String getCookie() throws UnsupportedEncodingException {
        //1.获取当前时间戳
        Date date = new Date();
        //2.对时间进行格式化
        SimpleDateFormat sdf = new SimpleDateFormat();
        sdf.applyPattern("yyyy年MM月dd日 HH:mm:ss");
        String formatTime = sdf.format(date);
        //3.将格式化后的时间进行URL编码,防止乱码
        String nowTime = URLEncoder.encode(formatTime);
        return nowTime;
    }
%>
</body>
</html>