JavaWeb day05 JSPELJSTLMVC
Posted halulu.me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb day05 JSPELJSTLMVC相关的知识,希望对你有一定的参考价值。
目录
JSP
JSP(Java Server Pages):是一种动态网页技术标准。
JSP 部署在服务器上,可以处理客户端发送的请求,并根据请求内容动态的生成 html文档的 Web 网页,然后再响应给客户端。
JSP 是基于 Java 语言的,它的本质就是 Servlet
1、JSP运行原理
jsp生成的java类本质就是一个Servlet
jsp生成的java代码就是HttpServlet的子类
jsp本质就是servlet,所以也可以处理请求与响应输出数据
注意:
jsp文件只有在访问的时候自动生成。
2、JSP注释
3、脚本java代码的3种方式
java脚本代码片段,是一个service方法内部的局部代码,运行逻辑控制代码
java脚本表达式,是一个service方法内部的局部代码,输出数据的代码
java脚本声明,是一个全局方法,在service外部
java脚本代码片段
java脚本表达式
java脚本声明
4、page指令
page:页面指令,用于设置JSP上各种页面的属性
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
1、language=“java” 设置脚本语言使用java,目前jsp只支持java脚本。
2、 import=“java.util.*” 导入 java.util 下所有类,导包(一个 page 指令的 import属性导入所有的包,包之间使用逗号分隔)
<%@page import="java.util.Date,java.text.SimpleDateFormat"%>
3、ContentType=“text/html; charset=utf-8” 或 pageEncoding=“UTF-8” 2个功能一样。相当于
response.setContentType("text/html;charset=utf-8")
;这句话,每个jsp默认解决了输出乱码
isErroePage设置友好页面
代码位置
web.xml
使用 error-page、error-code、location三个标签
<?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">
<!--统一配置所有jsp页面的错误友好信息页面
含义:如果任何位置发生500错误,就跳转到友好页面/error/500.jsp
-->
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
<!--含义:如果发生404,就跳转到友好页面/error/404.jsp-->
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
</web-app>
500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<%--
isErrorPage: 配置当前页面是否接收异常,默认为false不接收异常
使用步骤:将其值修改为true, 代表接收异常信息,这里就可以使用一个对象exception
exception就是接收到的异常对象
--%>
<%--打印异常日志--%>
<%
exception.printStackTrace();
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>服务器忙,请明天再来访问。。。</h2>
<a href="../index.jsp">返回首页</a>
</body>
</html>
注意:
isErrorPage: 配置当前页面是否接收异常,默认为false不接收异常
使用步骤:将其值修改为true, 代表接收异常信息,这里就可以使用一个对象exception
exception就是接收到的异常对象
400.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>您访问的资源走丢了,请访问其他资源。。。</h2>
<a href="../index.jsp">返回首页</a>
</body>
</html>
注意:
404友好页面不能配置isErrorPage 。因为404不是开发人员需要解决的异常
5、include指令(静态包含)
作用:
在一个 JSP 页面中静态包含另一个 JSP
静态包含:
用户访问A.jsp页面的时候,服务器会将A.JSP页面与B.jsp页面内容合并,最后翻译生成1个java文件,是A.java
静态包含特点:
A页面包含B页面,在A页面里面可以共享B页面的成员变量
注意:
如果xx.jsp文件都有定义变量,那么不能多次include同一个xx.jsp文件,会包变量重复定义的错误。
如果没有定义变量,就可以多次include同一个xx.jsp文件
6、JSP动态标签
1、include动态包含标签
静态包含:
是将2个页面内容合并在一起后翻译成一个java,再编译运行;2个页面共享变量
动态包含:
是将2个页面分别翻译成2个java文件,再编译运行的结果合并在一起,由于是2个java文件,所以不共享变量
注意:
静态包含速度比动态包含速度快
2、forward转发跳转标签
JSP底层是Servlet,forward的底层是request请求转发跳转
页面路径没有变化
3、Param传递参数标签
one.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--目标:转发跳转使用param标签传递参数,注意:jsp的动作标签的复合标签形式中间不能有jsp注释,否则发生异常--%>
<jsp:forward page="two.jsp">
<jsp:param name="username" value="admin"/>
<jsp:param name="password" value="123456"/>
</jsp:forward>
two.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<p>username=<%=request.getParameter("username") %></p>
<p>password=<%=request.getParameter("password") %></p>
注意:
配合forward使用,底层是请求域传递参数
7、JSP九大内置对象
8、JSP四大内置域对象
1、pageContext,页面域,在一个页面内(一个资源内)有效,一个servlet内,不能实现资源之间传递数据(最小的域)
2、 request,请求域,一次请求内有效,适合转发传递数据
3、session,会话域,一次会话内有效,应用场景存储验证码和用户登录数据
4、servletContext(application别名),上下文域,整个应用程序有效,存储的数据所有用户共享,应用场景统计某个资源访问量等等
pageContext
PageContext作用:
1.是一个页面域对象, 只能在当前页面内使用
2.自动查找域数据。可以依次查找pageContext、request、session、application4个对象的数据,查到为止。
3.可以获取其他8个内置对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
PageContext作用:
1.是一个页面域对象, 只能在当前页面内使用
2.自动查找域数据。可以依次查找pageContext、request、session、application4个对象的数据,查到为止。
3.可以获取其他8个内置对象
示例:使用不同的域对象存储一个key为one, 不同的域存储的值value不一样,使用pageContext查找域中的数据
--%>
<h2>页面域对象</h2>
<%
pageContext.setAttribute("one","pageContext");//页面域
request.setAttribute("one","request"); //请求域
session.setAttribute("one","session");//会话域
application.setAttribute("one","application");//上下文域
%>
<p>获取pageContext域中的数据:<%=pageContext.getAttribute("one") %></p><%--结果:pageContext--%>
<p>获取request域中的数据:<%=request.getAttribute("one") %></p><%--结果:request--%>
<p>获取session域中的数据:<%=session.getAttribute("one") %></p><%--结果:session--%>
<p>获取application域中的数据:<%=application.getAttribute("one") %></p><%--结果:application--%>
<h2>自动查找域数据</h2>
<p>使用pageContext的findAttribute查找域中的数据:<%=pageContext.findAttribute("one") %></p>
<%--结果:pageContext
原因:findAttribute方法功能是从pageContext、request、session、application域对象依次查找数据,找到就停止,没有找到返回null
--%>
<h2>获取其他内置对象</h2>
<%--
pageContext对象可以获取所有其他内置对象,eg:
pageContext.getSession();
pageContext.getRequest();
pageContext.getServletContext();
pageContext.getServletConfig();
pageContext.getOut() ....
--%>
<%
pageContext.getOut().print("hello"); //获取其他内置对象的意义:就是为了el可以根据pageContext获取其他内置对象进行操作
%>
</body>
</html>
EL
Expression Language(表达式语言),使用el代替页面上的脚本表达式,简化输出
el作用
1、从域(jsp四大域)里面获取数据进行输出
2、可以进行运算符表达式计算,将结果输出
3、以后servlet从数据库获取的数据放到域对象中,跳转到jsp,jsp使用el技术从域里面获取数据显示
注意:
通过el获取数据,必须得把数据写进域里面。
JSP四大内置域.setAttribute();
1、EL获取指定域对象数据
2、EL获取域中不同类型数据
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.itheima.entity.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
目标:使用el从域中获取不同类型的数据
--%>
<h2>el获取域中JavaBean类型数据</h2>
<%
//1.创建对象
User user = new User("播仔","15");
//2.写入域
pageContext.setAttribute("user",user);
//3.使用el读取域中数据输出
//el读取JavaBean属性数据的格式:${域的key.javaBean对象的属性字段名}
//获取数据原理,是调用javaBean对象的属性名的get封装方法获取数据
%>
<%--<p>user对象name属性值:${user.getName()}</p> 这是正确的--%>
<p>user对象name属性值:${user.name}</p> <%--优化的--%>
<p>user对象age属性值:${user.age}</p>
<h2>el获取域中Map类型数据</h2>
<%
//1.创建对象
Map<String,User> map = new HashMap<>();
map.put("bozai",new User("播仔","15"));
map.put("boniu",new User("播妞","13"));
//2.写入域
pageContext.setAttribute("userMap",map);
//3.使用el读取域中数据输出
//el读取Map数据的格式:${域的key.map的key} 获取map的key对应的值
%>
<p>map对象key为bozai的user对象name属性值:${userMap.bozai.name}</p>
<p>map对象key为bozai的user对象age属性值:${userMap.bozai.age}</p>
<p>map对象key为boniu的user对象name属性值:${userMap.boniu.name}</p>
<p>map对象key为boniu的user对象age属性值:${userMap.boniu.age}</p>
<h2>el获取域中List类型数据</h2>
<%
//1.创建对象
List<User> userList = new ArrayList<>();
userList.add(new User("播仔","15"));
userList.add(new User("播妞","13"));
//2.写入域
pageContext.setAttribute("userList",userList);
//3.使用el读取域中数据输出
//el读取List数据的格式:${域的key[索引]} 获取集合指定索引位置的元素对象,索引从0开始
%>
<p>List对象第一个元素的user对象name属性值:${userList[0].name}</p>
<p>List对象第一个元素的user对象age属性值:${userList[0].age}</p>
<p>List对象第二个元素的user对象name属性值:${userList[1].name}</p>
<p>List对象第二个元素的user对象age属性值:${userList[1].age}</p>
<h2>el获取域中数组类型数据</h2>
<%
//1.创建对象
User[] users = {new User("播仔","15"),new User("播妞","13")};
//2.写入域
pageContext.setAttribute("users",users);
//3.使用el读取域中数据输出
//el读取数组数据的格式:${域的key[索引]} 获取数组指定索引位置的元素对象,索引从0开始
%>
<p>数组对象第一个元素的user对象name属性值:${users[0].name}</p>
<p>数组对象第一个元素的user对象age属性值:${users[0].age}</p>
<p>数组对象第二个元素的user对象name属性值:${users[1].name}</p>
<p>数组对象第二个元素的user对象age属性值:${users[1].age}</p>
</body>
</html>
3、EL中使用运算符表达式
注意:
${5/2} —》 2.5
除法是除得尽的,如果除不尽会保留16位小数。
1+2+3+a=${1+2+3+a+1} —》 7
在域中获取不到数据不会参与运算
判空表达式
作用:
1.判断表达式是否null, null返回true, 否则返回false
2.判断表达式是否为空字符串, 空字符串返回true, 否则返回false
3.判断表达式是集合是否有元素, 集合对象不为空,但是里面没有元素返回true, 否则返回false
格式:
<h2>判空表达式</h2>
<%--
格式:${empty 表达式}
作用:
1.判断表达式是否null, null返回true, 否则返回false
2.判断表达式是否为空字符串, 空字符串返回true, 否则返回false
3.判断表达式是集合是否有元素, 集合对象不为空,但是里面没有元素返回true, 否则返回false
--%>
<p>空字符串:${empty ""}</p><%--输出:true--%>
<p>空对象:${empty null}</p><%--输出:true--%>
<%
List<String> list =new ArrayList<>();
request.setAttribute("list",list);
%>
<p>空集合:${empty list}</p><%--输出:true--%>
<%
list.add("abc");
request.setAttribute("list",list);
%>
<p>有元素集合:${empty list}</p><%--输出:false--%>
注意:
el获取数据需要写进JSP四大域中。
4、EL隐式对象
pageContext的使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
目标:el隐式对象pageContext
el隐式对象pageContext 作用: 用于获取里面get封装方法的属性数据
--%>
<h2>获取项目路径【重要】</h2>
<p>脚本表达式方式:<%=request.getContextPath() %></p>
<p>el表达式方式:${pageContext.request.contextPath}</p> <%--jsp的pageContext.getRequest().getContextPath()--%>
<h2>获取请求资源路径</h2>
<p>脚本表达式方式:<%=request.getRequestURI() %></p>
<p>el表达式方式:${pageContext.request.requestURI}</p>
<h2>当前会话id</h2>
<p>脚本表达式方式:<%=session.getId() %></p>
<p>el表达式方式:${pageContext.session.id }</p>
</body>
</body>
</html>
cookie的使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//目标:创建cookie写入到浏览器,使用el读取cookie的数据
//1.创建cookie写入浏览器
Cookie cookie = new Cookie("username","admin");
response.addCookie(cookie);
out.print("cookie写入成功");
%>
<%--2.使用el读取cookie的数据
格式:${cookie.cookie的name.value} 获取cookie的name对应的value
注意:第一次访问获取不到,需要第二次访问才可以获取到
--%>
<p>cookie的name对应的value:${cookie.username.value}</p><%--输出:admin--%>
</body>
</html>
param 和 paramValues 使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--目标:使用el读取请求参数数据
比如:url?name=admin&hobby=game&hobby=爱编程
--%>
<p>读取参数名name的数据:${param.name}</p> <%--admin--%>
<p>读取参数名hobby的第一个爱好数据:${paramValues.hobby[0]}</p><%--game--%>
<p>读取参数名hobby的第二个爱好数据:${paramValues.hobby[1]}</p><%--爱编程--%>
</body>
</html>
header的使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
header对象: el的隐式对象用于获取请求头数据
--%>
<p>请求:${header.host}</p>
<p>请求:${header.user-agent}</p><%--这个写法是错误的,因为key里面不能有特殊字符--%>
<p>请求:${header["user-agent"]}</p><%--使用[""]解决含有特殊字符的key--%>
</body>
</html>
注意:
1、有特殊字符需要使用【“ ”】
JSTL
JSTL(Java Server Pages Standarded Tag Library):JSP 标准标签库。
主要提供给开发人员一个标准通用的标签库。
开发人员可以利用这些标签取代 JSP 页面上的 Java 代码,从而提高程序的可读性,降低程序的维护难度。
jsp页面导入核心标准标签库
<%--
使用taglib指令导入jstl核心标签库
prefix="c" 设置使用jstl核心标签里面标签的前缀
uri="http://java.sun.com/jsp/jstl/core" 指向核心标签库的地址
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
1、JSTL常用标签----if标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>if标签的使用[重要]</h2>
<%--
格式:<c:if test="${条件表达式}">
//符合条件运行的代码
</c:if>
作用:用于条件判断,与java的if功能一样,没有else-if
需求:判断会话域里面是否有登录数据,有显示的欢迎xx登录成功,否则显示请登录
--%>
<%
session.setAttribute("loginUser","admin");
%>
<p>欢迎xxxx,登录成功</p>
<p>请登录...</p>
以上是关于JavaWeb day05 JSPELJSTLMVC的主要内容,如果未能解决你的问题,请参考以下文章
崔希凡JavaWeb笔记day25-day27(11月11日22:02:34)