一、JSP(Java server Pages)
关系
- JSP文件在容器中会转换成Servlet执行。
- JSP是对Servlet的一种高级封装。本质还是Servlet。
区别
- 与 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
创建jsp
在web目录下新建*.jsp文件(与WEB-INF平级)
jsp实现原理
Tomcat会将xxx.jsp转换成Java代码,进而编译成.class文件运行,最终将运行结果通过response响应给客户端。
jsp入门
<%@ page import="java.util.Date" %><%--Created by IntelliJ IDEA.User: ZHUDate: 2022/5/11Time: 9:34To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%-- JSP的注释 --%><%--可以在浏览器上面显示java代码 执行结果 --%><%-- =的意思是页面的显示 --%><%= new Date()%></body></html>
入门basic
<%@ page import="java.util.ArrayList" %><%--Created by IntelliJ IDEA.User: ZHUDate: 2022/5/11Time: 9:48To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>basic</title></head><body><%-- 带= 在浏览器打印--%><%=10/3%><%-- 不带= 在控制台打印--%><%System.out.println("hello!!!");%><%-- 在浏览器上面显示响应 out jsp对象--%><%out.println("奥斯卡=阿拉斯加");%><%-- 任意的java代码都可以书写 打印在控制台--%><%for(int i = 0;i < 5;i++){System.out.println("杨博是奥斯卡");}//java注释ArrayList<String> list = new ArrayList<>();list.add("呼");list.add("叫");list.add("博");list.add("儿");for (String s : list) {System.out.println(s);}%></body></html>
basic2
<%--Created by IntelliJ IDEA.User: ZHUDate: 2022/5/11Time: 10:00To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>basic2</title></head><body><%-- 函数加!--%><%!int a = 10;%><%--在浏览器打印a--%><%=a%><%--定义一个方法 方法加!--%><%!public void play(){System.out.println("玩游戏");}%><%--调用方法play 有返回值的可以打印在浏览器,无返回值的只能打印在控制台--%><%play();%></body></html>
jsp指令
<%— 指定JSP页面的解码格式 pageEncoding=”utf-8”—%>
<%— errorPage=”error.jsp” 如果这个页面有错,会跳转到error.jsp 但是url不变(相当于转发)—%>
<%@ page import="java.util.ArrayList" %><%--Created by IntelliJ IDEA.User: ZHUDate: 2022/5/11Time: 10:34To change this template use File | Settings | File Templates.--%><%-- 指定JSP页面的解码格式 pageEncoding="utf-8"--%><%-- errorPage="error.jsp" 如果这个页面有错,会跳转到error.jsp 但是url不变(相当于转发)--%><%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" errorPage="error.jsp" %><html><head><title>jsp指令</title></head><body><%//需要导包ArrayList<Integer> Integer = new ArrayList<>();%><%-- 让页面报错 转发error.jsp--%><%=2/0%></body></html>
include指令
把head和footer中的内容 放在main.jsp
语法格式:<%@include file=”jsp文件”%>
<%--Created by IntelliJ IDEA.User: ZHUDate: 2022/5/11Time: 10:45To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%-- include 包含--%><%@include file="head.jsp"%><br>这个是主页面<br><%@include file="footer.jsp"%></body></html>
include命令【用这个】
和include指令效果一样,但是这个重名会报错
语法格式:
<body><jsp:include page="head.jsp"></jsp:include>这是主页<jsp:include page="footer.jsp"></jsp:include></body>
动作标签
实例化对象,赋值,取值
<%@ page import="com.qfedu.entity.User" %><%--Created by IntelliJ IDEA.User: ZHUDate: 2022/5/11Time: 10:54To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><%--实例化对象 第一种方法--%><%User user = new User();user.setUser("朱志伟");user.setPassword("123456");//在控制台输出System.out.println(user.getUser());System.out.println(user.getPassword());//在浏览器上显示out.println(user.getUser());out.println(user.getPassword());%><%-- 第二种数理化方法 动作useBean的方法--%><%-- 以下代码相当于 User user1 = new User()--%><%-- class 的值 包名加类名--%><jsp:useBean id="user1" class="com.qfedu.entity.User"></jsp:useBean><%--赋值--%><jsp:setProperty name="user1" property="user" value="博儿"></jsp:setProperty><%--获取值 在浏览器上打印 博儿--%><jsp:getProperty name="user1" property="user"/></body></html>
转发
内置对象
<%-- jsp的八大内置对象 --%><%request.setAttribute("user","呼叫博儿");response.getWriter().append("boer");//不用获取session对象 可以直接用session.setAttribute("user","xixida");//application 相当于ServletContext 上下文对象application.setAttribute("name1","hehe");//out 内置对象 输出在浏览器上out.println("aaaaaaaaa!!!");%>
四大作用域
<body><%-- 四大作用域 就是赋值和取值的效果--%><%pageContext.setAttribute("pageContext","张三");request.setAttribute("request","李四");session.setAttribute("session","王五");application.setAttribute("application","刘六");%><%-- 取值 --%><%=pageContext.getAttribute("pageContext")%><%--在pageContext对象去取request域里面的值 不能取--%><%=pageContext.getAttribute("request")%><%-- 各自的域取各自的值 不可越界--%><%=request.getAttribute("request")%></body>
pageContext获取内置对象,对其赋值
<%--pageContext 可以获取其他八个对象 写法有问题--%><%//八大内置对象可以直接使用,为什么还要用pageContext调用呢?ServletRequest request1 = pageContext.getRequest();ServletResponse response1 = pageContext.getResponse();HttpSession session1 = pageContext.getSession();ServletContext servletContext = pageContext.getServletContext();JspWriter out1 = pageContext.getOut();%><%-- 可以操作域对象进行赋值 --%><%//第三个参数指定域 相当于直接 request.setAttribute("name","boer");pageContext.setAttribute("name","boer",PageContext.REQUEST_SCOPE);request.setAttribute("name1","boer1");pageContext.setAttribute("session","boer",PageContext.SESSION_SCOPE);%><%=request.getAttribute("name")%><%=request.getAttribute("name1")%><%=session.getAttribute("session")%>
el 取值(数据和集合)
Expression Language
<body><%--el专门获取数据 只要在各个域中设置了值,那么就可以el表达式--%><%request.setAttribute("req","xixi");session.setAttribute("session","hehe");session.setAttribute("req","wuhu");%><%--el 的语法格式--%><%-- 直接展示在浏览器上面 --%>${requestScope.req}${req}${sessionScope.session}${session}<%User user = new User();user.setUser("博儿");user.setPassword("123456");request.setAttribute("user",user);%><br>${user}${user.user}${user.password}${requestScope.user.getPassword()}</body>
