JSP

JSP

​ JSP:Java Server Page SUN公司提供的动态网页编程技术,是Java Web服务器端的动态资源。
它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。
​ 不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
其实Jsp就是一个Servlet,当我们第一次访问Jsp的时候,Jsp引擎都会将这个Jsp翻译成一个
Servlet,这个文件存放在Tomcat中的work目录中。


一、基础语法

1.1 注释

在JSP中支持两种注释的语法操作,一种是显示注释,这种注释是允许客户端看见的;另一种是隐
式注释,此种注释是客户端无法看见的
①显示注释语法:从HTML风格继承而来
②隐式注释语法:从JAVA风格继承;JSP自己的注释
JSP的三种注释方式:
1)//注释,单行注释/多行注释/
2)
3)<%-- JSP注释–%>


1.2 Scriplet

​ 在JSP中最重要的部分就是Scriptlet(脚本小程序),所有嵌入在HTML代码中的Java程序都必
须使用Scriptlet标记出来,在JSP中一共有三种Scriptlet代码:
​ 第一种:<% %>:java脚本段,可以定义局部变量、编写语句
​ 第二种:<%! %>:声明,可以定义全局(成员)变量、方法、类
​ 第三种:<%= %>:表达式,数据、一个变量或具体内容


1.3 JSP的指令标签

​ JSP的指令标签用来控制整个jsp的行为,就当前JSP页面的某些方面对JSP转换器作出指示,可以用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

语法<%@指令名称attribute1="value1"attribute2="value2".....%>
实例<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
1.3.1 page指令

​page指令常用的属性为contentType和pageEncoding,分别用来指定MIME类型和编码
格式。import属性,用来引入其他包,和java中import语句作用相同。

MIME 类型

<%@ page contentType=”text/html;charset=UTF-8”%>

写成<%@ page contentType=”test/html;charset=UTF-8”%> 此时则变成下载

文件字符编码

contentType 主要的功能是用来设置 MIME(页面响应类型),而 charset=”UTF-8” 指定了编码,利用 pageEncoding =”UTF-8”也能指定编码,前者更常用。

在 JSP 中,如果 charset 存在,那么 JSP 的编码由 charset 决定,而如果不存在才会由

pageEncoding 来决定,如果都不存在,则使用 ISO-8859-1 编码。

import导包

page 指令中存在 import 属性,所以导包就可以正确使用了,在整个 page 指令的属性中, 只有

import 语句可以多次出现,其他属性都只能设置一次。 能导包意味着可以直接在 jsp 中链接数据库。

<%@ page import=“java.util." import="java.io.”%>多个import可以通过,分隔

<%@page import=“java.util.* ,java.io.*” %>

include静态包含

<%@ include file=“include.jsp”%>(可以是html也可以是jsp页面)

静态包含就是将内容进行直接替换,就好比程序中定义的变量一样是在 servlet 引擎转译时, 就把此文件内容包含了进去(两个文件的源代码整合到一起,全部放到_jspService 方法中),所以只 生成了一个 servlet,所以两个页面不能有同名的变量。运行效率高一点点。耦合性较高,不够灵活。

taglib导入标签库

<%@ tagilb uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

jsp的动作标签

动作标签,它们被编译成执行某个操作的 Java 代码,例如访问某个 Java 对象,或者调用某个方 法。JSP 容器有自己支持的标准动作。除标准动作之外,还可以创建指定的标签,用来执行某些操作。 这些 jsp 的动作标签,与 html 提供的标签有本质的区别: 动作标签是由 tomcat(服务器)来解释执行!与 java 代码一样,都是在服务器端执行 html 由浏览器来执行!

include

include 动作用于动态地包含另一个资源,它可以包含另一个 JSP 页面、 Servlet 或者一个静态的 HTML 页面。

使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为 几个区域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两 种方法可以实现上述功能。

方法一:在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容。

方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,以后使用的时候直接导入进来。

很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在 JSP 中 如果要想实现包含的操作,有两种做法:静态包含、动态包含。

静态包含见上面:

动态包含

动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当页面被请求的时候时, 才会动态包含进来,好比方法的调用。

<jsp:include page="include.html|include.jsp"></jsp:include>

<% String t="include.jsp|include.html" %>
<jsp:include page="<%=t%>"></jsp:include> 

注意:动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!

使用动态包含还可以通过在页面之间传参。接收参数通过 request.getParameter(name) 来完成。

<jsp:include page="include.jsp"> 
	<jsp:param value="zhangsan" name="username"/> 
</jsp:include> 
<%=request.getParameter("uername"); %>
forward

forward 动作用于请求转发,可以将一个用户的请求(request),从一个页面传递到另一个页面,跳转的语法:

<!-- 不传参数 --> 
<jsp:forward page="要转到的资源路径|<%=表达式%>">
</jsp:forward> 
<!-- 传参数 --> 
<jsp:forward page="要转到的资源路径|<%=表达式%>"> 
	<jsp:param value="参数内容" name="参数名称"/> 
</jsp:forward>

jsp 的 forward 动作标签,其作用的理解可以等价于 Servlet 域对象 HttpServletRequest 的请求转 发,即 request.getRequestDispatcher(“要转到的资源路径”).forward(request, response);

useBean

useBean 动作用来装载一个将在 JSP 页面中使用的 JavaBean。相当于创建了一个 JavaBean 对 象,但是还没有进行属性设置,属性的设置和获取可以通过 jsp:setProperty 和 jsp:getProperty 动作标 签来完成。

<jsp:useBean id="user" class="com.pojo.User">
	<!-- 
		相当于
		User user =new User();
	 -->
</jsp:useBean>
属性描述
id指定Bean的别名
class指定Bean的完整包名。
type指定将引用该对象变量的类型。
beanName通过 java.beans.Beans 的 instantiate() 方法指定Bean的名字。
setProperty

setProperty 动作用来设置已经实例化的 Bean 对象的属性,可以使用如下两种方式。

①在< jsp:useBean>< /jsp:useBean> 后使用 <jsp:setProperty />

<jsp:useBean id="user" class="com.pojo.User"></jsp:useBean>
<jsp:setProperty property="username" name="user" value="zs"/>

②<jsp:setProperty /> 出现在 < jsp:useBean>< /jsp:useBean> 标签内

<jsp:useBean id="user2" class="com.pojo.User">
	<jsp:setProperty property="username" name="user2" value="ls"/>
</jsp:useBean>

注意

<jsp:setProperty /> 中的 name 值要与 < jsp:useBean> 中的 id 值相同

< jsp:useBean>里面的代码,初始化的时候执行一次

getProperty
<jsp:useBean id="user3" class="com.pojo.User">
	<jsp:setProperty property="username" name="user3" value="zs"/>
	<jsp:getProperty property="username" name="user3"/>
</jsp:useBean>

注意

1、在使用 <jsp:getProperty /> 之前,必须使用 < jsp:useBean>< /jsp:useBean> 创建该对象,若没有进行赋值则为 null;若不创建,则会 500 报错。

2、setter 和 getter 存在且符合规范

el表达式、

el语法

EL(Expression Language)是为了使 JSP 写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更加简化。

语法结构非常简单:${expression}

EL 表达式一般操作的都是域对象中的数据,操作不了局部变量。域对象的概念在 JSP 中一共有四 个pageContext, request, session, application;范围依次是,本页面,一次请求,一次会话,整个 应用程序。而 EL 默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空字 符串””。

当需要指定从某个特定的域对象中查找数据时可以使用 el 表达式的隐含对象,分别是: pageScope, requestScope, sessionScope, applicationScope。

el运算

使用 EL 表达式可以用来判断集合中是否有元素 ${empty col}

  1. List 遍历

${list[0]}

  1. 访问 map

m a p [ &quot; k e y &quot; ] 或 {map[&quot;key&quot;]} 或 map["key"]{map.key}

  1. 做+、-、*、/(也可以使用 div 来表示)、%、==

jsp内置对象

九大内置对象
内置对象类型描述
pageContextjavax.servlet.jsp.PageContextjsp的页面的容器
requestjavax.servlet.http.HttpServletRequest得到用户的请求
responsejavax.servlet.http.HttpServletResponse服务器向客户端的回应消息
sessionjavax.servlet.http.HttpSession用来保存每一个用户的信息
applicationjavax.servlet.ServletContext表示所有用户的共享信息
configjavax.servlet.ServletConfig服务器配置,可以获取初始化参数
outjavax.servlet.jsp.JspWriter页面输出
pagejava.lang.Object表示该页面的一个serlvet实例
exceptionjava.lang.Throwable表示jsp页面发生的异常,在错误页面才有用
四种属性范围:

page(pageContext):只在一个页面中保存属性。 跳转之后无效。
request:只在一次请求中有效,服务器跳转之后有效。 客户端跳转无效
session:在一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效
application:在整个服务器上保存,所有用户都可使用。 重启服务器后无效
注意:如果设置过多的application属性范围会影响服务器性能。

域对象具备的方法:

方法描述
setAttribute(String name,Object value)设置属性的名称及内容
getAttribute(String name)根据属性名称取得属性
removeAttribute(String name)删除指定名称的属性

page范围:

page 范围是通过 pageContext 对象设置的,之前研究过的 page 属性范围中使用的是 pageContext 进行属性设置的,但是从 javax.servlet.jsp.PageContext 类中可以发现,有以下的一种设 置属性的方法:

public void setAttribute(String name, Object value, int scope)

在 PageContext 类中存在四个表示属性范围的常量,可以直接通过这些常量指定 scope:

pageContext.PAGE_SCOPE

pageContext.REQUEST_SCOPE

pageContext.SESSION_SCOPE

pageContext.APPLICATION_SCOPE

pageContext.setAttribute(“name”, “zhangsan”, pageContext.APPLICATION_SCOPE);

在其他页面取值时,需要指定对应的作用域,或者使用el表达式(使用el表达式,会优先从最近的作用域开始寻找匹配的值,没找到返回一个空串)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值