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}
- List 遍历
${list[0]}
- 访问 map
m a p [ " k e y " ] 或 {map["key"]} 或 map["key"]或{map.key}
- 做+、-、*、/(也可以使用 div 来表示)、%、==
jsp内置对象
九大内置对象
内置对象 | 类型 | 描述 |
---|---|---|
pageContext | javax.servlet.jsp.PageContext | jsp的页面的容器 |
request | javax.servlet.http.HttpServletRequest | 得到用户的请求 |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应消息 |
session | javax.servlet.http.HttpSession | 用来保存每一个用户的信息 |
application | javax.servlet.ServletContext | 表示所有用户的共享信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以获取初始化参数 |
out | javax.servlet.jsp.JspWriter | 页面输出 |
page | java.lang.Object | 表示该页面的一个serlvet实例 |
exception | java.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表达式,会优先从最近的作用域开始寻找匹配的值,没找到返回一个空串)