1、什么是jsp
- Java Server Pages: Java服务器端页面,也和Servlet一样,用于动态Web技术!
- 特点:写JSP就像在写HTML
- 区别:html只给用户提供静态的数据,jsp页面中可以嵌入java代码,为用户提供动态数据
2、JSP原理
- 浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
- JSP最终也会被转换成为一个Java类!
- JSP 本质上就是一个Servlet
内置一些对象:
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page:当前
HttpServletRequest request //请求
HttpServletResponse response //响应
方法
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPService
public void _jspService(.HttpServletRequest request,HttpServletResponse response)
在JSP页面中;
- 只要是 JAVA代码就会原封不动的输出;
- 如果是HTML代码,就会被转换为:
out.write("<html>\r\n");
这样的格式,输出到前端!
3、JSP基础语法
JSP表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
jsp脚本片段
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 1; i <=100 ; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
脚本片段的再实现
<%
int x = 10;
out.println(x);
%>
<p>这是一个JSP文档</p>
<%
int y = 2;
out.println(y);
%>
<hr>
<%--在代码嵌入HTML元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>Hello,World <%=i%> </h1>
<%
}
%>
JSP声明
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar = 0;
public void kuang(){
System.out.println("进入了方法Kuang!");
}
%>
JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!
在JSP,嵌入Java代码即可!
<%%>
<%=%>
<%!%>
<%--注释--%>
4、JSP指令
<%@page args.... %>
<%@include file=""%>
<%--@include会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>
<hr>
<%--jSP标签
jsp:include:拼接页面,本质还是三个
--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
5、9大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存
- Application 【ServletContext】存
- config 【ServletConfig】
- out
- page ,不用了解
- exception
pageContext.setAttribute("name1","他化1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","他化2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","他化3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","他化4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
6、JSP标签、JSTL标签、EL表达式
JSTL
<!-- 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>
EL表达式:$
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSP标签
<%--jsp:include--%>
<%--
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="kuangshen"></jsp:param>
<jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
JSTL表达式:
- 作用:JSTL标签库的使用就是为了弥补HTML标签的不足;
- 它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!
核心标签:
<%--
Created by IntelliJ IDEA.
User: 11581
Date: 2023/7/13
Time: 16:33
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>
<%-- jsp表达式--%>
<%= new java.util.Date()%>
$END$
</body>
</html>
1、JSP表达式:
<%= 变量或者表达式%>
<%= new java.util.Date()%>
作用:用来将程序的输出,输出到客户端
2、JSP脚本片段:
格式:
<%
%>
实例:
<%--jsp 脚本片段--%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += 1;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
3、JSP声明
语法:
<%!
%>
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar = 0;
public void kuang(){
System.out.println("进入了方法Kuang!");
}
%>
JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!
4、EL表达式
写法:${}
在这里插入代码片
4、JSP写法
<%%>
<%=%>
<%!%>
<%–注释–%>
在这里插入图片描述
8、定制错误页面
目录:
jsp2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int x = 1/0;
%>
</body>
</html>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%-- jsp表达式--%>
<%= new java.util.Date()%>
<%--jsp 脚本片段--%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += 1;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
$END$
</body>
</html>
404.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<img src="../img/404.jpg" alt="404">
</body>
</html>
500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<img src="../img/500.png" alt="500">
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
</web-app>
jsp3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>
<hr>
<%-- jsp标签,等同于<%@%>--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
</body>
</html>
9、JavaBean
什么是javabean:实体类
javabean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get、set方法
- 般用来和数据库字段做映射ORM
- ORM:对象关系映射
- 表–类
- 字段–属性
- 记录行–对象
1、第一个javaBean
javabean–
pojo–people.java
public class People {
private int id;
private String name;
private int age;
private String 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;
}
public People(int id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public People() {
}
@Override
public String toString() {
return "People{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
javabean.jsp
<%@ page import="com.kuang.pojo.People" %><%--
Created by IntelliJ IDEA.
User: 11581
Date: 2023/7/16
Time: 16:22
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>
<%
//People people = new People();
%>
<jsp:useBean id="people" class="com.kuang.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="北京"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="name" value="小明"/>
<jsp:setProperty name="people" property="age" value="18"/>
姓名:<jsp:getProperty name="people" property="age"/>
id:<jsp:getProperty name="people" property="id"/>
age:<jsp:getProperty name="people" property="age"/>
address:<jsp:getProperty name="people" property="address"/>
</body>
</html>
10、MVC三层架构
- 什么是MVC:Model,View,Controller 模型,视图,控制器
10.1以前的架构
用户直接访问控制层,控制层就可以直接操作数据库;
servlet--CRUD-->数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
架构:没有什么是加一层解决不了的!
程序猿调用
↑
JDBC (实现该接口)
↑
Mysql Oracle SqlServer ....(不同厂商)
10.2 MVC三层架构
11、Filter过滤器
Filter:过滤器,用来过滤网站的数据
- 处理中文乱码
- 登陆验证
filter开发过程:
- 1、导包
<!-- 连接数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- JSP依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</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>
- 2、编写过滤器,实现Filter接口,重写对应的方法即可
//导入servlet的filter
public class CharacterEncodingFilter implements Filter {
//初始化:web服务器启动,就已经初始化了,随时等待过滤对象出现
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
/**
* Chain:;链
* 1、过滤中的所有的代码在过滤特定请求的时候都会执行,
* 2、必须让过滤器继续执行
* filterChain.doFilter(servletRequest,servletResponse);
* */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("gbk");
servletResponse.setCharacterEncoding("gbk");
servletResponse.setContentType("text/html;charset=gbk");
System.out.println("CharacterEncodingFilter执行前...");
//让我们的请求继续走,如果不写,程序到这就会被拦截
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharacterEncodingFilter执行后...");
}
//销毁:web服务器关闭的时候,过滤会销毁
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
3、在web.xml中配置filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
<!--<url-pattern>/*</url-pattern>-->
<!-- 别偷懒写个 /* -->
</filter-mapping>
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>com.thb.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/servlet/s</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Servlet</servlet-name>
<servlet-class>com.thb.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/s</url-pattern>
</servlet-mapping>