Jsp 入门学习

JSP 简介

什么是Java Server Pages?

  1. JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
  2. JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
  3. JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
  4. JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

为什么使用JSP?

  1. JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。
  2. JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持。
  3. JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。

JSP的优势

  1. 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
  2. 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
  3. 与静态HTML相比:静态HTML不包含动态信息。

JSP 的执行过程

  1. 首先,客户端发出请求(request ),请求访问JSP网页
  2. 接着,JSP Container将要访问的.JSP文件 转译成Servlet的源代码(.java文件)
  3. 然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行
  4. 最后把结果响应(response )给客户端

实例引入

创建一个Java EE Tomcat项目,在 index.jsp 文件里面,进行修改:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>JSP 的入门学习</title>
  </head>
  <body>
    <%
      System.out.println("这里可以定义Java代码!");
    %>
    这里是HTML ~ ~ ~
  </body>
</html>

启动tomcat服务器,访问该页面,页面内容如下:

这里是HTML ~ ~ ~

控制台输出:

这里可以定义Java代码!

项目被部署到的根目录为:~/Library/Caches/JetBrains/IntelliJIdea2020.1/tomcat/Tomcat_8_5_54_CookieStudy

在目录:apache/jsp/ 中可以看到一个 index_jsp.java 文件,这个文件就是通过index.jsp的内容生成的。查看该文件部分内容:

20200530231540

通过这里与上面的jsp文件,可以知道,其实给文件就是通过index.jsp文件生成的。且该类继承了Servlet的子类。


JSP定义Java代码的方式

  1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。

    如上面 20200530231540.png 图中的内容都是在 _jspService 类中的。

  2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。

  3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。


JSP的内置对象

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

如:

  • request

  • response

  • out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似

    javax.servlet.jsp.JspWriter out=null
    

    response.getWriter()和out.write()的区别:

    • 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
    • response.getWriter()数据输出永远在out.write()之前

案例

原Java类实现:cookie案例

通过JSP实现:

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Cookie 练习</title>
    </head>
    <body>
        <%
            // 设置响应的消息体的数据格式以及编码
            response.setContentType("text/html;charset=utf-8");
            // 获取所有Cookie
            Cookie[] cookies = request.getCookies();
            // 默认没有cookie为lastTime
            boolean flag = false;
            // 遍历cookie数组
            if(cookies != null && cookies.length > 0) {
                for (Cookie cookie : cookies) {
                    // 获取cookie的名称
                    String name = cookie.getName();
                    // 判断名称是否是:lastTime
                    if("lastTime".equals(name)) {
                        // 有cookie为lastTime,不是第一次访问
                        flag = true;
                        // 获取当前时间的字符串
                        Date date  = new Date();
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                        String stringDate = simpleDateFormat.format(date);
                        // 由于stringDate字符串中存在特殊字符(空格),需要URL编码
                        String encodeCookie = URLEncoder.encode(stringDate, "utf-8");
                        // 重新设置Cookie的值
                        cookie.setValue(encodeCookie);
                        // 设置cookie的存活时间:存活一个小时
                        cookie.setMaxAge(60 * 60);
                        // 在响应对象中添加该设置的cookie
                        response.addCookie(cookie);

                        // 响应数据
                        // 获取Cookie的value(时间)
                        String value = cookie.getValue();
                        // 对获取到的cookie值进行URL解码
                        String decodeValue = URLDecoder.decode(value, "utf-8");
                        %><h1>欢迎回来,您上次访问时间为:<%=decodeValue%></h1><%
                        // 已经完成了需求
                        break;
                    }
                }
            }
            // 假如上面遍历了所有的cookie,都没有cookie为lastTime,或者用户的请求中没有cookie,说明用户是第一次访问
            if(cookies == null || cookies.length == 0 || flag == false) {
                // 获取当前时间的字符串
                Date date  = new Date();
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                String stringDate = simpleDateFormat.format(date);
                // 由于stringDate字符串中存在特殊字符(空格),需要URL编码
                stringDate = URLEncoder.encode(stringDate, "utf-8");
                // 重新设置Cookie的值
                Cookie cookie = new Cookie("lastTime", stringDate);
                // 设置cookie的存活时间
                cookie.setMaxAge(60 * 60);
                // 重新发送cookie
                response.addCookie(cookie);
                %><h1>您好,欢迎您首次访问!</h1><%
            }
        %>
    </body>
</html>

与原java程序相比,这里将页面的输出语句,直接单独定义为HTML标签。

开启服务器,浏览器访问:http://localhost:8080/CookieStudy_war_exploded/cookie.jsp

20200531144010

再次访问该网址:

20200531144500

参考文献

  1. JSP 简介| 菜鸟教程
  2. JSP运行原理
Good Good Write Bug, Day Day Up
原文地址:https://www.cnblogs.com/liyihua/p/14477412.html