服务端技术|jsp技术
服务端技术|jsp技术
叶一片1. 为什么要学习JSP
1.1.使用一个servlet往里面拼接原生html标签
Servlet往浏览器写数据,客户端输出是原样输出
1 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
那么既然原样输出,请问,如果我想要让文字加粗显示,怎么办呢?
【开发总结】:使用一个servlet实现一个网站效果,代码太繁琐了!!生不如死!!
简单案例:
从数据库取出数据,用jsp显示到页面中
Servlet代码:
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
Jsp代码:
1 | <%import="org.apache.jasper.tagplugins.jstl.core.ForEach"%> |
1.2.画图分析
2.JSP技术概述
JSP
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 [1] 是由[Sun Microsystems**](https://baike.baidu.com/item/Sun Microsystems)公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java**程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
Jsp简单的说:html+java代码!
3.JSP入门
3.1.使用Escplise新建一个jsp模板
新建一个模板之后,仔细观察,jsp页面中的东东和传统的html中的东东区别!
Html模板结构:
1 |
|
Jsp模板结构:
1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" |
经过观察:除了jsp中的第一行代码,没有见过,其他都见过,那么所以在jsp中写东西,你可以就像在html中写东西一样!!
1 | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" |
既然,在jsp写东西和html差不多一样,那为何需要这玩意呢?
3.2. jsp脚本和注释
3.2.1.jsp脚本:
1.<% java代码%>
2.<%=java变量或表达式%>、
3.<%!Java代码%>
Servlet是java类
Jsp就是一个Servlet +html
3.2.2.jsp注释
Html注释:
java注释://单行注释 /多行注释/
jsp注释:<%–注释内容–%>
4.JSP原理(本质)
4.1.原理概述
当我们在浏览器输入一个jsp对应的url地址,可以正常访问这个jsp页面,它到底内部做了哪些事情呢?
**1)**Tomcat目录:
2)Tomcat目录下的work目录:
3)再仔细对比文件名的变化:
【开发小结】:JSP的本质(真身)其实就是一个servlet程序而已!!
4.2.jsp三种脚本区别
<%
int a = 10;//局部变量
%>
<%=a %>
<%= 10+100 %>
<%!
int b = 100;//成员变量
int c = 2000;
public void test(){
int b = 120;
System.out.println(b);
}
%>
<%=b%>
4.3.jsp三种注释区别
Html注释:
—可见范围 jsp源码、翻译后的servlet、页面显示html源码
java注释://单行注释 /*多行注释*/
–可见范围 jsp源码 翻译后的servlet
jsp注释:<%–注释内容–%>
—– 可见范围 jsp源码可见
jsp注释: 不同的注释可见范围是不同
【开发小结】:jsp的注释,是最安全的!给Java程序员看!
4.4.jsp原理深入
jsp在第一次被访问时会被Web容器翻译成servlet,在执行
过程:
第一次访问—->helloServlet.jsp—->helloServlet_jsp.java—-> helloServlet_jsp.class 然后再去运行!!
PS:被翻译后的servlet在Tomcat的work目录中可以找到
第一次访问:准确的将,看你项目中jsp文件和work中翻译后信息是否一致,如果一致,以后就不再翻译了,如果不一致,那么就需要重新翻译!
5.JSP指令
jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:
page指令 — 属性最多的指令(实际开发中page指令默认)
属性最多的一个指令,根据不同的属性,指导整个页面特性
格式:<%@ page 属性名1= “属性值1” 属性名2= “属性值2” …%>
Page指令常用属性如下:
language:jsp脚本中可以嵌入的语言种类
pageEncoding:当前jsp文件的本身编码—内部可以包含contentType
contentType:response.setContentType(text/html;charset=UTF-8)
session:是否jsp在翻译时自动创建session,默认自动创建
import:导入java的包
errorPage:当前页面出错后跳转到哪个页面
第二一种方式配置error页面 错误页面的访问顺序:errorPage>exception-type>error-code
isErrorPage:当前页面是一个处理错误的页面
extends:当前jsp需要继承那个父类
include指令
页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=”被包含的文件地址”%>
【思考】:在开发中,include指令有什么作用呢?
案例:创建头和尾页面,在其他页面直接引用
taglib指令
在jsp页面中引入标签库(jstl标签库、struts2标签库)
格式:<%@ taglib uri=”标签库地址” prefix=”前缀”%>
引入标签库
使用标签库
1 | <c:if></c:if> |
6.JSP 9大内置对象(隐式对象)(面试用)
6.1.隐式对象简介
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中可以直接使用这9个对象
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息, |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
*pageContext* | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
思考:为何这些内置对象可以直接使用呢?我们从来没有去new,没有去创建过呀??
经过观察翻译之后的jsp源码中,一共有8个,那么还差一个是谁呢?
*Out对象*
下图就解释了为什么,顺序不一样,如果buffer属性设置为0kb,则顺序就一样了:
6.2PageContext
jsp页面的上下文对象,作用如下:
page对象与pageContext对象不是一回事
pageContext作用范围:就只在当前页面有效,默认的
1 | <% *int\**** a = 10;%> |
1)pageContext是一个域对象
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttrbute(String name)
pageContext可以向指定的其他域中存取数据
setAttribute(String name,Object obj,int scope)
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
findAttribute(String name)**
pageContext可以指定往哪个域中存数据:
findAttribute(String name)
—依次从pageContext域,request域,session域,application域中获\ 取属性,在某个域中获取后将不在向后寻找
四大作用域的总结:
page域:默认当前jsp页面范围
request域:一次请求
session域:一次会话
application域:整个web应用
可以获取其它8大内置对象
例如: pageContext.getRequest() => request 对象
pageContext.getSession()
7. JSP标签(动作)
面试题,请简述静态引入,与动态引入的区别?
Include(静态引入),
<jsp:include >(动态引入)
1)页面包含(动态包含):<jsp:include page=”被包含的页面”/>
动态包含:会将两个页面都翻译出来
静态包含:直接将两个文件的代码拼凑在一起
让页面格式良好:
2)请求转发:<jsp:forward page=”要转发的资源” />
思考:
1.先思考转发的特点是什么?
2.servlet转发中实现步骤
1 | <!-- jsp:forward转发标签 --> |
8.EL表达式技术(重要)
8.1.EL表达式概述
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。
8.2. EL从域中取出数据(EL最重要的作用)
1)获得普通字符串
2)获得User对象的值
3获得List
EL最主要的作用:获得四大域中的数据,格式:${EL表达式}
EL获得pageContext域中的值:${pageScope.key};
EL获得request域中的值:${requestScope.key};
EL获得session域中的值:${sessionScope.key};
EL获得application域中的值:${applicationScope.key};
—同样是依次从pageContext域,request域,session域,application域中 获取属性,在某个域中获取后将不在向后寻找!
El 表达式11个内置对象
pageScope requestScope sessionScope applicationScope param paramValues
Header headerValues initParam cookie pageContext
获得当前项目的名字:
Cookie对象;
8.4.EL执行表达式
例如:
${1+1}
${empty user}
${user==null?true:false}
${1+1 }${1==1?*true*:*false* }${*empty* “” }${*empty* user }
9.JSTL标签库技术
9.1.JSTL概述
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要代替jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库
标签库 | 标签库的URI | 前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
9.2.JSTL下载和导入
JSTL下载:
从Apache的网站下载JSTL的JAR包。进入 “http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”网址下载 JSTL的安装包。
jakarta-taglibs-standard-1.1.2.zip,然后将下载好的JSTL安装包 进行解压,此时,在lib目录下可以看到两个JAR文件,分别为jstl.jar和standard.jar。
其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于 实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)
将两个jar包导入我们工程的lib中
使用jsp的taglib指令导入核心标签库
9.3.JSTL核心库常用标签
1)<c:if test=””>标签
其中test是返回boolean的条件
Jstl表达式结合el表达式一起使用
2)<c:forEach>标签
使用方式有两种组合形式:
参数:
items:集合
var:集合中的每个元素
begin:开始遍历位置
end:结束遍历的位置
varStatus=”status”:状态
status.count:可以得到循环的次数
示例:
1)遍历List
1 | <c:forEach items="${list }" var="li" varStatus="status"> |
2)遍历List
1 | <!--status:表示当前集合的状态码,count为循环一个计算器 --> |
3)遍历Map<String,String>的值
1 | <c:forEach items="${map}" var="map"> |
遍历Map<User,Map<String,User>>的值
entry.key—–User
entry.value——List<String,User>
案例:完成商品信息显示,循环显示
1 | package cn.yueqian.spdemo; |
Jsp代码:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
javaBean
1 | package cn.yueqian.spdemo; |
效果图: