jsp
JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者 。 全称JavaServer Pages 是一种动态网页技术标准 。
maven导入jar包
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard.jar -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
1.指令标签
1.1、include
语法
<%@include file="相对路径"%>
实例
include.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2021/4/1
Time: 8:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<H1>静态包含</H1>
<%-- 也可以为html--%>
<%@include file="Head.jsp"%>
<P>--------------------------</P>
<P>Hello world</P>
</body>
</html>
Head.jsp
<%--<%@include file="相对路径"%>--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2 style="font-family: Arial;color: red;font-size:25px;text-align: center ">red world</h2>
</body>
</html>
1.2Page
[language="java"]
声明脚本语言的种类,默认情况下为 java。
[extends="package.class"]
指定 JSP 页面所生成的 servlet 的超类(superclass )。这个属性一般为开发人员或提供商保留,由他们对页面的运作方式做出根本性的改变(如添加个性化特性)。一般人应该避免使用这个属性,除非引用由服务器提供商专为这种目的提供的类。
[import="{package.clas|package.*},..."]
使用 page 指令的 import 属性指定 JSP 页面转换成的 servlet 应该输入的包。在 JSP 中,包是绝对必需的。原因是,如果没有使用包,系统则认为所引用的类与当前类在同一个包中。默认情况下,servlet 导入一些服务器特有的包,例如:java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.* 在编译时已导入了,不需要再指明。使用示例:<%@ page import="package.class" %><%@ page import="package.class1, ..., package.classN" %><%@ page import="java.uti1., cn.foololdfat." %>
[contenType="TYPE;charset=CHARSET"]
contentType 属性设置 Content-Type 响应报头,标明即将发送到客户程序的文档的 MIME 类型。默认 MIME 类型是 text/html,默认字符集为 ISO-8859-1。简单示例:改变内容类型:<%@ page contentType="text/html" %>;改变字符集:<%@ page pageEncoding="GBK" %>;改变内容类型和字符集:<%@ page contentType="text/html; charset=utf-8" %>
[session="True|False"]
控制页面是否参与 HTTP 会话。默认值为 true,若存在已有会话,则预定义变量 session (类型为HttpSession)应该绑定到现有的会话;否则,创建新的会话并将其绑定到 session。false 值表示不自动创建会话,在 JSP 页面转换成 servlet 时,对变量 session 的访问会导致错误。注意,session="false" 并不禁用会话跟踪,它只是阻止 JSP 页面为那些尚不拥有会话的用户创建新的会话。由于会话是针对用户,不是针对贞面,所以,关闭某个页面的会话跟踪没有任何益处,除非有可能在同一客户会话中访问到的相关页面都关闭会话跟踪。
[buffer="none|8kb|sizekb"]
buffer 的大小被 out 对象用于缓存处理执行后的 JSP 对客户端浏览器的输出。none 是指没有任何缓存,直接输出到客户端浏览器。用户可通过指定 buffer 的大小来指定缓存处理的大小,默认值为 8kb。
[autoFlush="True|False"]
控制当缓冲区充满之后,是应该自动清空输出缓冲区(默认true),还是在缓冲区溢出后抛出一个异常(autoFlush="false")。在 buffer="none" 时,false 值是不合法的。
[isThreadSafe="True|False"]
设置 JSP 文件是否多线程使用。若为 True,那么一个 JSP 能同事处理多个用户的请求,默认值为 True。
[info="text"]
定义一个可以在 servlet 中通过 getServletInfo 方法获取的字符串。在 JSP 被执行时,用来描述当前 JSP 文件的相关信息。
[isErrorPage="True|False"]
是否使用 exception 对象。
1.3自定义错误页面
404.jsp和500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这是404页面</h1>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这是500页面</h1>
</body>
</html>
在web.xml加入
<!--//定义错误页面-->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
2.基础语法
2.1.out
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("hello world");
%>
<hr/>
<%
//write输出字符串,下面的没有结果
out.write(12);
int a =123;
%>
<h1><%=a%></h1>
</body>
</html>
2.2.request
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
// getContextPath() 得到工程名
// getServletPath() 得到当前页面所在目录下全名称
// getRequestURL() 得到IE地址栏地址
// getServletPath() 得到相对地址
String contextPath = request.getContextPath();
String servletPath = request.getServletPath();
String requestURI = request.getRequestURI();
String servletPath1 = request.getServletPath();
out.println("工程名"+contextPath);
out.println("当前页面所在目录下全名称"+servletPath);
out.println("IE地址栏地址"+requestURI);
out.println("相对地址"+servletPath1);
%>
</body>
</html>
2.3.response
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
// sendRedirect重定向
// RequestDispatcher.forward跳转request
// setHeader定时跳转
response.sendRedirect("500.jsp");
request.getRequestDispatcher("500.jsp").forward(request, response);
response.setHeader("refresh", "5;URL=500.jsp");
// 设置服务器端的编码
// response.setCharacterEncoding(‘utf-8”);
// 通知浏览器服务器发送的数据格式
// response.setContentType(‘text/html;charset=utf-8”);
// sp页面通知浏览器展示的编码格式
// < meta http - equiv = "Content-Type"content = "text/html; charset=utf-8" />;
%>
</body>
</html>
2.4.application
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2021/4/6
Time: 23:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@ page import="java.util.*" contentType="text/html;charset=UTF-8"%>
<%! int numbers = 1;%>
<%! public synchronized void SumPeople(){
numbers=numbers+1;
}%>
<%
if(session.isNew()){
SumPeople();
session.setAttribute("count",String.valueOf(numbers));
}
application.setAttribute(session.getId(),Integer.toString(numbers));
Enumeration e = application.getAttributeNames();
while(e.hasMoreElements()){
out.println(e.nextElement().toString()+"<br>");
}
%>
<html>
你的sessionID为<%=session.getId()%>
你是第<%=(String)session.getAttribute("count")%>个访问本站的人。
</html>
</body>
</html>
3.JSP标签、JSTL标签、EL表达式
<!-- standard.jar -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
EL表达式:
- 获取数据
- 执行运算
- 获取web开发的常用对象
3.1JSP标签
jsptag1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LOGIN</title>
</head>
<body>
<%-- ${pageContext.request.contextPath }代表web应用的根 --%>
<form action="jsptag2.jsp" method="POST">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login in this</title>
</head>
<body>
name=<%=request.getParameter("name")%>><br>
age=<%=request.getParameter("age")%><br>
</body>
</html>
3.2JSTL标签
是为了弥补html的不足而设计的标签,提供了许多标签供我们使用,功能和java代码一样
3.21.核心标签
引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
---|---|
<<c:out>> | 用于在JSP中显示数据,就像<%= ... > |
<<c:set>> | 用于保存数据 |
<<c:remove>> | 用于删除数据 |
<<c:catch>> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<<c:if>> | 与我们在一般程序中用的if一样 |
<<c:choose>> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<<c:when>> | <c:choose>的子标签,用来判断条件是否成立 |
<<c:otherwise>> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<<c:forEach>> | 基础迭代标签,接受多种集合类型 |
<<c:forTokens>> | 根据指定的分隔符来分隔内容并迭代输出 |
<<c:param>> | 用来给包含或重定向的页面传递参数 |
<<c:redirect>> | 重定向至一个新的URL. |
<<c:url>> | 使用可选的查询参数来创造一个URL |
3.22.JSTL标签库使用步骤
- 引入jar包
- 使用其方法
- 使用tomcat9
3.23.EL不能使用显示${xxx}
第一种:
需要在jsp之前引用
阻止忽略el表达式,el表达式立即生效
<%@ page isELIgnored="false" %>
servlet是2.3的版本,2.4及以后更新的版本中是不存在这个问题的,因为新版本中的isELIgnored是默认false,而老版本中默认是true.
第二种:
更改web.xml
<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_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
</web-app>
3.23实例
<c:if>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl核心标签库--%>
<%--<%@ page isELIgnored="false" %>--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="coreif.jsp" method="get">
EL表达式获取表单的数据
<%-- ${param.参数名}--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="提交">
</form>
<c:if test="${param.username == ‘admin‘}" var="isAdmin">
<c:out value="管理员欢迎你!"/>
</c:if>
<br>
<c:out value="${isAdmin}"/>
</body>
</html>
<c:when>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="corewhern.jsp" method="get">
请输入分数:<input type="text" name="score"><br>
<input type="submit" value="提交">
</form>
<%--定义一个变量score为80--%>
<%--<c:set var="score" value="80"></c:set>--%>
<c:choose>
<c:when test="${param.score>=90}" >
你的成绩为优秀
</c:when>
<c:when test="${param.score>=80}" >
你的成绩为良好
</c:when>
<c:when test="${param.score>=60}" >
你的成绩为及格
</c:when>
<c:when test="${param.score<60}" >
你的成绩为不及格
</c:when>
</c:choose>
</body>
</html>
<c:for>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="corewhern.jsp" method="get">
请输入分数:<input type="text" name="score"><br>
<input type="submit" value="提交">
</form>
<%--定义一个变量score为80--%>
<%--<c:set var="score" value="80"></c:set>--%>
<c:choose>
<c:when test="${param.score>=90}" >
你的成绩为优秀
</c:when>
<c:when test="${param.score>=80}" >
你的成绩为良好
</c:when>
<c:when test="${param.score>=60}" >
你的成绩为及格
</c:when>
<c:when test="${param.score<60}" >
你的成绩为不及格
</c:when>
</c:choose>
</body>
</html>
3.3javaBen
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用和数据库的字段做映射:ORM
- 表------》类
- 字段----》属性
- 行记录----》对象
people.java
package com.xiaozhi.pojo;
public class People {
private int id=0;
private String name=null;
private int age=10;
private String address="无法无天";
// 构造
// public People(int id, String name, int age, String address) {
// this.id = id;
// this.name = name;
// this.age = age;
// this.address = address;
// }
@Override
// 重写
public String toString() {
return "People{" +
"id=" + id +
", name=‘" + name + ‘\‘‘ +
", age=" + age +
", address=‘" + address + ‘\‘‘ +
‘}‘;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
jspbean.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2021/4/8
Time: 23:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello
<jsp:useBean id="people" class="com.xiaozhi.pojo.People">
<jsp:setProperty name="people" property="name" value="小智"/>
<jsp:setProperty name="people" property="id" value="15"/>
<jsp:setProperty name="people" property="age" value="15"/>
<jsp:setProperty name="people" property="address" value="山和大海"/>
</jsp:useBean>
id:<jsp:getProperty name="people" property="id"/>
姓名:<jsp:getProperty name="people" property="name"/>
年龄:<jsp:getProperty name="people" property="age"/>
地址:<jsp:getProperty name="people" property="address"/>
</body>
</html>