介绍
1.JSP=(Java + HTML)是服务端的动态资源,用来显示数据,获取数据。
2.JSP作为请求发起页面,显示表单;作为请求结束页面,显示数据。
3.Servlet作为请求中处理数据的环节
组成部分
JSP = Java源代码 + HTML标签 + JSP指令 + JSP标签
运行原理
JSP看上去是HTML,但是其本质是Servlet 。
*.jsp _— tomcat – > 编译成 – > *.java ----- > .class 最后运行的是.clas
JSP脚本片段
是指嵌套再<% %>中的一条或多条代码
1.<%java代码 %>
2.<%=%>
3.<%!%>声明,可以创建类的成员变量
<body>
<h1 style="color:red;">我的第一个JSP程序</h1>
<!-- JSP脚本片段 可以都多个,可以互相访问,必须符合Java语法-->
<%int x = 1;%>
<%int y = x + 1;%>
<!-- JSP内置对象,无需初始化直接使用 -->
<%out.print(y);%>
<br>
<!-- JSP中可以编写流程控制语句,通过jsp表达式的方式输出具体数字 -->
<%for(int i = 1; i <= 10;++i){%>
<span style="color:red"><%=i%></span>
<%}%>
<!-- 脚本片段if else -->
<% boolean sex = true;%>
<% if(sex){%>
男
<%}else{%>
女
<%}%>
<!-- JSP表达式 -->
<%=y %><br>
<%=new Date() %>
<%!int num = 5; %>
<%@include file="include.jsp" %>
</body>
JSP表达式
- JSP表达式(expression)提供了将一个java变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%= 和 %>之中。
举例:Current time: <%= new java.util.Date() %> - JSP表达式中的变量或表达式的计算结果将被转换成一个字符串,然后被插入进整个JSP页面输出结果的相应位置处。
- JSP表达式中的变量或表达式后面不能有分号(;),JSP表达式被翻译成Servlet程序中的一条out.print(…)语句。
JSP指令
JSP指令的基本语法格式:
<%@ 指令 属性名=“值” %>
注意属性名部分是大小写敏感的。
- page
<%@page import="java.util.Date"%>
- include
<%@include file="include.jsp" %>
- taglib
prefix:指定标签库在页面中的前缀
uri:指标标签库
自动提示以输入<%@ %>为例,点击alt+/,则自动提示
再web.xml中配置错误页面
<!-- 配置错误页面 -->
<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.html</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/error.html</location>
</error-page>
JSP标签
forward
JSP九大内置对象和四大作用域
内置对象 | 作用域 |
---|---|
pageContext | PageContext类的当前页面上下文对象 |
session | HttpSession类的会话对象 |
servletContext | 整个应用程序 |
config(ServletConfig) | 对应ServletConfig |
page | 当前JSP页面的this当前对象 |
request(HttpServletRequest) | 请求对象 |
response(HttpServletResponse) | 响应对象 |
out(JspWriter) | 等同于response.getWriter()用来向客户端发送文本数据 |
Exception(Throwable) | 只有在错误页面中可以使用这个对象 |
pageContext
1.代表一个JSP页面的上下文对象
<body>
<!-- pageContext可以获取其他内置对象 -->
<%
ServletRequest req = pageContext.getRequest();
boolean isReq = (req == request);
%>
<%=isReq %>
</body>
jsp页面上四大域对象
在application、session、request、pageContext对象中都可以调用setAttribute方法和getAttribute方法来设置和检索各自域范围内的属性。
1.pageContext:当前jsp页面的上下文对象
2.Session:整个会话
3.Request:一个请求链
4.ServletContext:application整个应用程序
排序作用范围:ServletContext》Session》Request》pageContext
实例:
<!-- 四大作用域,设置属性及获取属性 -->
<%
pageContext.setAttribute("name","张三");
/* request.setAttribute("name", "李四");
session.setAttribute("name", "王五");
application.setAttribute("name", "赵六"); */
%>
<%=pageContext.getAttribute("name") %>
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>
<!-- 测试作用域范围 -->
<a href="index.jsp">index</a>
<!-- 设置指定范围的属性 -->
<!-- PageContext类中提供了对各个域范围属性进行统一管理的方法 -->
<%
pageContext.setAttribute("sex", "男性", PageContext.SESSION_SCOPE);
// 取session范围内的属性
pageContext.getAttribute("sex", PageContext.SESSION_SCOPE);
%>
<!-- 跳转其他资源 -->
<%
//请求转发
pageContext.forward("/index.jsp");
%>
注意此处定义的request及session属性与从servlet定义的一致。
Base设置路径
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 1.使用动态的方式获取web应用程序的路径
String path = request.getContextPath();
String basePath = request.getScheme()+"://"
+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<!-- 使用base设置路径 -->
<%-- <base href="<%=basePath %>"> --%>
</head>
<body>
<!-- 使用EL表达式pageContext.request.contextPath:获得当前web应用程序的路径 -->
<a href="${pageContext.request.contextPath }/two">TwoServlet</a>
</body>
</html>
EL表达式
下面是ThreeServlet
package com.hpe.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.hpe.po.User;
@WebServlet("/three")
public class ThreeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 数组
String[] array = {"张三","李四","王五"};
request.setAttribute("array", array);
// 请求转发到el.jsp页面
// 集合
List<String> list = new ArrayList<String>();
list.add("罗志祥");
list.add("李小璐");
list.add("李晨");
list.add("辛巴");
request.setAttribute("list", list);
// 创建对象
User user = new User("张给", 30);
request.setAttribute("user", user);
// 创建泛型集合
List<User> users = new ArrayList<>();
users.add(new User("赵云",20));
users.add(new User("关羽",22));
users.add(new User("赵云",24));
users.add(new User("张飞",26));
users.add(new User("马超",24));
users.add(new User("黄忠",25));
users.add(new User("貂蝉",21));
users.add(new User("小乔",20));
request.setAttribute("users", users);
List<User> users1 = new ArrayList<>();
request.setAttribute("users1", users1);
List<User> users2 = null;
request.setAttribute("user2", users2);
// Map集合
Map<String, User> map = new HashMap<>();
map.put("u1", new User("小乔",20));
request.setAttribute("map", map);
request.getRequestDispatcher("/el.jsp").forward(request, response);
}
}
下面是el.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("name", "pageContext");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
<!-- 方式1:out -->
<%out.print(request.getAttribute("name")); %><br>
<!-- 方式2:表达式 -->
<%=request.getAttribute("name") %><br>
<!-- 方式3:EL表达式 -->
<hr>
<!-- 从四个域对象中通过key找到对应value -->
<!-- 寻找顺序:pageContext,request,session,application -->
<!-- 如果找不到键未name的属性,会显示空字符串,不会显示null -->
${name}<br>
<!-- 获得指定域对象中的属性 -->
${sessionScope.name }<br>
${requestScope.name }<br>
<!-- 使用pageContext获取绝对路径 -->
<a href="${pageContext.request.contextPath}/two">TwoServlet</a><br>
<!-- param获取参数值 -->
参数值:${param.id } ${param.age }
<hr>
<!-- 数组 -->
${array[0] }<br>
<!-- 集合 -->
${list[0] }<br>
<!-- 对象,根据get方法获取属性 -->
${user.name } ${user.age }<br>
<!-- 泛型集合 -->
${users[0].name } ${users[5].name }<br>
<!-- Map -->
${map.u1.name }<br>
<hr>
<!-- EL表达式 -->
${1==1 }<br>
${1 eq 1 }<br>
<hr>
<!-- empty -->
${empty "" }<br>
${empty user }<br>
${empty users1 }<br>
${empty users2 }<br>
<!-- 三目运算符 -->
<%request.setAttribute("sex", 0); %>
${sex eq 1?"男" : "女 " }
</body>
</html>
JSTL标签
将上述Servlet,请求转发改向jstl.jsp界面。下面是JSTL标签的基本使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入jstl标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%request.setAttribute("name", "放三"); %>
<!-- EL表达式 -->
${name }<br>
<!-- c:out输出信息到页面 -->
<!-- value:赋值 default:默认值 -->
<c:out value="${name1 }" default="绽放"></c:out><br>
<!-- set标签:设置属性值 也可以指定范围 scope:page,request,session,application -->
<c:set var="a" value="hello" scope="request"></c:set>
<c:set var="a" value="hello1" scope="session"></c:set>
<!-- 取值 也可以从指定域范围中渠道值,如:requestScope.a -->
${requestScope.a }
<!-- c:remove移除属性 -->
<c:remove var="a" scope="session"/>
${requestScope.a }<br>
${sessionScope.a }<br>
<hr>
<!-- if判断 test:表达式 -->
<c:if test="${param.age < 18 }">
<span style="color:red">未成年</span>
</c:if>
<c:if test="${param.age >= 18 and param.age <=35 }">
<span style="color:blue">青年</span>
</c:if>
<!-- cwo相当于if elseif else -->
<c:choose>
<c:when test="${param.age < 18 }">少年</c:when>
<c:when test="${param.age >= 18 && param.age<=45 }">青年</c:when>
<c:otherwise>中老年</c:otherwise>
</c:choose>
<hr>
<!-- c:forEach items:遍历的对象 var:每一次遍历元素 -->
<c:forEach items="${array }" var="a">
${a }
</c:forEach><br>
<c:forEach items="${users }" var="u">
${u.name }
</c:forEach><br>
<c:forEach items="${map }" var="entry">
<!-- entry.key,entry.value -->
${entry.key }:${entry.value.name}
</c:forEach><br>
<!-- 遍历0-9之内的数字 -->
<c:set var="count" value="9"></c:set>
<c:forEach var="i" begin="0" end="${count }" step="2">
${i }
</c:forEach><br>
<!-- status.count:当前元素的编号从1开始;
status.index:当前元素的编号从0开始 -->
<c:forEach items="${users }" var="user" varStatus="status">
${user.name }:${user.age }:${status.count }:${status.index }
</c:forEach>
</body>
</html>