JavaWeb-jsp
简介
JSP:Java Server Page
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。
JSP最终也会被转换成为一个Java类。
原理
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% String name = "Bob"; %>
hello, <%=name%>!
</body>
</html>
本质
在访问JSP时,java代码会原封不动的输出,HTML代码会变转化,可以看到本质都是Servlet!
依赖
<dependencies>
<!-- servlet的依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- jsp的依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- jstl表达式依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
基础语法
表达式
<%= 变量或表达式%> 将输出展示在客户端
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%= new java.util.Date()%>
</body>
</html>
脚本片段
<% java代码 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
int sum=0;
for (int i = 0; i < 100; i++) {
sum +=i;
}
out.println("sum=" + sum);
%>
</body>
</html>
脚本再实现
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%= new java.util.Date()%>
<hr>
<%
for (int i = 0; i < 5; i++) {
%>
hello world!<%=i%> <br>
<%
}
%>
</body>
</html>
声明
<%! java代码 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% int i = 1/0; %>
</body>
</html>
<%!
static {
System.out.println("Loading servlet");
}
private int globalVar = 0;
public void fun(){
System.out.println("It is a function");
}
%>
jsp的声明会被JSP生成到Java的类中,其他的被生成到_jspService
方法中
注释
<%-- 注释 --%>
自定义错误页面
规定页面
<%@ page errorPage="xxx.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page errorPage="/error/500.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% int i = 1/0; %>
</body>
</html>
全局
配置web.xml
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
包含页面
<%-- 将两个页面合二为一 会产生影响 --%>
<%@include file = "commmon/header.jsp" %>
<%-- 拼接页面 互不影响 --%>
<jsp:include page = "/common/header.jsp" />
九大对象
- PageContext JSP的页面容器
- Request 获取用户的请求信息
- Response 服务器向客户端的回应信息
- Session 用来保存每一个用户的信息
- ServletContext 表示所有用户的共享信息
- Config 服务器配置信息
- out 页面输出
- page 只在一个页面中保存属性
- exception 错误处理
获取对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//保存的数据仅在一个页面中有效
pageContext.setAttribute("name1", "test1");
//保存的数据仅在一次请求中有效,请求转发会携带
request.setAttribute("name2", "test2");
//在一次会话中有效,从打开浏览器到关闭浏览器
session.setAttribute("name3", "test3");
//保存的数据在服务器中有效,从打开服务器到关闭服务器
application.setAttribute("name4", "test4");
%>
<%
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表达式输出--%>
<h2>${name1}</h2>
<h2>${name2}</h2>
<h2>${name3}</h2>
<h2>${name4}</h2>
<h2>${name5}</h2>
</body>
</html>
pageContext.forword("1.jsp")
request数据也会转发
标签
jsp标签
jspTag.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:forward page="/jspTag2.jsp">
<jsp:param name="name" value="Bob"/>
<jsp:param name="age" value="18"/>
</jsp:forward>
</body>
</html>
jspTag2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%=request.getParameter("name")%>
<%=request.getParameter("age")%>
</body>
</html>
jstl标签
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和ava代码一样
- 核心标签
- 格式化标签
- sql标签
- xml标签
核心标签
使用步骤
- 引入对应的taglib
- 使用其中的方法
- 在tomcat中也需要引入jstl的包
<%@ 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>
<form action="jstl.jsp" method="get">
<%--el表达式获取表单内容--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断--%>
<c:if test="${param.username == 'admin'}" var="isAdmin">
<c:out value="welcome" />
</c:if>
</body>
</html>
JavaBean
实体类
- 必须要有无参构造
- 属性必须私有化
- 必须有有对应的get/set方法
一般用于数据库的字段映射 ORM
- 表->类
- 字段->属性
- 记录->对象
People.class
package com.th0r.pojo;
public class People {
private int id;
private String name;
private String address;
public People() {
}
public People(int id, String name, String address) {
this.id = id;
this.name = name;
this.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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
javabean.jsp
<%@ page import="com.th0r.pojo.People" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<jsp:useBean id="people" class="com.th0r.pojo.People" scope="page" />
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="name" value="Bob"/>
<jsp:setProperty name="people" property="address" value="Beijing"/>
学号:<jsp:getProperty name="people" property="id"/>
姓名:<jsp:getProperty name="people" property="name"/>
地址:<jsp:getProperty name="people" property="address"/>
</body>
</html>