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前端框架的主要内容,如果未能解决你的问题,请参考以下文章