02.jsp介绍与体验【应用】
问题
out.write("<div>欢迎"+loginUser.getUsername()+"用户,<a href='LoginOutServlet'>注销</a></div>");
上面的代码写java有智能提示,但是html代码完全没有,有没有解决方案呢?
答:jsp就可以解决
目标
理解jsp的介绍
jsp介绍
jsp全称Java server Pages , java的服务页面. 既可以写java代码又可以写html等前端代码,都有智能提示,开发效率高。
jsp开发处体验
需求
页面上打印服务器系统时间
效果
代码
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>系统服务器时间:
<!--java代码-->
<%
//获取系统时间
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
//使用jsp的字符输出流输出时间
out.write(time);
%>
</h2>
</body>
</html>
访问地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/01_demo.jsp
小结
-
jsp开发特点?
写前端代码和后端代码都可以智能提示
03.jsp运行原理【理解】
目标
掌握jsp运行原理
疑问1:jsp为什么可以写java代码又可以写html代码,不是只有.java文件才可以写java代码吗?
答:服务器会将jsp文件翻译生成.java文件并编译成.class文件
[外链图片转存失败(img-de3mfuYi-1566373791734)(assets/1566264888610.png)]
疑问2:访问jsp可以直接返回动态资源数据,说明jsp可以处理请求与响应,这是为什么?
答:jsp生成的java代码就是HttpServlet的子类
jsp本质就是servlet
运行原理
小结
-
jsp什么时候翻译生成java文件?
默认第一次访问的时候
-
服务器会每次都翻译jsp生成java文件吗?
不会,只有jsp文件被修改了才会在访问的时候将其翻译生成java文件
-
jsp运行原理?
jsp--》翻译成java文件--》编译class文件 走servlet的生命周期
04.jsp基本语法1-注释【应用】
目标
掌握jsp注释的使用
注释语法
注释类型 | 格式 |
---|---|
html注释 | |
jsp注释 | <%-- 注释内容 --%> |
Html注释特点
1.网页查看源代码,注释内容可以看到
2.html注释只能注释html代码
JSP注释特点【在jsp页面推荐使用jsp注释】
1.网页查看源代码,注释内容看不到,这个更加安全
2.jsp注释可以注释所有代码(前端+后端)
实现代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>html注释</h2>
<!--html注释内容 不能注释java代码:<% out.write("hello"); %>-->
<h2>jsp注释</h2>
<%--使用快捷键Ctrl+Shift+/自动生成jsp注释, 可以注释java代码:<% out.write("hello"); %>--%>
</body>
</html>
运行效果,查看网页源代码
view-source:http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/02_demo.jsp
网页效果
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/02_demo.jsp
小结
jsp注释格式
<%--注释内容--%>
05.jsp基本语法2-写java代码的3种方式【应用】
目标
掌握在jsp上编写java代码的多种方式
脚本代码3种方式
java脚本代码片段
java脚本表达式
java脚本声明
脚本语法
java脚本代码片段
代码片段生成的位置:翻译成java文件在service处理请求方法内部
java脚本表达式
代码片段生成的位置:翻译成java文件在service处理请求方法内部
jsp脚本声明
代码片段生成的位置:翻译成java文件在service处理请求方法外部
讲解
代码位置
实现代码
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>代码片段</h2>
<%
int number = 100;
out.print(number);//输出字符串使用write方法,其他类型输出用print方法
%>
<%--目标:定义一个List集合存储用户列表数据,使用table表格布局显示数据--%>
<%
//定义用户列表List集合
List<String> userList = new ArrayList<>();
//存储数据
userList.add("小黑");
userList.add("隔壁老王");
userList.add("传智");
%>
<%--使用表格布局userList数据显示
border-collapse: collapse; 将表格的边框线与单元格的边框线合成一条
--%>
<table border="1" width="50%" align="center" style="border-collapse: collapse;">
<tr>
<th>序号</th>
<th>用户名称</th>
</tr>
<%--使用循环遍历userList集合显示数据--%>
<%
for (int i = 0; i < userList.size(); i++) {
%>
<tr>
<td><% out.print(i+1); %></td>
<td><% out.write(userList.get(i)); %></td>
</tr>
<%
}
%>
</table>
<h2>表达式</h2>
<%
int number2 = 100;
%>
<%=number2 %>
<%--目标:定义一个List集合存储用户列表数据,使用table表格布局显示数据--%>
<table border="1" width="50%" align="center" style="border-collapse: collapse;">
<tr>
<th>序号</th>
<th>用户名称</th>
</tr>
<%--使用循环遍历userList集合显示数据--%>
<%
for (int i = 0; i < userList.size(); i++) {
%>
<tr>
<td><%=i+1 %></td>
<td><%=userList.get(i) %></td>
</tr>
<%
}
%>
</table>
<h2>声明</h2>
<%--目标:声明一个求和的全局方法--%>
<%!
//求和方法
private int sum(int a,int b){
return a+b;
}
%>
<%--使用表达式调用方法输出返回值--%>
<p>1+3=<%=sum(1,3)%></p>
</body>
</html>
脚本声明在servlet里面生成的源码
运行效果
方法地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/03_demo.jsp
运行效果
小结
06.jsp基本语法3-三大指令之page【应用】
目标
掌握jsp的page指令
三大指令
page:页面指令
taglib:标签库指令
include:包含另一个页面指令
指令格式
page指令作用
page 是 jsp 中必须使用的一个指令,用于设置 JSP 上各种页面的属性,告诉 tomcat 如何将一个
JSP 翻译成 Servlet
page指令位置
可以放在 JSP 中任何位置,一般建议放在页面的最顶部
page指令语法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
page指令属性1—导包的属性
language=“java” 当前页面使用的语言,不写默认是 java
import=“java.util.*” 导入 java.util 下所有类,导包
- 方式一:每个 page 指令导入一个类
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
- 方式二:一个 page 指令的 import 属性导入所有的包,包之间使用逗号分隔
<%@page import="java.util.Date,java.text.SimpleDateFormat"%>
page指令属性2—与编码相关的属性
contentType=“text/html; charset=utf-8” 或 pageEncoding=“UTF-8” 2个功能一样
相当于 response.setContentType(“text/html; charset=utf-8”);这句话,,每个jsp默认解决了输出乱码
page指令属性3—与错误相关的属性,友好页面设置
errorPage=“错误页面的 URL”
用于指定如果当前页面出错,转发到哪个页面去
<%@ page language="java" pageEncoding="utf-8" errorPage="error.jsp"%>
isErrorPage=“false”
当前这个页面是否是一个错误页面,如果为true是错误页面,这个页面可以多使用一个exception对象。可以打印错误消息到控制台让开发人员解决
<%@ page pageEncoding="UTF-8" isErrorPage="true"%>
错误信息的跳转方式1—errorPage=“error.jsp”
如果页面出错,转发到 error.jsp 这个页面
案例需求
创建一个info.jsp页面编写模拟异常代码,浏览器访问自动跳转到error.jsp页面显示友好信息,
error.jsp页面控制台打印异常信息让开发人员解决
实现代码
info.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<%--errorPage="error.jsp": 当前页面发生错误自动会转发跳转到error.jsp友好错误页面--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--模拟异常代码--%>
<%
int a=1/0;
%>
</body>
</html>
error.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<%--isErrorPage="true":含义是可以使用exception对象打印异常消息到控制台或日志文件,
目的是让开发人员发现错误,从而解决错误--%>
<%
exception.printStackTrace();//打印到控制台
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>您好,服务器正在忙,请明天再来。。。</h2>
</body>
</html>
访问地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/04_error/info.jsp
运行效果
错误信息的跳转方式2—配置文件 web.xml指定错误码【推荐方式】
**优势:**xml统一配置,代替每个jsp页面page指令设置errorPage
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- xml统一配置指定错误页面 -->
<error-page>
<!-- 指定错误码 -->
<error-code>404</error-code>
<!-- 出错以后跳转到哪个页面 -->
<location>/error/404.jsp</location>
</error-page>
<!-- 指定错误页面 -->
<error-page>
<!-- 指定错误码 -->
<error-code>500</error-code>
<!-- 出错以后跳转到哪个页面 -->
<location>/error/500.jsp</location>
</error-page>
</web-app>
案例需求【重点】
配置网站统一的错误页面,在xml中配置
代码结构
404.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>您访问的资源走丢了,可以返回首页继续浏览</h2>
<a href="http://www.itcast.cn">首页</a>
</body>
</html>
500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>您好,服务器正在忙,请明天再来。。。</h2>
<a href="http://www.itcast.cn">首页</a>
<%
exception.printStackTrace(); //目的错误让开发人员解决
%>
</body>
</html>
访问运行
错误信息的跳转方式3—指定错误的类型配置 web.xml
<!-- 指定错误的类型 -->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/none.jsp</location>
</error-page>
不推荐使用,以为你不可能针对所有系统异常配置,非常麻烦
page指令小结
07.jsp基本语法4-三大指令之taglib和include【应用】
目标
掌握jsp三大指令之taglib和include
三大指令2—taglib
作用
用于导入标签库,在页面上使用
格式
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
三大指令2—include
作用
在一个 JSP 页面中静态包含另一个 JSP
语法
[外链图片转存失败(img-G6OcONus-1566373791747)(assets/1566229642921.png)]
案例需求
创建A.jsp静态页面包含B.jsp页面
实现代码
A.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h2>我是A页面</h2>
<%--静态包含B.jsp页面--%>
<%@include file="B.jsp"%>
B.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h2>我是B页面</h2>
运行效果
访问地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/05_include/A.jsp
效果
案例需求
一个 index.jsp 和 login.jsp 包含另一个 head.jsp,参考原型
素材
index.jsp单独页面效果
index.jsp包含header.jsp页面效果
实现代码
index.jsp代码与login.jsp页面都加入如下代码
访问地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/06_demo/index.jsp
08.jsp基本语法5-jsp的动作标签【应用】
目标
掌握jsp动作标签:include,forward,param
动作标签有3个
动作标签1—include
作用
用于一个 JSP 页面动态包含另一个 JSP 页面
语法
include动作与include指令区别
案例需求
创建A.jsp页面包含B.jsp页面
实现代码
A.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h2>我是A页面</h2>
<%--动态包含B.jsp页面--%>
<jsp:include page="B.jsp"></jsp:include>
<%
int a=0; //动态包含,可以定义与包含页面同名变量
%>
B.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h2>我是B页面</h2>
<%
int a = 0;
%>
运行效果
访问地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/07_demo/A.jsp
效果
动作标签2—forward
介绍
用于页面的转发,与request.getRequestDispatcher("/URL").foward(request,response);
语法
案例需求
创建one.jsp和two.jsp,实现访问当前one.jsp使用forward动作标签转发跳转另一个页面
实现代码
代码位置
one.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--转发跳转到two.jsp页面--%>
<jsp:forward page="two.jsp"></jsp:forward>
two.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h2>我是two.jsp页面</h2>
运行效果
访问地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/08_demo/one.jsp
效果
动作标签3—param
介绍
用于页面的转发跳转的时候传递参数数据,经常与
<jsp:forward>
配合使用
语法
<jsp:param name="参数名" value="参数值"/>
案例需求
创建one.jsp和two.jsp,实现访问当前one.jsp使用forward动作标签转发跳转另一个页面并传递参数数据
实现代码
代码位置
one.jsp跳转
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--转发跳转到two.jsp页面--%>
<jsp:forward page="two.jsp">
<jsp:param name="name" value="admin"/>
<jsp:param name="password" value="123456"/>
</jsp:forward>
two.jsp获取数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h2>我是two.jsp页面</h2>
<%--接收传递过来的2个参数--%>
<p>name=<%=request.getParameter("name")%></p>
<p>password=<%=request.getParameter("password")%></p>
运行效果
访问地址
http://localhost:8080/day28_jsp_el_jstl_war_exploded/jsp/09_demo/one.jsp
效果