一 JSP
01 基础理论
1、JSP 概念
1. JSP 是什么呢? 三个单词的缩写: Java Server Page, 就是 java 服务端的页面。 2. 如何去理解他? 可以理解成为一个特殊的页面。 在这个页面当中,既可以书写 HTML (CSS和JavaScript) 也可以书写 Java 3. JSP有什么作用呢? 简化代码的书写。 你可以在一个项目当中,全程使用 JSP 完成。
2、快速入门
案例代码 位置 web/page/helloworld.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>HelloWorld Jsp</title>
</head>
<body>
<%--
这是HTML代码的写法
--%>
<h1>hello I am a JSP for HTML</h1>
<%--
下面我们采用 Java 代码的写法
--%>
<%
System.out.println("hello I am a JSP for Java");
out.println("hello I am a Java To Page");
%>
</body>
访问的地址
http://localhost:8080/JavaWebDay18/page/helloworld.jsp
02 JSP的原理
1、找到位置
打开 war包编译后的代码
找到文件夹 work
---> Catalina
--> localhost
--> JavaWebDay18
查看得到的效果
2、原理结论
JSP 底层就是一个 Servlet ---------------------------------- JSP 的父亲是 HttpJspBase JSP 的爷爷是 HttpServlet JSP 的祖宗是 Servlet
底层原理过程图
03 JSP脚本
1、基础说明
四种脚本的写法: 1. 注释: <%-- 这是注释 --%> 2. Java代码: <% String name = "局部变量"; %> 3. Java代码: <%! String name = "成员变量"; %> 4. Java代码: <%= "便捷的打印输出,相当于是 out.println" %>
2、案例演示
注释
位置: web/page/foot1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示脚本1</title>
</head>
<body>
<%-- 这是JSP的注释的代码, HTML页面源代码没有,Java底层也没有 --%>
<!-- 这是HTML的注释代码, HTML页面源代码有的, Java底层代码也有 -->
建议后期采用 JSP的注释写法
</body>
</html>
成员变量和局部变量
位置: web/page/foot2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示脚本2</title>
</head>
<body>
演示成员变量 和 局部变量 (建议采用局部变量)
<%!
String nameChengYuan = "我是成员变量,展示在Java底层的成员位置";
%>
<%
String nameJuBu = "我是局部变量, 展示在Java底层的局部位置 service方法中";
%>
</body>
</html>
输出页面操作
位置 web/page/foot03.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>演示脚本3</title>
</head>
<body>
对于 out.print() 和 response.getWriter().println()
存在先后顺序的问题。
JSP 会先将所有的输出,加载在一起之后,再去按照方法顺序输出。
response.getWriter().println() 一定是在 out.print() 前面
后期的使用方式是:
要么统一使用 response.getWriter().println()
要么统一使用 out.print()
不要混合使用,一般建议采用 out.print() 因为可以简化为 =
<%= "川哥呀,你是如此的帅,相当于是 out.print()" %>
<%
out.print("嘻嘻,我也是out.print()");
%>
<%
response.getWriter().println("我是响应的输出");
%>
</body>
</html>
04 JSP内置对象
1、基础说明
什么是 内置对象呢? 内置对象: 在 JSP 当中,不用创建对象,内部自动存在,就可以直接使用的。 简单一点说: 不需要创建对象, 直接可以在 JSP 页面当中使用的
表格展示九个内置对象
编号 | 内置对象的名称 | 代码的真实类型 | 作用说明 |
---|---|---|---|
1 | pageContext | javax.servlet.jsp.PageContext | 页面域,获取其他八个内置对象, 还可以实现,页面数据的共享 |
2 | session | javax.servlet.http.HttpSession | 会话域,一次会话,多个请求的数据共享 |
3 | application | javax.servlet.ServletContext | 应用域,所有用户之间的数据共享 |
4 | config | javax.servlet.ServletConfig | Servlet 的配置对象 |
5 | out | javax.servlet.jsp.JspWriter | 输出对象,将数据输出到页面上面 |
6 | page | java.lang.Object | 当前页面 Servlet 本质的对象 this |
7 | request | javax.servlet.http.HttpServletRequest | 请求域,一次请求的数据共享 |
8 | response | javax.servlet.http.HttpServletResponse | 响应对象,回复数据给客户端浏览器 |
9 | exception | javax.lang.Throwable | 异常的对象 |
2、案例演示
小技巧,通过 pageContext
对象,获取到其他的八个内置对象。
位置 web/page/innerobject.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>展示JSP的内置对象</title>
</head>
<body>
展示 JSP的九大内置对象
<%
//通过页面域,获取请求域
out.println("<br>获取请求域对象, request = " + pageContext.getRequest());
//通过页面域,获取会话域
out.println("<br>获取会话域对象, session = " + pageContext.getSession());
//通过页面域,获取应用域
out.println("<br>获取应用域对象, application = " + pageContext.getServletContext());
out.print("<br>=====================");
//通过页面域,获取到配置对象
out.println("<br>获取配置对象, config = " + pageContext.getServletConfig());
//通过页面域,获取到页面对象
out.println("<br>获取页面对象, page = " + pageContext.getPage());
//通过页面域,获取到输出对象
out.println("<br>获取输出对象, out = " + pageContext.getOut());
out.print("<br>-------------------");
//通过页面域,获取到响应对象
out.println("<br>获取响应对象, response = " + pageContext.getResponse());
//通过页面域,获取到异常对象
out.println("<br>获取异常对象, exception = " + pageContext.getException());
%>
</body>
</html>
05 JSP四大域对象
1、基础说明
四大域名称 | 四大域范围 |
---|---|
ServletContext | 应用域 application (在整个服务器有效,页面关闭了,下次启动还有效) |
Session | 会话域(在一次会话当中有效,页面关闭了,下次启动,默认失效。如果下次想生效,设置有效期) |
Request | 请求域(在单次请求当中有效,多次请求,则失效) |
PageContext | 页面域(只在当前页面有效,切换页面则无效了) |
说明:
大家重点需要掌握的是 两个域对象。
会话域
Session
和 请求域Resquest
问题:
请求转发采用谁? 请求重定向采用谁?
请求转发,优先考虑 请求域
Request
也可以使用 会话域Session
请求重定向,只能考虑 会话域
Session
备注: 请求转发是一次请求,请求重定向是多次请求
2、常用的方法
1. 存值 可以 修改值 void setAttribute(String,Object) 2. 取值 Object getAttribute(String) 3. 删除值 void removeAttribute(String)
06 JSP三个指令
1、基础说明
1. 指令有什么作用? 指令是用来完成页面配置,导入资源文件的。 2. 指令如何使用? <%@ 指令的名称 属性名称1=属性值1 属性名称2=属性值2 属性名称3=属性值3 %> 3. 常见的指令有哪些? page 指令 include 指令 taglib 指令
2、page指令
表格说明
属性 | 作用 |
---|---|
contentType | 响应类型支持的类型和设置的编码格式 |
language | 使用的语言,默认是 java |
errorpage | 当页面出现了错误异常之后,可以跳转到指定的错误页面 |
isErrorPage | 是否抓取异常,如果为true 页面当中,就可以使用 exception 对象,默认是 false |
import | 可以进行导包的操作。 import java.util.Random |
session | 是否帮我们创建 HttpSession 的对象,默认情况下是 true |
pageEncoding | 翻译 jsp 的时候,采用的编码格式 |
buffer | 设置 JspWriter 输出到 jsp 页面,缓存区域的大小,默认值是 8KB |
isELgnored | 设置是否忽略 EL表达式 默认情况下是 false 表示不忽略 |
案例代码
位置 web/page/orderpage01.jsp
<%--
访问地址:
http://localhost:8080/JavaWebDay18/page/orderpage01.jsp
1. contentType 响应类型支持的类型和设置的编码格式
2. errorpage 当页面出现了错误异常之后,可以跳转到指定的错误页面
3. import="java.util.ArrayList" 导包的操作
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page errorPage="error500.jsp" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello 川哥,我要和你生猴子 <br>
<%
List<String> mlist = new ArrayList<>();
mlist.add("迪丽热巴");
mlist.add("古力娜扎");
mlist.add("马尔扎哈");
%>
<%--
页面展示
--%>
<%= mlist.get(8) %>
</body>
</html>
位置 web/page/error500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isErrorPage="true" %>
<html>
<head>
<title>出现错误后,展示的页面</title>
</head>
<body>
<h1> 兄弟,今天程序有点忙... </h1>
<%
//试着抓取到异常。
Exception e = pageContext.getException();
//判断防止为空的情况
if (e == null) {
out.print("<h3 style='color:green'> 没有抓到异常 </h3>");
} else {
out.print("<h3 style='color:red'>" + e.getMessage() + " </h3>");
}
%>
<img src="face.png">
</body>
</html>
3、include指令
说明
include 指令,可以实现 jsp 页面的包含效果,在一个jsp页面当中,包含另外的一个jsp页面
位置 web/page/orderpage02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>常用指令02</title>
</head>
<body>
<h1> hello Every Body 我是2222 </h1>
</body>
</html>
位置 web/page/orderpage03.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="orderpage02.jsp"%>
<html>
<head>
<title>常用指令03</title>
</head>
<body>
<h1> hello Every Body 我是3333 </h1>
在 03页面当中,包括有 02的内容。
</body>
</html>
4、taglib 指令
说明
作用: 可以去引入外部的标签库。 例如: 我们后面学习 jstl 就是外部标签库,不是 JSP 内部定义的标签,而是第三方定义的标签。 相当于是 我们前面学习的 jar 包,是三方的定义,不是自己写的。 语法: <%@ taglib uri="标签库的地址" prefix="前缀名称" %>
案例 位置 web/page/orderpage04.jsp
<%--
访问地址: http://localhost:8080/JavaWebDay18/page/orderpage04.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>常用指令4</title>
</head>
<body>
</body>
</html>
需要在 web/WEB-INF
新建 lib
文件夹导入jar包
javax.servlet.jsp.jstl.jar jstl-impl.jar
二 MVC模型
01 基础理论
1、概念介绍
MVC 是三个英语单词的缩写: [1] M:module 模型, 用于数据的封装操作,封装的是数据的模型,JavaBean 对象 [2] V:view 视图, 用于显示数据, 动态页面 JSP 和 静态页面 HTML [3] C:controller 控制器, 用来处理请求和响应, 例如: Servlet
动态页面 和 静态页面 有什么区别?
动态页面:随着时间的变化,页面当中数据的内容会发生变化,例如: 新闻页面,新闻随时会改变。
静态页面:固定写死的效果,不会发生改变。
2、流程说明
02 登录案例
1、前台页面
位置 web/login/qian.jsp
<%--
http://localhost:8080/JavaWebDay18/login/qian.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录的前台页面</title>
</head>
<body>
<%--
定义 form 表单,做表单的提交操作
--%>
<h1> 采用GET的方式登录 </h1>
<form method="get" action="/JavaWebDay18/login/hou.jsp">
<input type="text" name="username" placeholder="请输入账号">
<input type="text" name="password" placeholder="请输入密码">
<input type="submit" value="GET提交数据到服务器">
</form>
<hr>
<h1> 采用POST的方式登录 </h1>
<form method="post" action="/JavaWebDay18/login/hou.jsp">
<input type="text" name="username" placeholder="请输入账号">
<input type="text" name="password" placeholder="请输入密码">
<input type="submit" value="POST提交数据到服务器">
</form>
</body>
</html>
位置 web/login/hou.jsp
<%--
http://localhost:8080/JavaWebDay18/login/hou.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>后台页面</title>
</head>
<body>
<%--
获取到数据
--%>
<%
//获取到前台页面发送过来的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//获取到请求的方式,看是GET还是POST
String method = request.getMethod();
String message = "请求方式是:"+method;
//判断是否符合要求
if ("zhangsan".equals(username) && "123".equals(password)){
message += ",登录成功,欢迎你:zhangsan";
out.print("<span style='color:green'> "+message+" </span>");
}else{
message += "登录失败";
out.print("<span style='color:red'> "+message+" </span>");
}
%>
</body>
</html>