04-JavaWeb开发JSP&EL&JSTL&MVC&Bootstrap前端框架

Posted ahcfl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04-JavaWeb开发JSP&EL&JSTL&MVC&Bootstrap前端框架相关的知识,希望对你有一定的参考价值。

文章目录

typora-copy-images-to: img
typora-root-url: img

知识回顾

1.会话技术:用户打开浏览器并访问网页开始,直到关闭浏览器会话结束
2.Cookie:
	1)属于一个一个类,可以创建对象
	2)创建服务器端,存储到浏览器端,好处:减少服务器压力,弊端:不安全
	3)API:
		1.创建对象 :new Cookie(name,value)
		2.获取name:getName()
		3.获取value:getValue()
		4.修改value:setValue()
		5.设置最大存活时间:setMaxAge(秒)  默认是会话级别的cookie,浏览器关闭就销毁。通过该函数可以持久化cookie
		6.设置有效路径:setPath(path)
3.Session:
	1)属于HttpSession接口类型,使用tomcat的实现类创建对象
	2)创建对象:HttpSession session= request.getSession();  第一次是创建,后续就是获取
	3)获取唯一标识JSESSIONID:getId()
	4)销毁方法:invalidate()
	5)session原理:第一次创建session在服务器中,为每个用户开辟一个session容器,每个容器具有唯一标识JSESSIONID,然后tomcat默认创建会话级别的cookie存放JSESSIONID,然后将cookie响应给浏览器,下次访问的时候携带cookie中JSESSIONID,然后进行比较找到自己的session容器。
	6)session持久化方案:就是持久化cookie。
		创建session
		获取JSESSIONID
		创建cookie:new Cookie("JSESSIONID",seesionid的值);
		设置存储时间
		响应给浏览器
	7)session的钝化和活化:了解
		钝化:序列化。正常关闭tomcat,会将session中的数据序列化到tomcat服务器所属的硬盘中 work\\Catalina\\localhost 
		活化:反序列化。启动tomcat,会将之前钝化的文件加载到内存中。
	8)禁用cookie,如何解决找到session的问题:重写url(在路径后面拼接jsessionid)了解
		1)重定向重写url:response.encodeRedirectURL(url);
		2)超链接重写url:response.encodeURL(url);

MVC设计模式(掌握)

  • 掌握MVC设计模式的思想

MVC设计模式是一种思想,不仅仅使用在java中。

1.M:model 模型 ,操作数据

2.V:View 视图 ,显示数据

3.C:Controller 控制器,负责分发和控制

在这里插入图片描述

一、JSP【掌握】

1、jsp简介

1.jsp既可以书写java代码又可以书写html标签页面

2.jsp属于后端的技术,java类实质是一个servlet

【1】问题引入

之前书写的登录案例,如果登录错误我们为了在页面中提示错误信息我们在servlet中编写html标签响应给浏览器,这样会比较麻烦。接下来的jsp技术就可以解决上述问题,不需要在servlet中自己手动编写html标签了,这样使用会很方便。

【2】 JSP发展(了解)

model1时代:jsp刚开始诞生的时候所有的代码都放到jsp中。

例如:操作数据库的jdbc,显示数据等

model2时代:基于mvc设计模式的思想。jsp只是用来作为视图显示数据的,使用servlet负责进行分发或者控制,model模型即业务层、dao层、实体( javabean )

【3】jsp介绍

java server pages java服务器端的页面

jsp属于后台服务器端的技术,本质是一个java类,就是一个servlet,

只是在底层使用类似于如下代码编写的

  response.getWriter().print("<html>");

我们只需要在jsp书写html标签,底层翻译成java代码。

步骤:

1.创建jsp的后缀名是.jsp

2.在web项目下的web目录创建

3.tomcat执行jsp的时候会将.jsp翻译成.java,然后在编译为.class文件,最后运行.class文件

【代码演示】

1.在项目的web目录下创建jsp页面

2.在jsp中书写java代码和html标签

3.运行服务器访问jsp即可

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %><%--
  Created by IntelliJ IDEA.
  User: tiansuo
  Date: 2020-11-22
  Time: 9:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--书写html标签--%>
    <h1>第一个jsp</h1>
    <%--书写java代码--%>
    <%
        //这里编写java代码
        //需求:获取当前系统时间变为字符串格式
        //1.创建当前系统时间
        Date date = new Date();
        //2.创建日期格式化解析类对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //3.使用日期格式化解析类对象调用格式化方法进行格式化
        String time = sdf.format(date);
        //4.输出格式化的字符串的时间
        System.out.println("time = " + time);
        //响应给页面
        response.getWriter().print(time);
    %>
</body>
</html>

2、jsp原理(掌握)

【jsp加载流程图】

在这里插入图片描述

【查找jsp的源码】

在这里插入图片描述

在这里插入图片描述

说明:源文件名:jsp文件名_jsp

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.31
 * Generated at: 2020-11-22 01:55:39 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;
import java.text.SimpleDateFormat;
/*
	1.demo01_jsp 表示类名: jsp文件名_jsp变为类名
	2.demo01_jsp类继承了org.apache.jasper.runtime.HttpJspBase类
*/
public final class demo01_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = new java.util.HashSet<>();
    _jspx_imports_classes.add("java.util.Date");
    _jspx_imports_classes.add("java.text.SimpleDateFormat");
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }
  //业务方法,在这里处理业务逻辑
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      //处理响应的乱码的
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write('\\r');
      out.write('\\n');
      out.write("\\r\\n");
      out.write("\\r\\n");
      out.write("<html>\\r\\n");
      out.write("<head>\\r\\n");
      out.write("    <title>Title</title>\\r\\n");
      out.write("</head>\\r\\n");
      out.write("<body>\\r\\n");
      out.write("    ");
      out.write("\\r\\n");
      out.write("    <h1>第一个jsp</h1>\\r\\n");
      out.write("    ");
      out.write("\\r\\n");
      out.write("    ");
		
        //这里编写java代码
        //需求:获取当前系统时间变为字符串格式
        //1.创建当前系统时间
        Date date = new Date();
        //2.创建日期格式化解析类对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //3.使用日期格式化解析类对象调用格式化方法进行格式化
        String time = sdf.format(date);
        //4.输出格式化的字符串的时间
        System.out.println("time = " + time);
        //响应给页面
        response.getWriter().print(time);
    
      out.write("\\r\\n");
      out.write("</body>\\r\\n");
      out.write("</html>\\r\\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

【jsp是一个servlet】

1)找到jsp源码:

在这里插入图片描述

2)查找 org.apache.jasper.runtime.HttpJspBase

将tomcat下面的lib包下面的jasper.jar进行解压

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210504003010906.png?x-在这里插入图片描述

3)结论:demo01_jsp是HttpServlet的子类 所以jsp是一个servlet

public final class demo01_jsp extends org.apache.jasper.runtime.HttpJspBase{}
public abstract class HttpJspBase extends HttpServlet{}

jsp是一个java类实质上是一个Servlet

jsp类中具有一个业务方法,业务方法体中具有以下常见对象

 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {
     /*
     	常用的对象:
     	1.request
     	2.response
     	3.session
     	4.application就是ServletContext
     */
 }

3、在jsp页面中书写java代码的三种方式(掌握)

1、脚本片段

1.使用脚本片段书写的java代码被放到业务方法体中即_jspService中

2.缺点:书写在脚本片段的java代码不能定义java中的方法,只能调用java中的方法

【1】格式

<%
    //书写java代码
%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %><%--
  Created by IntelliJ IDEA.
  User: tiansuo
  Date: 2020-11-22
  Time: 9:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--书写html标签--%>
    <h1>第一个jsp</h1>
    <%--书写java代码--%>
    <%
        //这里编写java代码
        //需求:获取当前系统时间变为字符串格式
        //1.创建当前系统时间
        Date date = new Date();
        //2.创建日期格式化解析类对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //3.使用日期格式化解析类对象调用格式化方法进行格式化
        String time = sdf.format(date);
        //4.输出格式化的字符串的时间
        System.out.println("time = " + time);
        //响应给页面
        response.getWriter().print(time);
    %>
</body>
</html>

2、脚本声明

本片段虽然可以嵌入java代码,但是如果,我们要给当前的jsp中定义一些成员方法或者成员变量,就需要一个新的技术——脚本声明

通过查看jsp的源代码我们发现,脚本片段的代码都会存在service方法中,而方法中是不可以定义一个方法的。

【1】格式

<%!
	//这里书写java代码,在 脚本声明中书写的java代码会放到jsp类的成员位置 
 %>

【2】代码实现

<%--
        2.脚本声明:java代码放到类的成员位置
    --%>
    <%!
        //定义方法
         public void show(){
            System.out.println("哈哈");
        }

        //定义成员变量
        int num = 10;
    %>

3.脚本表达式

虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果我们要使用java代码向页面输出一些内容,还是需要 使用原来的response对象,比较繁琐,因此,我们需要一个更加简便的方式,可以代替response**向页面输出内容 ** ——这个就是脚本表达式。

脚本表达式的格式:<%= 向浏览器输出的内容 %> 等价于:out.print( 向浏览器输出的内容)

【1】作用:取代之前向页面的输出语句

之前输出页面数据代码:

 response.getWriter().print(数据);

格式:

<%=输出页面的内容%>

注意:脚本表达式等号后面的输出内容只能是数据,脚本表达式相当于print方法

【2】代码实现

 	<%--
        3.脚本表达式:<%=输出页面的内容%>
    --%>
    <%="锁哥"%>
    <%=123%>

翻译之后的:

在这里插入图片描述

内容小结

总结:

​ 1.不要同时使用脚本表达式和response同时往页面输出信息,会出现顺序不一致。

​ 现象:response会出现在最前面。使用一种输出即可。

​ 2.脚本表达式<%= str %> :在页面输出内容,在service方法中起作用;

​ 3.脚本片段<% %> :在service方法中,原样输出的代码片段;属于局部为,放在_jspService方法中

​ 4.脚本声明:<%! String str = "黑马程序员" %> :定义成员变量;

【1】在jsp页面中书写java代码的三种方式

1.脚本片段

<%
	java代码,放到service方法体内部
%>

2.脚本声明

<%!
 	书写的java代码放到类的成员位置   
 
 %>

3.脚本表达式

<%=输出内容%>

【2】脚本表达式使用注意事项

脚本表达式只是用来向页面中输出数据的简化代码:response.getWriter().print(数据);

在这里插入图片描述

结果:

在这里插入图片描述

说明:通过查看源码我们发现使用脚本表达式输出的数据代码是放到前面,但是页面结果却最后输出。原因是和两种输出方式的输出流有关:

1.脚本表达式使用的输出流是:javax.servlet.jsp.JspWriter out = null;  输出流是JspWriter。JspWriter特点是先将数据放到缓冲区中,然后在一起输出。
   
2.response.getWriter().print("岩岩"); 使用的字符输出流是PrintWriter,PrintWriter字符输出流直接输出到浏览器

4、JSP的三大指令(理解)

【概念】

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出效果,

而只是告诉引擎如何处理JSP页面中的其余部分。

指令用来声明JSP页面的一些属性,比如编码方式,文档类型

我们在servlet中也会声明我们使用的编码方式和响应的文档类型的,而JSP就是用指令来声明的。

分类

【1】page指令

<%@ 指令名 属性名="属性值" 属性名="属性值" 属性名="属性值"。。。 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

【2】taglib指令

【3】include指令

page指令【重要】

【1】作用:解决响应乱码 当前页面的语言 导包错误页面等

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
1.contentType="text/html;charset=UTF-8 解决响应乱码翻译之后:
 response.setContentType("text/html;charset=UTF-8");
2.当前页面的语言:language="java"  不写默认是java

【2】导包快捷键: alt+enter

1.使用哪个包下的就导入哪个包下的类或者接口
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
2.一起导入
<%@ page import="java.util.ArrayList,java.text.SimpleDateFormat,java.util.Date" %>
java.util.* 导入java.util包下所有的内容
<%@ page import="java.util.*,java.text.SimpleDateFormat" %>

【3】 错误页面 配置

<%--配置错误页面
    如果当前页面报错直接跳转到error.jsp页面
--%>
<%@ page errorPage="/error.jsp" %>
<%--
  Created by IntelliJ IDEA.
  User: cfl
  Date: 2020-11-22
  Time: 11:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--声明当前页面是一个错误页面,其他页面报错了找到这个页面
    	isErrorPage="true" 表示当前页面是一个错误页面,如果值是true表示可以使用对象exception获取错误信息。默认是false
--%>
<%@page isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>异常了</h1>
    <%--获取报错页面的异常信息--%>
    <%
        String message = exception.getMessage();
        response.getWriter().print(message);
    %>
</body>
</html>

taglib指令

作用:用来导入第三方标签库的,例如下面讲解的JSTL标签库。

【1】格式

<%@ taglib uri="标签库地址" prefix="标签前缀" 。。。 %>

【2】代码实现

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
说明:表示引入外部的jstl标签库的。
prefix="c" 表示前缀
uri="http://java.sun.com/jsp/jstl/core" 表示jstl标签库的地址

include指令

【1】作用:表示在一个jsp页面静态包含某个jsp页面。

【2】格式:

<%@include file="URL" %> 指定要导入页面的地址

在这里插入图片描述

内容小结

1、page 指令:
    1.解决响应乱码和指定语言
    2.导包,使用快捷键:alt+enter
    3.可以设置错误页面<%@ page errorPage="/error.jsp" %>
    4.声明当前页面是一个错误页面:<%@ page isErrorPage="true" %> 然后就可以在当前jsp页面中使用获取错误信息的jsp内置对象:		exception
    
2、taglib 指令
作用:用来导入第三方标签库的,例如下面讲解的JSTL标签库
<%@ taglib uri="标签库地址" prefix="标签前缀" 。。。 %>

3、include 指令
作用:表示在一个jsp页面静态包含某个jsp页面。
静态导入jsp的格式
<%@ include file="引入的jsp地址"%>

5、开发中配置错误信息页面【掌握】

在web.xml中进行配置错误信息页面。

【1】配置错误状态码错误信息

web.xml配置

 	<!--配置错误页面信息-->
    <error-page>
        <!--表示状态码 404 500 405-->
        <error-code>404</error-code>
        <!--表示报错误跳转的页面-->
        <location>/404.jsp</location>
    </error-page>

说明:只要访问的资源不存在报404错误就会访问404.jsp页面。

404.jsp

<%--
  Created by IntelliJ IDEA.
  User: tiansuo
  Date: 2020-11-22
  Time: 11:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--404图片--%>
    <img src="img/404.jpg">
</body>
</html>

【2】配置服务中的常见异常信息

web.xml

 <!--只要web项目报空指针异常就会找null.jsp-->

以上是关于04-JavaWeb开发JSP&EL&JSTL&MVC&Bootstrap前端框架的主要内容,如果未能解决你的问题,请参考以下文章

JSP高级 & MVC & EL & JSTL & 案例

JSP内置对象 & EL内置对象

JavaWeb之JSP&MVC&EL&JSTL

EL&JSTL笔记

EL&JSTL笔记

JSTL&EL(程序员必看之一)