【JavaWeb】JSP基础和应用

【JavaWeb】JSP基础和应用

JSP基础

JSP简介

JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。

JSP和HTML以及Servlet的适用场景

类别

适用场景

HTML

只能开发静态资源,不能包含java代码,无法添加动态数据。

Servlet

写java代码,可以输出页面内容,但是很不方便,开发效率极低。

JSP

它包括了HTML的展示技术,同时具备Servlet输出动态资源的能力。但是不适合作为控制器来用。

JSP说明

写在之前: 明确JSP就是一个Servlet。是一个特殊的Servlet。

JSP的原理:

1)客户端提交请求

2)Tomcat服务器解析请求地址

3)找到JSP页面

4)Tomcat将JSP页面翻译成Servlet的java文件

5)将翻译好的.java文件编译成.class文件

6)返回到客户浏览器上。

执行过程分析图

Http服务器调用JSP文件步骤:

1)Http服务器将JSP文件内容编辑为一个Servlet接口实现类(.java)

2)Http服务器将Servlet接口实现类编译为class文件(.class)

3)Http服务器负责创建这个class的实例对象,这个实例对象就是Servlet实例对象

4)Http服务器通过Servlet实例对象调用jspServlet方法,将JSP文件内容写入响应体

Http服务器编辑与编译JSP文件位置:

我的计算机下是:

C:\Users\lenovo\.IntelliJIdea2019.3\system\tomcat\Tomcat_9_0_30_javaweb04\work\Catalina\localhost\ROOT\org\apache\jsp

标志答案:

C:\Users\Windows系统用户名\.IntelliJIdea2019.3\system\tomcat\网站工作空间\work\Catalina\localhost\ROOT\org\apache\jsp

JSP的.java文件内容分析

当我们打开index.jsp翻译的java文件看到的就是public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase类的声明

在Tomcat的源码中找到HttpJspBase类的声明,如下图:

这张图一出场,就表明我们写的JSP它本质就是一个HttpServlet了。

JSP它是一个特殊的Servlet,主要是用于展示动态数据。它展示的方式是用流把数据输出出来,而我们在使用JSP时,涉及HTML的部分,都与HTML的用法一致,这部分称为jsp中的模板元素,在开发过程中,先写好这些模板元素,因为它们决定了页面的外观。

JSP应用

JSP语法

Java代码块

在jsp中,可以使用java脚本代码。形式为:<% 此处写java代码 %>

但是,在实际开发中,极少使用此种形式编写java代码。同时需要注意的是:

<%

在里面写java程序脚本需要注意:这里面的内容由tomcat负责翻译,翻译之后是service方法的成员变量

%>

示例:

<% out.println("这是Java代码块");%>


JSP表达式

在jsp中,可以使用特定表达式语法,形式为:<%=表达式%>

jsp在翻译完后是out.print(表达式内容);

所以:<%out.print("当前时间");%> 和<%="当前时间"%> 是一样的。

在实际开发中,这种表达式语法用的也很少使用。

示例:

<%="这是JSP表达式"%>

就相当于

<%out.println("这是没有JSP表达式输出的");%>

JSP声明

在JSP中也可以声明一些变量,方法,静态方法,形式为:<%! 声明的内容 %>

使用JSP声明需要注意:

<%!

需要注意的是: 写在里面的内容将会被tomcat翻译成全局的属性或者类方法。

%>

示例:

<%! String str = "声明语法格式";%>

<%=str%>

JSP注释

在使用JSP时,它有自己的注释,形式为:<%--注释--%>

需要注意的是:

​ 在Jsp中可以使用html的注释,但是只能注释html元素,不能注释java程序片段和表达式。同时,被html注释部分会参与翻译,并且会在浏览器上显示

​ jsp的注释不仅可以注释java程序片段,也可以注释html元素,并且被jsp注释的部分不会参与翻译成.java文件,也不会在浏览器上显示。

示例:

<%--JSP注释--%>

JSP指令

page指令

language:告知引擎,脚本使用的是java,默认是java,支持java。不写也行。

extends:告知引擎,JSP对应的Servlet的父类是哪个,不需要写,也不需要改。

import:告知引擎,导入哪些包(类)。

​ 注意:引擎会自动导入:java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*

​ 导入的形式:

​ <%@page import=”java.util.Date,java.util.UUID”%>或者:

​ <%@page import=”java.util.Date”%>

​ <%@page import=”java.util.UUID”%>

session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认是true。

buffer:JspWriter用于输出JSP内容到页面上。告知引擎,设定他的缓存大小。默认8kb。

errorPage:告知引擎,当前页面出现异常后,应该转发到哪个页面上(路径写法:/代表当前应用)

​ 小贴士:当在errorpage上使用了isErrorPage=true之后,ie8有时候不能正常显示

​ 配置全局错误页面:web.xml

java.lang.Exception

/error.jsp

404

/404.html

​ 当使用了全局错误页面,就无须再写errorPage来实现转到错误页面,而是由服务器负责跳转到错误页面。

isErrorPage:告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception对象,打印异常的详细信息。默认值是false。

contentType:告知引擎,响应正文的MIME类型。contentType="text/html;charset=UTF-8"

​ 相当于response.setContentType("text/html;charset=UTF-8");

pageEncoding:告知引擎,翻译jsp时(从磁盘上读取jsp文件)所用的码表。pageEncoding="UTF-8"相当于告知引擎用UTF-8读取JSP

isELIgnored:告知引擎,是否忽略EL表达式,默认值是false,不忽略。

include指令

语法格式:<%@include file="" %> 该指令是包含外部页面。

属性:file,以 / 开头,就代表当前应用。

使用示例

静态包含的特点

taglib指令

语法格式:<%taglib uri="" prefix=""%>

作用:该指令用于引入外部标签库。html标签和jsp标签不用引入。

属性:

​ uri:外部标签的URI地址。

​ prefix:使用标签时的前缀。

JSP细节

九大隐式对象

什么是隐式对象呢?它指的是在jsp中,可以不声明就直接使用的对象。它只存在于jsp中,因为java类中的变量必须要先声明再使用。其实jsp中的隐式对象也并非是未声明,只是它是在翻译成.java文件时声明的。所以我们在jsp中可以直接使用。

隐式对象名称

类型

备注

request

javax.servlet.http.HttpServletRequest

response

javax.servlet.http.HttpServletResponse

session

javax.servlet.http.HttpSession

Page指令可以控制开关

application

javax.servlet.ServletContext

page

Java.lang.Object

当前jsp对应的servlet引用实例

config

javax.servlet.ServletConfig

exception

java.lang.Throwable

page指令有开关

out

javax.servlet.jsp.JspWriter

字符输出流,相当于printwriter

pageContext

javax.servlet.jsp.PageContext

很重要

PageContext对象

简介

它是JSP独有的对象,Servlet中没有这个对象。本身也是一个域(作用范围)对象,但是它可以操作其他3个域对象中的属性。而且还可以获取其他8个隐式对象。

生命周期

它是一个局部变量,所以它的生命周期随着JSP的创建而诞生,随着JSP的结束而消失。每个JSP页面都有一个独立的PageContext。

常用方法

在上图中,我们发现没有页面域操作的方法,其实是定义在了PageContext的父类JspContext中,如下图所示:

四大域对象

域对象名称

范围

级别

备注

PageContext

页面范围

最小,只能在当前页面用

因范围太小,开发中用的很少

ServletRequest

请求范围

一次请求或当期请求转发用

当请求转发之后,再次转发时请求域丢失

HttpSession

会话范围

多次请求数据共享时使用

多次请求共享数据,但不同的客户端不能共享

ServletContext

应用范围

最大,整个应用都可以使用

尽量少用,如果对数据有修改需要做同步处理

MVC模型

Servlet:擅长处理业务逻辑,不擅长输出显示界面。在web开发中多用于控制程序逻辑(流程)。所以我们称之为:控制器。

JSP:擅长显示界面,不擅长处理程序逻辑。在web开发中多用于展示动态界面。所以我们称之为:视图。

例如:

M:model ,通常用于封装数据,封装的是数据模型。

V:view ,通常用于展示数据。动态展示用jsp页面,静态数据展示用html。

C:controller ,通常用于处理请求和响应。一般指的是Servlet。

综合案例-学生管理系统

登录功能实现

创建一个web项目,在 web 目录下创建一个 index.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

学生管理系统首页

<%--

获取会话域中的数据

如果获取到了则显示添加和查看功能的超链接

如果没获取到则显示登录功能的超链接

--%>

<% Object username = session.getAttribute("username");

if(username == null) {

%>

请登录

<%} else {%>

添加学生

查看学生

<%}%>

在 web 目录下创建一个 login.jsp。实现登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

学生登录

姓名:

密码:

创建 LoginStudentServlet,获取用户名和密码

package com.itheima.servlet;

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 java.io.IOException;

/*

学生登录

*/

@WebServlet("/loginStudentServlet")

public class LoginStudentServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//1.获取用户名和密码

String username = req.getParameter("username");

String password = req.getParameter("password");

//2.判断用户名

if(username == null || "".equals(username)) {

//2.1用户名为空 重定向到登录页面

resp.sendRedirect("/stu/login.jsp");

return;

}

//2.2用户名不为空 将用户名存入会话域中

req.getSession().setAttribute("username",username);

//3.重定向到首页index.jsp

resp.sendRedirect("/stu/index.jsp");

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req,resp);

}

}

添加功能实现

在 web 目录下创建一个 addStudent.jsp,实现添加学生的表单项

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

添加学生

学生姓名:

学生年龄:

学生成绩:

创建 AddStudentServlet,获取学生信息并保存到文件中

package com.itheima.servlet;

import com.itheima.bean.Student;

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 java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

/*

实现添加功能

*/

@WebServlet("/addStudentServlet")

public class AddStudentServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//1.获取表单中的数据

String username = req.getParameter("username");

String age = req.getParameter("age");

String score = req.getParameter("score");

//2.创建学生对象并赋值

Student stu = new Student();

stu.setUsername(username);

stu.setAge(Integer.parseInt(age));

stu.setScore(Integer.parseInt(score));

//3.将学生对象的数据保存到d:\\stu.txt文件中

BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\stu.txt",true));

bw.write(stu.getUsername() + "," + stu.getAge() + "," + stu.getScore());

bw.newLine();

bw.close();

//4.通过定时刷新功能响应给浏览器

resp.setContentType("text/html;charset=UTF-8");

resp.getWriter().write("添加成功。2秒后自动跳转到首页...");

resp.setHeader("Refresh","2;URL=/stu/index.jsp");

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req,resp);

}

}

查看学生功能

创建 ListStudentServlet,读取文件中的学生信息到集合中

1、将集合添加到会话域中

2、重定向到 listStudent.jsp 页面上

package com.itheima.servlet;

import com.itheima.bean.Student;

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 java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

/*

实现查看功能

*/

@WebServlet("/listStudentServlet")

public class ListStudentServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//1.创建字符输入流对象,关联读取的文件

BufferedReader br = new BufferedReader(new FileReader("d:\\stu.txt"));

//2.创建集合对象,用于保存Student对象

ArrayList list = new ArrayList<>();

//3.循环读取文件中的数据,将数据封装到Student对象中。再把多个学生对象添加到集合中

String line;

while((line = br.readLine()) != null) {

//张三,23,95

Student stu = new Student();

String[] arr = line.split(",");

stu.setUsername(arr[0]);

stu.setAge(Integer.parseInt(arr[1]));

stu.setScore(Integer.parseInt(arr[2]));

list.add(stu);

}

//4.将集合对象存入会话域中

req.getSession().setAttribute("students",list);

//5.重定向到学生列表页面

resp.sendRedirect("/stu/listStudent.jsp");

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req,resp);

}

}

在 web 目录下创建一个 listStudent.jsp

<%@ page import="com.itheima.bean.Student" %>

<%@ page import="java.util.ArrayList" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

查看学生

<% ArrayList students = (ArrayList) session.getAttribute("students");

for(Student stu : students) {

%>

<%}%>

学生姓名 学生年龄 学生成绩
<%=stu.getUsername()%> <%=stu.getAge()%> <%=stu.getScore()%>

相关推荐

如何在宝马车上挂档位
我和黑大佬的365天知乎

如何在宝马车上挂档位

📅 07-21 👁️ 2094
刀剑2尚武系刺客专属解析攻略
我和黑大佬的365天知乎

刀剑2尚武系刺客专属解析攻略

📅 07-22 👁️ 122
本田雅阁第九代多少钱
365bet手机app下载

本田雅阁第九代多少钱

📅 07-05 👁️ 3706