本文是我在学习Servlet后,学习的。因为JSP就是一种servlet。所以建议先搞懂什么是servlet。再来看本文。(可以看我的servlet的9个学习笔记)
我后来没有整理笔记的顺序。只是简单的标注了123.
现在我还在看一个和这个有关的文档,可能会做出不定时更新。需要的朋友可以关注哦!!!欢迎随时交流!!!
如果想弄懂jsp的本质,当你写好一个jsp后,在tomcat中部署运行后会出现在work文件夹中的相应的.java文件。
这个就是jsp引擎翻译好的.java文件,也是jsp的本质(具体解释在本文的第7个部分,可以先看本质,再看应用的语法结构)。
所以想学好jsp请打开相应的.java文件,结合着学习。编译的时候可以在其中改错。
1.目录结构
当我创建了一个web应用后,会出现这个目录。当然,我后来用myEclipse2017会多几个文件夹,但是主要的就是这几个。
src:保存java的代码JRE System Library:所使用JRE的类库
Java EE 5 Libraries:使用的JAVA EE 5的版本的类库
WebRoot:web项目核心,部署的时候,就是把目录下所有文件拷贝到Tomcat中
META-INF:版本的设置;不要更改
WEB-INF:
lib第三方架包,
web.xml整个项目的总控制器。
WEB-INF中自动生成一个index.jsp文件
2 9大内置对象(就是不需要自己声明,只需要直接使用就可以。)
pageContext 代表当前页面
作用:基本包含该界面所有的对象和基本信息。如果要传递一个界面,只需要传递这个对象就可以。
request 一次请求
session 多次请求,不能关闭浏览器(一次对话)
如果在<%@ page session=“false”%>,那么就相当于在.java中不会默认声明一个session对象。那么该界面就不可以使用session来处理。
application 整个服务器
_jspServive()中是这么定义的: ServletContext application = null;
application = pageContext.getServletContext();
out 用于输出
源码中定义为:JspWriter out = null; out = pageContext.getOut();
request
response
3.JSP指令标签:
1.page指令,在jsp中如果想要导包需要用到import指令。
例如,在自动生成的index.jsp文件中第一行代码一般为:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
而且该page其中还有很多的参数可以使用,比较常用的还有session="true"
如何判断导入什么包:通常如果该.jsp用的哪个.java文件中的函数,就需要在import中导入相应的java类就可以了。2.taglib指令,可以在jsp页面中引入第三方标签库(JSTL,SpringMVC,Struts)
URL:引入的地址,predix:别名
例如<%@ taglib url="http://java.sun.com/jst1/core" prefix="c" %>
3.include指令,实现源码级导入。是静态的。
例如:在2.jsp页面添加该句话,相当于把included.jsp添加进来。
<%@ include file="included.jsp" @>
结果,在Tomcat中是找不到include.java。但是会发现included.jsp的代码被添加到了2_jsp.java中.相当于是源码的导入,
因此如果included.jsp中存在变量a,b。那么在2.jsp中可以直接使用。
有一种类型的类, 他其中的所有属性都是私有方法,并且都提供getter和setter方法,
同时也提供一个无参数构造方法。这样的方法也可以被称作是VO,entity,model,bean。
5.jsp动作标签
5.1、完成页面跳转
使用param传递的参数必须使用request.getParameter();进行接收参数
形式:<jsp:forward page="included.jsp">
<jsp:param value="sylar" name="username"/>
</jsp:forward>
这种方式实现的页面插入是动态的,就相当于2_jsp.java代码中不会包括included.jsp代码。二者是独立的。(与上面讲的静态包括区别)
1.可以直接创建类的对象,然后对类进行赋值。
Student stu = new Students();
stu.setStuNo("1");
stu.setStuName("sylao"):
2.使用useBean标签完成。
表示创建了一个stu的对象,那么对这个对象两个属性赋值。
<jsp:useBean id="stu" class="com.sylar.entity.Student" scope="request"></jsp:useBean>
<jsp:setProperty property="stuNo" value="2" name="stu" />
<jsp:setProperty property="stuName" value="sylee" name="stu"/>
在<body>中引用
<body>
<jsp:getProperty property="stuNo" name="stu" />
<js[:getProperty property="stuName" name="stu" />
</body>
6.el表达式
作用:可以直接从request、pageContext、session、application中获取数据(Attribute)
在body中为 ${name}获得一个key为name的值。当然这么写就是省略了session、request的省略。
如果忽略了这个限制,默认从最小的开始调用,顺序为从pageContext,request,session,application中找name这个key的名字,找到就提取出value
${stu.sname}获取stu对象中的sname属性值
--------------------------------------------------------------------------------------------------------------------------------
前面部分多数讲的是语法结构,现在我们来看下JSP的本质到底是什么回事!!!
-------------------------------------------------------------------------------------------------------------------------------
7.JSP的本质
详细解释:
就是当你编写一个.jsp后,通过jsp引擎会转译成servlet。也就是一个相应的.java文件,在被编译成.class文件。在Tomcat的work文件夹中,可以找到被jsp引擎转译后的.java的文件。打开该文件。
会发现,原本在jsp中写的html语句和out.print("<html...>")(或者out.println("<html...>))其实是一回事。
在JSP中的静态信息(例如<html>等)在“.java文件”中都是使用out.write()完成打印!这些静态信息都是作为字符串输出给了客户端。
例如:当你的.jsp界面中有如下代码时:在相应的.java中会显示如下形式。
(*.JSP)
(*.JAVA)
同时,在该项目的web.hmtl的文件中(tomcat中),查看有关.jsp的配置信息后会发现。
当你访问.jsp的文件时候,是统一去找.JspServlet的这个类。这个类会根据你调用的不同的jsp文件,去找相应的.java。
比如,你的jsp是1.jsp。那么不是直接去找1_jsp.java这个文件。
功能:用于实现动态网页技术。
常见的动态页面技术:jsp、asp、php
JSP优点是页面表现方便,但是缺点是逻辑处理麻烦,想上面那个判断a!=b的例子。
但是servlet是逻辑处理方便,但是页面变现麻烦,因此现在采用jsp+servlet+javabean的模式。
一般采用jsp做表现+servlet业务逻辑+javabean用来分装数据,封装模型。
8.脚本语法
HTML注释: <!-- Comments -->但是该注释在JSP编译成.java时是存在的,他不会被忽略,而且会被送到客户端浏览器。
但是在浏览器显示客户端发送回来的html时是不会显示的,因为他是html的注释。
Servlet注释:<%-- Comments --> comments在JSP编译成.java的时候会被忽略
"声明”:<%! ...... %> 用于定义一个成员变量或者一些方法。该内容会被放在_jspService()方法之外,被类直接包含。
“表达式”:<%= comments %> 该方法与out.print()效果相同,comments相当于是out.print()的参数。
“脚本段”:<% ..... %> 如果两段的<% .... %>中间有什么内容,都是连通的。语句放在_jspService()内部。