JavaWeb-08-JSP
1.概述
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。
2.JSP原理
-
找到jsp编译后的文件
//本人电脑上的jsp目录 C:\Users\用户\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_JavaWeb-05-SesoinAndCookie\work\Catalina\localhost\c\org\apache\jsp
结论:jsp最后变成了java文件
-
打开index_jsp.java分析
浏览器向服务器发送请求,不管是什么资源,其本质都是在访问Servlet
处理请求和响应
内置对象
HTML转换
在JSP页面中,Java代码都会被原样输出,是HTML代码则会经过上图式转换(自动)
3.流程总结
4.JSP基础语法
JSP表达式
<%--
JSP表达式
将程序的输出,输出到客户端
<%= 变量/表达式%>
--%>
<%= new java.util.Date()%>
<hr>
JSP代码片段
<%
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum+=i;
}
out.println("<h1>1-100的和:"+sum+"</h1>");
%>
在代码中嵌入HTML元素
<%for (int i = 0; i < 10; i++) {%>
<h1>我重复了<%= i%>次</h1>
<%}%>
JSP声名
<%--
JSP声名 +!
定义全局变量,超脱JspService()
--%>
<%!
static {
System.out.println("loading servlet!");
}
private int globalVar = 0;
public void test(){
System.out.println("进入了方法test!");
}
%>
JSP注释
查看网页源代码时
<%--JSP注释--%> 不会再客户端显示
<!--HTML注释--> 会在客户端显示
5.JSP指令
<%--定制错误页面--%>
<%@ page errorPage="error/500.jsp" %>
<%--显式的声名这是错误界面--%>
<%@ page isErrorPage="true" %>
//公共组件,include嵌入
<%--@include 将三个页面合一--%>
<%@include file="common/header.jsp"%>
<h1>content</h1>
<%@include file="common/footer.jsp"%>
<%--jsp:include 拼接,本质还是3个界面(推荐,灵活性更高)--%>
<%--标签体--%>
<jsp:include page="/common/header.jsp"/>
<h1>content</h1>
<jsp:include page="/common/footer.jsp"/>
<!--错误界面的配置法,在web.xml配置-->
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
6.九大内置对象
- PageContext
- Request
- Reponse
- Session
- Application ------->ServletContext 存公共东西
- config -------> ServletConfig
- out
- page
- exception
作用域
<%
//页面范围,跳转后失效
pageContext.setAttribute("name1","void1");//保存的数据只在一个页面中有效
request.setAttribute("name2","void2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
//整个会话有效,别的页面可取得以下值
session.setAttribute("name3","void3");//保存的数据只在一次会话中有效
application.setAttribute("name4","void4");//保存的数据只在服务器中有效,从打开浏览器到关闭浏览器
%>
<%
//从PageContext 取出,通过寻找的方式(也可以直接通过getAttribution)
//类似双亲委派机制
//从底层到高层(作用域)page->request->session->application
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5");
%>
<%--使用EL表达式取值自动处理空值--%>
<h1>取出的值:</h1>
<h2>${name1}</h2>
<h2>${name2}</h2>
<h2>${name3}</h2>
<h2>${name4}</h2>
<h2>${name5}</h2> 不显示
<hr>
<h2><%= name5%></h2> null
<%
//也可以这样设置作用域
pageContext.setAttribute("hello","value of hello",PageContext.SESSION_SCOPE);
//等价于 session.setAttribute("hello","value of hello");
%>
<%
//页面跳转
pageContext.forward("/pageContextDemo01.jsp");//一般在前端
request.getRequestDispatcher("/pageContextDemo01.jsp").forward(request,response);//后端一般用这个
%>
实际应用场景
request:客户端向服务端发送请求,产生的数据,用户看完就没用了
session:客户端向服务端发送请求,产生的数据,用户看完,可能还会再用,(购物车)
application::客户端向服务端发送请求,产生的数据,一个用户看完,其他用户可能还会用
7.JSP标签,JSTL标签,EL表达式
依赖
<!-- jstl表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSP标签
<%--jsp标签--%>
<%--拼接界面--%>
<%--<jsp:include page=""></jsp:include>--%>
<%--localhost:8080/jsp/jspTag.jsp?name=void&id=000001--%>
<%--转发时携带参数--%>
<jsp:forward page="/jspTag2.jsp">
<jsp:param name="name" value="void"/>
<jsp:param name="id" value="000001"/>
</jsp:forward>
JSTL标签
JSTP标签库的使用是为了弥补HTML标签的不足,它可以自定义许多标签,可以供我们使用,功能和java代码一样
核心标签
导入
<%--引入jstl核心标签库,才能使用--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out> | |
---|---|
<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:out> |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
测试c:if
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl核心标签库,才能使用--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>if 测试</h3>
<hr>
<form action="/jsp/jstlCore.jsp" method="get">
<%--
EL表达式
获取表单中的数据
${param.name}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--java代码--%>
<%--判断如果登录的名字是管理员,则登录成功--%>
<%if(request.getParameter("username").equals("admin")){
out.print("login success");
}%>
<hr>
<%--核心标签库--%>
<c:if test="${param.username=='hello'}" var="isHello">
<c:out value="hello~~~ 是彩蛋"/>
</c:if>
<c:out value="${isHello}"/>
</body>
</html>
测试c:choose c:when
<body>
<%--定义一个变量score值为85--%>
<c:set var="score" value="85"></c:set>
<c:choose>
<c:when test="${score>=90}">
<c:out value="你的成绩是优秀"/>
</c:when>
<c:when test="${score>=80}">
<c:out value="你的成绩是良好"/>
</c:when>
<c:when test="${score>=70}">
<c:out value="你的成绩是中等"/>
</c:when>
<c:when test="${score>=60}">
<c:out value="你的成绩是及格"/>
</c:when>
<c:when test="${score<60}">
<c:out value="你的成绩是不及格"/>
</c:when>
</c:choose>
</body>
测试c:foreach
<body>
<%
ArrayList<String> peoples = new ArrayList<>();
peoples.add("小明");
peoples.add("小A");
peoples.add("小B");
peoples.add("小C");
peoples.add("小D");
request.setAttribute("list",peoples);
%>
<%--
var 遍历的每一个变量
items 遍历的对象
begin 开始
end 结束
step 步长
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/><br/>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
<c:out value="${people}"/><br/>
</c:forEach>
</body>
格式化标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL标签
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
XML标签
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
8.JavaBean
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字段做映射: ORM
ORM:对象关系映射
- 表---->类
- 字段---->属性
- 行记录---->对象
<%
//java的方式
// Person person = new Person();
// person.setId();
// person.setName();
// person.setAge();
// person.setAddress();
%>
<%----jsp标签的方式%>
<jsp:useBean id="person" class="com.cmy.pojo.Person" scope="page"/>
<jsp:setProperty name="person" property="id" value="1"/>
<jsp:setProperty name="person" property="name" value="void"/>
<jsp:setProperty name="person" property="age" value="20"/>
<jsp:setProperty name="person" property="address" value="福建"/>
id:<jsp:getProperty name="person" property="id"/>
姓名:<jsp:getProperty name="person" property="name"/>
年龄:<jsp:getProperty name="person" property="age"/>
地址:<jsp:getProperty name="person" property="address"/>