JSP全称是Java Server Page,它和Servlet同样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。html
类别 | 适用场景 |
---|---|
HTML | 只能开发静态资源,不能包含java代码,没法添加动态数据。 |
Servlet | 写java代码,能够输出页面内容,可是很不方便,开发效率极低。 |
JSP | 它包括了HTML的展现技术,同时具有Servlet输出动态资源的能力。可是不适合做为控制器来用。 |
写在以前: 明确JSP就是一个Servlet。是一个特殊的Servlet。java
JSP的原理:web
1)客户端提交请求apache
2)Tomcat服务器解析请求地址浏览器
3)找到JSP页面缓存
4)Tomcat将JSP页面翻译成Servlet的java文件tomcat
5)将翻译好的.java文件编译成.class文件服务器
6)返回到客户浏览器上。session
Http服务器调用JSP文件步骤:
1)Http服务器将JSP文件内容编辑为一个Servlet接口实现类(.java)
2)Http服务器将Servlet接口实现类编译为class文件(.class)
3)Http服务器负责建立这个class的实例对象,这个实例对象就是Servlet实例对象
4)Http服务器经过Servlet实例对象调用jspServlet方法,将JSP文件内容写入响应体mvc
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
当咱们打开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中,可使用java脚本代码。形式为:<% 此处写java代码 %>
可是,在实际开发中,极少使用此种形式编写java代码。同时须要注意的是:
<% 在里面写java程序脚本须要注意:这里面的内容由tomcat负责翻译,翻译以后是service方法的成员变量 %>
示例:
<!--Java代码块--> <% out.println("这是Java代码块");%> <hr/>
在jsp中,可使用特定表达式语法,形式为:<%=表达式%>
jsp在翻译完后是out.print(表达式内容);
因此:<%out.print("当前时间");%>
和<%="当前时间"%>
是同样的。
在实际开发中,这种表达式语法用的也不多使用。
示例:
<!--JSP表达式--> <%="这是JSP表达式"%><br/> 就至关于<br/> <%out.println("这是没有JSP表达式输出的");%>
在JSP中也能够声明一些变量,方法,静态方法,形式为:<%! 声明的内容 %>
使用JSP声明须要注意:
<%! 须要注意的是: 写在里面的内容将会被tomcat翻译成全局的属性或者类方法。 %>
示例:
<!--JSP声明--> <%! String str = "声明语法格式";%> <%=str%>
在使用JSP时,它有本身的注释,形式为:<%--注释--%>
须要注意的是:
在Jsp中可使用html的注释,可是只能注释html元素,不能注释java程序片断和表达式。同时,被html注释部分会参与翻译,而且会在浏览器上显示
jsp的注释不只能够注释java程序片断,也能够注释html元素,而且被jsp注释的部分不会参与翻译成.java文件,也不会在浏览器上显示。
示例:
<%--JSP注释--%> <!--HTML注释-->
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
<error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page>
当使用了全局错误页面,就无须再写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 file="" %>
该指令是包含外部页面。
属性:file,以 / 开头,就表明当前应用。
使用示例
静态包含的特色
语法格式:<%taglib uri="" prefix=""%>
做用:该指令用于引入外部标签库。html标签和jsp标签不用引入。
属性:
uri
:外部标签的URI地址。
prefix
:使用标签时的前缀。
什么是隐式对象呢?它指的是在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 | 很重要 |
简介
它是JSP独有的对象,Servlet中没有这个对象。自己也是一个域(做用范围)对象,可是它能够操做其余3个域对象中的属性。并且还能够获取其余8个隐式对象。
生命周期
它是一个局部变量,因此它的生命周期随着JSP的建立而诞生,随着JSP的结束而消失。每一个JSP页面都有一个独立的PageContext。
经常使用方法
在上图中,咱们发现没有页面域操做的方法,实际上是定义在了PageContext的父类JspContext中,以下图所示:
域对象名称 | 范围 | 级别 | 备注 |
---|---|---|---|
PageContext | 页面范围 | 最小,只能在当前页面用 | 因范围过小,开发中用的不多 |
ServletRequest | 请求范围 | 一次请求或当期请求转发用 | 当请求转发以后,再次转发时请求域丢失 |
HttpSession | 会话范围 | 屡次请求数据共享时使用 | 屡次请求共享数据,但不一样的客户端不能共享 |
ServletContext | 应用范围 | 最大,整个应用均可以使用 | 尽可能少用,若是对数据有修改须要作同步处理 |
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" %> <html> <head> <title>学生管理系统首页</title> </head> <body> <%-- 获取会话域中的数据 若是获取到了则显示添加和查看功能的超连接 若是没获取到则显示登陆功能的超连接 --%> <% Object username = session.getAttribute("username"); if(username == null) { %> <a href="/stu/login.jsp">请登陆</a> <%} else {%> <a href="/stu/addStudent.jsp">添加学生</a> <a href="/stu/listStudentServlet">查看学生</a> <%}%> </body> </html>
在 web 目录下建立一个 login.jsp。实现登陆页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>学生登陆</title> </head> <body> <form action="/stu/loginStudentServlet" method="get" autocomplete="off"> 姓名:<input type="text" name="username"> <br> 密码:<input type="password" name="password"> <br> <button type="submit">登陆</button> </form> </body> </html>
建立 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" %> <html> <head> <title>添加学生</title> </head> <body> <form action="/stu/addStudentServlet" method="get" autocomplete="off"> 学生姓名:<input type="text" name="username"> <br> 学生年龄:<input type="number" name="age"> <br> 学生成绩:<input type="number" name="score"> <br> <button type="submit">保存</button> </form> </body> </html>
建立 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,读取文件中的学生信息到集合中
一、将集合添加到会话域中 二、重定向到 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<Student> 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" %> <html> <head> <title>查看学生</title> </head> <body> <table width="600px" border="1px"> <tr> <th>学生姓名</th> <th>学生年龄</th> <th>学生成绩</th> </tr> <% ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students"); for(Student stu : students) { %> <tr align="center"> <td><%=stu.getUsername()%></td> <td><%=stu.getAge()%></td> <td><%=stu.getScore()%></td> </tr> <%}%> </table> </body> </html>