JSP的概述
什么是JSP
JSP: Java Server Pages (ava服务器端页面),其实就在HTML中嵌入Java代码。
为什么学习JSP
SUN公司提供了动态网页开发技术: Servlet. Servlet 自身有一些缺点, SUN公司发现了这些问题,推出了一个新的动态网页开发技术JSP。
Servlet的缺点:
Servlet 需要进行配置,不方便维护。
Servlet 很难向网页中输出HTML页面内容
JSP的运行原理
JSP的简单使用
创建一个JSP页面
创建JSP页面还自动创建模板,但是要将编码设置为UTF-8
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello JSP </h1>
</body>
</html>
JSP需要发布到服务器中才可以运行的
发布项目到Tomcat中
访问JSP页面
运行结果:
运行原理:
JSP文件翻译成Java文件,将这个Java文件编译生成class文件,运行class文件,而class文件最终继承的是httpservlet。
JSP脚本元素
JSP脚本元素概述
JSP= HTML +Java代码+ JSP自身东西
JSP的脚本元素就是在JSP中嵌入Java代码。
脚本元素的分类
声明标签
语法:
<%!变量或方法声明%>
写在这个脚本中的代码,翻译成Servlet内部的成员变量或成员方法。、
因为Servlet是一个线程不安全类,所以不推荐使用。
用法:
<body>
<%!
//声明变量
int a=3;
%>
</body>
表达式标签
语法: <%=表达式%>
写在这个脚本中的代码, 翻译成方法内部的out,prin();当中的内容,显示在页面上。
用法:
<%=
a
%>
运行结果后可以将声明便签好中的a输出到页面上
程序代码标签
语法:
<% 程序代码%>
写在这个脚本中的代码, 翻译成方法内部的局部变量或方法内部代码片段。
用法:
推荐使用程序代码标签,而不是声明标签,因为声明标签是写在Servlet中,而Servlet是一个线程不安全类。
JSP的开发模式之MVC模式
JSP开发模式
开发中的路径问题
什么时候会遇见路径问题
提供一些页面,在页面中会提供链接或者表单,当点击链接或者表单的时候需要进行提交,提交到Servlet中。从页面向Servlet发送请求的地址(路径)应该如何编写。
路径的分类
先创建一个动态web项目:
分别使用相对路径和绝对路径,使根目录下的demo1.jsp和demo1目录下的demo1.jsp,访问ServletDemo1。
相对路径
相对路径的写法:
相对路径不是以 / 开头的。
是以 ./(当前路径)和 …/(上一层路径)开头的。
相对路径的使用:
-
在根路径下的页面访问Servlet
demo1的访问路径:
http://localhost:8080/web02/demo1.jsp
ServletDemo1的访问路径:
http://localhost:8080/web02/ServeltDemo1
-
在某个目录下的页面访问Servlet
demo1的访问路径:
http://localhost:8080/web02/demo1/demo1.jsp
ServletDemo1的访问路径:
http://localhost:8080/web02/ServeltDemo1
绝对路径(推荐使用)
绝对路径的写法:
通常以 / 开始的路径
使用绝对路径,不需要关心当前文件和要请求的文件的相对位置的关系!!!
- 注意:
绝对路径分成服务器端路径和客户端路径
客户端路径:需要带工程名
服务器端路径:不需要带工程名
案例需求介绍
案例需求描述
提供登录页面,用于用户登录(用户名和密码需要查询数据库)。如果登录失败,需要回到登录页面(给出提示信息)。如果登录成功,页面进行跳转,在成功页面上显示登录成功的总人数。
案例流程分析
Request作为域对象存取数据
Request作为域对象的API
向Request域中保存数据
从Request域中获取数据
从Request域中移除数据
Request(请求)作为域对象的作用范围
Request对象其实就是从客户端浏览器向服务器发送的一次请求信息的封装。那么实质上向Request中所保存的数据有效期也是一次请求范围。
一次请求范围:从客户端浏览器向服务器发送一次请求, 服务器针对这次请求对浏览器作出响应。当服务器作出响应之后,请求对象就销毁了,保存在其中的数据就无效了。
请求转发和重定向完成页面的跳转
请求转发
通过ServletReguest对象获得ReguestDispatcher对象
再根据RequestDispatcher中的方法进行请求转发
代码实现:
创建一个JSP 页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>跳转后的页面</h1>
</body>
</html>
创建一个Servlet
@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 请求转发的方式
/*
* RequestDispatcher dispatcher = request.getRequestDispatcher("/demo1.jsp");
* dispatcher.forward(request, response);
*/
// 也可以一条写完
request.getRequestDispatcher("/demo1.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException