博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
-jsp-
阅读量:2115 次
发布时间:2019-04-29

本文共 10463 字,大约阅读时间需要 34 分钟。

1、什么是jsp,有什么作用?

jsp的全称是java server pages。java的服务器页面。

jsp的主要作用是代替Servlet程序回传html页面的数据。

因为Servlet程序回传html页面数据是一件非常繁琐的事情,开发成本和维护成本都极高。

html代码如下:

    
Title 这是一个html页面数据

web.xml配置Servlet程序的代码如下

PringHtml
servlet.PringHtml
PringHtml
/pringHtml

1)普通Servlet程序回传html页面数据

public class PringHtml extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过响应的回传流回传html页面数据 PrintWriter writer = resp.getWriter(); writer.write("\r\n"); writer.write(" \r\n"); writer.write(" \r\n"); writer.write("
\r\n"); writer.write(" Title\r\n"); writer.write(" Title\r\n"); writer.write(" \r\n"); writer.write(" \r\n"); writer.write(" 这是一个html页面数据\r\n"); writer.write(" \r\n"); writer.write(" \r\n"); writer.write("\r\n"); }}

页面输入http://localhost:8080/08_jsp/pringHtml 可用观察到回传数据

2)jsp文件页面数据 - - - 可以看出本质是Servlet程序

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title        这是jsp页面数据

页面输入http://localhost:8080/08_jsp/a.jsp 可用观察到回传数据

总结

jsp页面和html页面一样,都是存放在web目录下。访问也跟访问html页面一样。

比如:	在web目录下有如下文件:	web目录		a.html页面		访问地址是		http://ip:port/工程路径/a.html		b.jsp页面		访问地址是		http://ip:port/工程路径/b.jsp

2、jsp的本质是什么

jsp页面本质是一个Servlet程序。

当第一次访问jsp页面的时候。Tomcat服务器会把jsp页面翻译成为一个java源文件,并且对它进行编译成为.class字节码程序,打开java源文件不难发现其里面的内容是:

在这里插入图片描述

跟踪源代码发现,HttpjspBase类,直接继承了HttpServlet类。也就是说,jsp翻译出来的java类,间接继承了HttpServlet类,即翻译出来是一个Servlet程序。

在这里插入图片描述
总结:

通过翻译的java源代码可得到结果:jsp就是Servlet程序。	可以观察发现翻译出来的Servlet程序的源代码,其底层实现,也是通过输出流,把html页面数据回传给客户端。

3、jsp的三种语法

3.1 jsp头部的page指令

jsp的page指令可以修改jsp页面中一些重要的属性,或者行为。

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.2 jsp中的常用脚本

1)声明脚本- - - 极少使用

声明脚本的格式是:<%! 声明java代码 %>

作用:可以给jsp翻译出来的java类定义属性、方法、静态代码块、内部类等。

练习:	① 声明类属性	② 声明static静态代码块	③ 声明类方法	④ 声明内部类
<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title④ 声明内部类--%><%--① 声明类属性--%>    <%!        private Integer id;        private String name;        private static Map
map; %><%--② 声明static静态代码块--%> <%! static {
map = new HashMap<>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); map.put("key4","value4"); map.put("key5","value5"); } %><%--③ 声明类方法--%> <%! public int abc(){
return 0; } %><%--④ 声明内部类--%> <%! public static class A{
private Integer id=12; private String abc="abc"; } %>

2)表达式脚本- - - 常用

表达式脚本的格式是:<%= 表达式 %>

作用:在jsp页面上输出数据。

练习:	① 输出整型	② 输出浮点型	③ 输出字符串	④ 输出对象
<%=12 %> 
<%=12.12 %>
<%="字符串" %>
<%=map %>

表达式脚本的特点

① 所有的表达式脚本都会被翻译到 _jspService()方法中② 表达式脚本都会被翻译成为out.print()输出到页面上③ 由于表达式脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用④ 表达式脚本中的表达式不能以分号结束

3)代码脚本

表达式脚本的格式是:<%java语句%>

作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)。

练习:	① 代码脚本---if语句	② 代码脚本---for循环语句	③ 翻译后java文件中_jspService放啊内的代码都可以写
<%--① 代码脚本---if语句--%>    <%        int i=0;        if (i==0){
System.out.println("0"); }else {
System.out.println("1"); } %><%--② 代码脚本---for循环语句--%> <% for (int j=0;j<10;j++){
System.out.println(j); } %><%--③ 翻译后java文件中_jspService放啊内的代码都可以写--%> <% String username = request.getParameter("username"); System.out.println("用户名的请求参数值是:"+username); %>

代码脚本的特点

① 代码脚本都会被翻译到 _jspService()方法中② 代码脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用③ 还可以由多个代码脚本块组合完成一个完整的java语句。④ 代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据

3.3 jsp中三种注释

1)html注释

html注释会被翻译到java源代码中,在_jspService方法里,以out.writer输出到客户端。

2)java注释

<%	// 单行注释	/* 多行注释 */%>java注释会被翻译到java源代码种

3)jsp注释

<%--这是jsp注释--%>jsp注释可以注解掉jsp页面种的所有代码

3.4 jsp中九大内置对象

jsp中的内置对象,指Tomcat在翻译jsp页面称为Servlet源代码后,内部提供的九大对象,叫内置对象。

在这里插入图片描述

3.5 jsp 四大域对象

四个域对象分别是:

pageContext			(PageContextImpl类)			当前jsp页面范围内有效	request				(HttpServletRequest类)			一次请求内有效	session				(HttpSession类)				一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)	application			(ServletContext类)				整个web工程范围内都有效(只要web工程不停止,数据都在)

域对象是可以像Map一样存取数据的对象,四个域对象功能一样。不同的是它们对数据的存取范围。

四个域在使用的时候,优先顺序分别是,从小到大的范围的顺序。

pageContext ---> request ---> session ---> application

3.6 jsp 中的out输出和response.getWriter输出的区别

response中表示响应,经常用于设置返回给客户端的内容(输出),out也是给用户做输出使用的。- - -如果前面执行中出现out.flush()操作,之前的out就会写入到response中,最后执行完所有的jsp中的代码,自动执行out.flush()把剩下的out写到后面。

在这里插入图片描述

由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序。

out.write() 输出字符串没有问题out.print() 输出任意数据都没有问题(都转换成为字符串后调用write输出)

深入源码,浅出结论:在jsp页面中,可以统一使用out.print()来进行输出。

3.7 jsp 的常用标签

1)jsp静态包含 - - -常用

在这里插入图片描述

静态包含的特点:

1、静态包含不会翻译被包含的jsp页面2、静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出

举例:使得访问main时,可以输出footer中的尾部信息。

footer代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title        尾部信息

main代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title        头部信息
主体内容
<%--以下就是静态包含,file属性指定要包含的jsp页面的路径 地址中第一个斜杠/ 表示为http://ip:port/工程路径/ 映射到代码的web目录 --%> <%@include file="/include/footer.jsp"%>

2)jsp动态包含

动态包含的底层原理:

在这里插入图片描述

动态包含的特点:

1、动态包含会把包含的jsp页面也翻译成为java代码2、动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出。	JspRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);3、动态包含,还可以传递参数。

举例:使得访问main时,可以输出footer中的尾部信息。*

footer代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title        尾部信息
<%=request.getParameter("password")%>

main代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title        头部信息
主体内容
<%--动态包含如下所示 page属性指定要包含的jsp页面的路径 动态包含也可以像静态包含一样,把被包含的内容执行输出到包含位置 --%>

3)jsp标签-转发

下面举例请求转发

两种方式演示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title       <%--请求转发方式一:--%>        <%                request.getRequestDispatcher("/a.jsp").forward(request,response);        %>                <%--请求转发方式二:--%>        <%--
是请求转发标签 它的功能就是请求转发 page属性设置请求转发的路径 --%>

4、jsp的练习题

4.1 在jsp页面输出九九乘法表

test1.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title            <%--练习在jsp页面中输出九九乘法表--%>        

九九乘法表

<% for (int i=1;i<=9;i++){
%>
<% for (int j=0;j
<% } %>
<% } %>
<%=j+"x"+i+"="+(i*j)%>

4.2 在jsp输出一个表格,里面有10个学生的信息

学生类:

public class Student {
private Integer id; private Integer age; private String name; private String phone; public Student() {
} public Student(Integer id, Integer age, String name, String phone) {
this.id = id; this.age = age; this.name = name; this.phone = phone; }...get、set、toString...

test2.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title            <%--练习:jsp输出一个表格,里面有10学生信息--%>        <%            ArrayList
studentList = new ArrayList<>(); for (int i=0;i<10;i++){
int t=i+1; studentList.add(new Student(t,18+t,"name"+t,"phone"+t)); } %>
<% for (Student student:studentList){
%>
<% } %>
编号 姓名 年龄 电话 操作
<%=student.getId()%> <%=student.getName()%> <%=student.getAge()%> <%=student.getPhone()%> 删除、修改

5、请求转发的使用说明

在这里插入图片描述

注意

实现的原因是一次请求中request域中的数据是共享的

SearchStudentServlet代码如下:其中1、2是通过for循环模拟查询到的数据

public class SearchStudentServlet extends HttpServlet {
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、获取请求的参数 // 2、发sql语句查询学生的信息 // 1、2的操作使用for循环生成查询到的数据做模拟 ArrayList
studentList = new ArrayList<>(); for (int i=0;i<10;i++){
int t=i+1; studentList.add(new Student(t,18+t,"name"+t,"phone"+t)); } // 3、保存查询到的结果(学生信息)到request中 request.setAttribute("stuList",studentList); // 4、请求转发到showStudent.jsp页面 request.getRequestDispatcher("/Test/showStudent.jsp").forward(request,response); }

showStudent.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title            <%--练习:jsp输出一个表格,里面有10学生信息--%>        <%            ArrayList
studentList = (ArrayList
) request.getAttribute("stuList"); %>
<% for (Student student:studentList){
%>
<% } %>
编号 姓名 年龄 电话 操作
<%=student.getId()%> <%=student.getName()%> <%=student.getAge()%> <%=student.getPhone()%> 删除、修改

6、什么是Listener监听器

1)Listener监听器是JavaWeb的三大组件之一。JavaWeb三大组件分别是:Servlet程序、Filter过滤器、Listener监听器

2)Listener是JavaE的规范,就是接口

3)监听器的作用是,监听某种事物的变化,然会通过回调函数,反馈给客户(程序)去做一些相应的处理。

6.1 ServletContextListener监听器

ServletContextListener可以监听ServletContext对象的创建和销毁。ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁。监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈

两个方法分别是:

public interface ServletContextListener extends EventListener {		// 在ServletContext对象创建之后马上调用,做初始化	default void contextInitialized(ServletContextEvent sce) { }	// 在ServletContext对象销毁之后调用	default void contextDestroyed(ServletContextEvent sce) { }}

在这里插入图片描述

public class MyservletContextListenerImpl implements ServletContextListener {
@Override public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了"); } @Override public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了"); }}

web.xml配置代码如下:

listener.MyservletContextListenerImpl

转载地址:http://oksef.baihongyu.com/

你可能感兴趣的文章
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>
【Python】easygui小甲鱼
查看>>