jsp

什么是JSP?

 JSP是Java Server Pages的缩写,JSP的本质是Servlet,因为JSP最终会编译成Servlet才能运行【每个jsp页面在第一次被访问时,web容器都会把请求提交给Java程序。Java程序先将JSP编译成_jspServlet,然后按照Servlet的调用方式进行调用。在第一次访问的时候会比较慢,因为要编译成Servlet,如果JSP没有变化,就不会进行再次编译,因此访问速度不会向第一次访问那样慢】。对于JSP而言,写JSP就像写html,但不同的是HTML为用户提供的是静态数据,而JSP允许在HTML页面中嵌入Java代码,受Java程序的控制,从而为用户提供动态的数据。

JSP的基本语法

 JSP有4种基本语法,用于在静态HTML页面中编写Java代码,形成jJSP页面。

  • JSP注释

<%-- JSP注释的内容 --%>

 还有一种注释是HTML页面的注释,该注释在文章中没法打出来,那就说说这两个注释的区别吧,JSP的注释在网页中查看源代码的时候看不到JSP被注释掉的内容,但是HTML注释的内容在网页中是可见的,这就表明了JSP的注释不会被发送到客户端。

  • JSP申明:JSP申明用于申明变量和方法,就如在Java中申明变量和方法一样。但是在JSP 中申明变量和方法不需要定义类。

<% ! 申明的变量或方法 %>

  • JSP输出表达式

 输出表达式用于在JSP页面中输出变量值或者方法返回值。输出表达式末尾不能有分号存在。

<% = 输出表达式 %>

  • JSP脚本
     JSP脚本里可包含可执行的Java代码,Java代码通过JSP脚本被嵌入到HTML页面中。在JSP脚本中不能够定义方法。

<% Java可执行代码 %>

e.g.
 在JSP页面中执行数据库查询指令

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!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>jsp数据库查询</title>
</head>
<body>
<%
/* 注册数据库驱动 */
 Class.forName("org.postgresql.Driver"); 
/*连接数据库  */
 Connection connection= DriverManager.getConnection("jdbc:postgresql://localhost:5432/test", "postgres", "123456"); 
 Statement statement = connection.createStatement();
 ResultSet resultSet = statement.executeQuery("select * from test_table");
%>
<table>
    <%
        while(resultSet.next())
        {
    %>
        <tr>
            <td><%=resultSet.getString(1)%></td>
            <td><%=resultSet.getString(2)%></td>
        </tr>   
    <%
        }
    %>
</table>

</body>
</html>

 注意:
  一定要在发布的服务器中加入数据库驱动哦!不然会出错的。

JSP的编译指令

 JSP一共有三个编译指令,分别是page,taglib和include指令。它们的通用语法为

<%@ 编译指令名 属性名2 = “属性值1”  属性名2 = “属性值2”...... %>
page指令

 page指令通常位于页面的最顶端,并且一个JSP页面可以拥有多个page指令,page指令的语法为:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
taglib指令

  taglib指令用于定义和访问标签库。其语法为:

<%@ taglib uri="" prefix=" "  %>

其中uri是定义标签库的URI,prefix是指定标签库的前缀,即当你要使用改标签库的语法的时候会将前缀带上,例如JSTL的标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>,在使用的时候格式是这样的<c:forEach>XXX</c:forEach>。

include指令

 include指令可以将外部文件嵌入到当前的JSP页面中,include既可以包含静态的文本,也可以包含动态的JSP页面。include指令的语法为:

<%@ include file="XXX" %>

如果被嵌入的文件是动态的,建议使用<jsp:include>指令,在稍后会讲解到该指令

JSP的动作指令

 JSP有七个动作指令,动作指令与编译指令不同,编译指令是在JSP被编译成Servlet 的时候起作用,而动作指令是可以替换成JSP脚本的,它是JSP脚本的标准化写法。

 JSP的7个动作指令:

  • jsp:include:用于引入动态的JSP页面。使用该指令是将被导入页面的body里面的内容引入到JSP页面中。其语法格式为:

<jsp:include page="请求的页面"></jsp:include>

或者

<jsp:include page="请求的页面">
&emsp;&emsp;<jsp:param value="值" name="参数名称" />
    </jsp:include> 
*该种语法表示了在加入的页面中有增加了请求的参数。
&emsp;&emsp;<jsp:include page="请求的页面?参数名称=参数值"></jsp:include> *
  • jsp:param:用于参数的传递。但是必须和支持他的标签一起使用,例如 jsp:include。
  • jsp:forward:执行页面转向,将页面的请求发送到下一个页面。它既可以转发静态HTML页面,也可以转发动动态的JSP页面。其语法为:

<jsp:forward page="转发的页面地址" /></jsp:forward>

  • jsp:plugin:因该指令的使用场景并不多,所以没有描述该指令。
    最后的这三个指令都是与JavaBean相关,
  • jsp:useBean:创建一个JavaBean实例,jsp:useBeande 的语法为:
<jsp:useBean id="" beanName="" class="" scope="page" type=""></jsp:useBean>

它其中包含了这么多的参数,怎么说呢,它就相当于在Java当中创建一个实例,id,beanName,class,type就分别表示Java实例中的ID,属性名,类名以及属性类型,其中scope的值有:
(1) . page:JavaBean实例在本页面中有效。
(2) . request:本次请求有效,通过httpRequest.getAttribute()获取对象。
(3) . session:本次session内有效,通过httpSession.getAttribute()获取对象。
(4) . application:本应用内有效,通过application.getAttribute获取对象。

  • jsp:setProperty:设置JavaBean实例的属性值。语法格式为:

<jsp:setProperty property="" name=""/>

  • jsp:getProperty:获取JavaBean实例的属性值。语法格式为:

<jsp:getProperty property="" name="" />

以上两种指令语法中的name表示Java实例中的实例名,property表示Java实例中的属性名,其中setProperty和getProperty分别对应Java实例中的set和get方法。

JSP的9个内置对象

 JSP中有9个内置对象,这9个内置对象依次是:

名称 描述 作用域 常用方法
request 用户端请求,此请求会包含来自 GET/POST 请求的参数 request getAttribute(String attrName);setAttribute(String attrName,Object attrValue);getParameter(String paramName);getParameterValues(String paramName)等
response 用于重定向 Page sendRedirect(String url);getOutputStream()等
session 对象会话,当客户端浏览器与站点进行连接时,会话开始,当客户端关闭浏览器时会话结束。 Session getAttribute(String attrName);setAttribute(String attrName,Object attrValue);
application JSP所属的web应用本身 Application getAttribute(String attrName);setAttribute(String attrName,String attrValue);
pageContext JSP上下文,使用该对象可以访问页面中的共享数据 Page getServletContext();setServletContext();
page 页面本身,servlet中的this,作用为生成servlet类,能用page的地方就可以用this Page
out JSP页面的输出流 Page
config JSP的配置信息 Page getInitParameter(String paramName);getInitParameters();
exception 页面中的异常和错误,只有当页面的编译指令page为isErrorPage="true"时,该对象才可以使用 Page getMessage();printStackTrace();

forward与redirect的区别

forward(转发) redirect(重定向)
执行forward后依然是上一次的请求 执行redirect后生成了第二次请求
forward的目标页面可以访问原请求的参数,因为还是同一个请求,所有原请求的参数属性全部存在 redirect的目标页面不能访问原请求的参数,因为是第二次请求了,所有原请求的参数等属性全部丢失
地址栏的请求URL不会改变 地址栏的请求URL会改为重定向的目标URL,就相当于重新在地址栏输入了URL并按了回车

cookie和 session的区别
  1、 cookie: cookie将信息存放在客户端机器中,除非超出cookie的生命周期,通常保存的是不重要的信息。
 2、session:session机制通常用于保存客户端的状态信息,这些状态信息需要保存到Web服务器的硬盘上,所以要求session的属性值必须是可序列化的,否则将会引发不可序列化的异常。并且session范围内的属性可以在多个页面的跳转之间共享,一旦浏览器关闭,session范围内的属性将会全部丢失。

EL表达式(Expression Language)

 EL表达式语言是一种简化的数据访问方式,使用表达式语言可以方便的访问JSP的隐含对象和JavaBeans组件。EL表达式语法的格式为:${expression}

 ${student.name}:获取javaBean的某个属性
 ${student.list[0]}:访问有序集合某个位置的元素
 ${map.key}:获得map集合中指定key的值

 EL表达式也支持算数运算符或逻辑运算符,如:{(1==2) ? 3:4 },{10%3}等。

EL表达式的隐式对象

 EL表达式有11个隐式对象,

  • pageContext :可以通过pageContext获取以上所有对象;与JSP的pageContext内置对象相同。${pageContext.request.contextPath}是在实际工程中最常用的
<form id="form" method="post" action="${pageContext.request.contextPath}/knowledge/?m=knowledgeForm">
   ...
</form>
  • pageScope:获取page范围内的属性值。
  • requestScope :获取request范围的属性值。
  • sessionScope :获取session范围的属性值。
  • applicationScope : 获取application范围的属性值。
  • param :获取请求的参数值。
${param.name} 获取name的值。
  • paramValues :用于获取请求的参数值,但获取的是属性值为数组的属性值,返回的是一个String[]数组。
  • header :用于获取请求头的属性值。
  • headerValues :用于获取请求头的属性值,但获取的是属性值为数组的属性值,返回的是一个String[]数组。
  • initParam :用于获取请求web应用的初始参数。
${initParam.初始化参数名} 来获取在 web.xml 中定义了初始化参数 的参数名
  • cookie :用于获取指定的cookie值。

在 EL 的 11 个内置对象中,除了 pageContext 外,其它 10 个内置对象,其类型均为java.util.Map 类型

JSTL表达式(JSP Standard Tag Library)

 JSTL是Apache 已经定义的一套标准的标签库规范,称JSP标准标签库。当我们想要在JSP页面中使用JSTL标签,需要导入jstl.jar和standard.jar两个jar包,以及在JSP页面中导入标签库。
例如:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

JSP中常用的JSTL标准标签库:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>

JSTL标签库中常用标签

-<c:if>标签:其用途和程序中的if用途一样

 <c:if test="${判断条件}">
      XXX
  </c:if>
  • <c:forEach>标签:可以将集合里面的内容循环出来
<c:forEach items="${list }" var="item" varStatus="status">
        ${item.属性名 }<br/>
    </c:forEach>

<c:forEach>遍历Map集合

<c:forEach items="${map}" var="entry">
   key =  ${entry.key} , value = ${entry.value}
</c:forEach>
  • <c:set> 标签
将value的值储存到varName 变量之中
<c:set value="value" var="varName" />

-<c:choose> <c:when> <c:otherwise> 标签:这三个标签是配合使用的,表示if....else if ...else

<c:choose>  
 <c:when test="${判断条件1}">  
        XXX
</c:when>  
<c:when test="${判断条件2}">  
       XXX
</c:when>  
<c:otherwise>  
     XXX
</c:otherwise>  
</c:choose> 

在<c:choose> 标签中可以存在多个<c:when>标签,但只能有一个<c:otherwise> 标签。

  • <fmt:formatDate /> 标签:日期格式转换标签

value :用来格式化的时间或日期

type: 指定格式化的是日期还是时间,或者两者都是取值范围:date,time,both
pattern: 自定义格式化样式 ,如yyyy-MM-dd HH:mm:ss
dateStyle 日期的格式化样式
timeStyle 时间的格式化样式
timeZone 指定使用的时区
var 存储格式化后的结果
scope 指定存储的范围

  • fn:contains 函数 : 判断在源字符串中是否包含目标字符串,其语法为
fn:contains(String source,String target),返回值为Boolean类型,
例如:fn:contains(“ QiQi”,"Qi"),判断字符串QiQi中是否包含Qi,
运用于EL表达式中:${fn:contains(“ QiQi”,"Qi")}
  • fn:indexOf 函数:索引函数,在源字符串中查找目标字符串,索引由0开始,如果索引不到目标字符串返回-1。返回类型为 int。

${fn: indexOf (“ Qiqi”,"qi")},返回值为2

  • fn:substring 函数:用于获取源字符串中的特定子字符串。
fn:substring(String source,int beginIndex,int endIndex)
${ fn: substring (“Tomcat”,0,3)},返回值为Tom,此为包前不包后,相当于大于等于beginIndex,小于endIndex。
  • fn:trim 函数:用于将源字符串中的开头和末尾的空格删除。

${fn:trim(“ Qiqi ”)},除去前后空格,返回值为Qiqi。

  • fn:length 函数:用于返回字符串中的字符的个数,或者集合和数组的元素的个数

${fn:length(source)}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • JSP总结(经典) day1 JSP 定义: 1)Java Server Page, Java EE 组件,本...
    java日记阅读 3,451评论 0 13
  • 一、jsp介绍 jsp作用jsp全称java server pages(java服务器页面),本质是一个servl...
    圣贤与无赖阅读 1,251评论 0 14
  • JSP 基本结构JSP 页面组成:模板文本(HTML,XML,纯文本),JSP 元素;JSP 元素:脚本元素,指令...
    jslancer阅读 848评论 0 11
  • 其他更多java基础文章:java基础学习(目录) 本章内容较多,全部认真看完可能需要一小时以上,建议边看边做笔记...
    Hiwayz阅读 1,315评论 0 10
  • 一、JSP基础 1.1什么是JSP JSP(Java ServerPage)是Java服务器端动态页面技术。是su...
    晨星资源阅读 1,152评论 0 6