JSP基础知识:
1.JSP简介:
1.JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
2.JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
3.JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
4.优势: 它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据;相比 servlet 而言,servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产生动态数据的同时,也很容易对数据进行排版。
2.基础语法:
1)注释:
(1)显示注释语法:(浏览器可以看到的注释,可以给用户看的注释)
从 HTML 风格继承而来:
(2)隐式注释语法:(浏览器无法看到的注释,不给用户看的)
从 JAVA 风格继承: // 注释,单行注释 /* 多行注释 */
JSP 自己的注释: <%-- JSP 注释 --%>
2) Scriptlet
(1) <% %> :java 脚本段,可以定义局部变量、编写语句
(2)<%! %>:声明,可以定义全局(成员)变量、方法、类
(3)<%= %>:表达式,数据、一个变量或具体内容
(4)代码示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP-scriptlet</title>
</head>
<body>
<%
int a = 0;
int b = 1;
System.out.println(a+b);
%>
<%!
int c = 8;
%>
<%="hellojsp" %>
</pre>
</body>
</html>
3)JSP的指令标签
(1) page 指令:
格式:<%@ page 属性1=值1 属性2=值2 %>
属性: **language:**指定当前jsp所使用的语言,目前就只有java
**contentType:**指定响应类型;指定编码字符集
**pageEncoding:**指定编码字符集 优先级,charset=UTF-8 > pageEncoding=“UTF-8” > 默认ISO-8859-1
**import:**导包
**errorPage:**指定当前页面报错跳转的错误页面,需要在错误页面打印错误信息 exception 需要设置 isErrorPage="true"指定所有页面报错跳转,通过配置web.xml 设置<error-page<%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@ page errorPage="/error.jsp" language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
(2)include 静态包含:
格式:<%@ include file=”要包含的文件路径”%>相对路径
<%@ include file="/04include2.jsp" %>
注意:就相当于将包含页面的内容复制黏贴到了标签所在位置,经过JSP引擎翻译后只生成一个文件,所以不能声明相同的变量
优缺点:运行效率高一点点。耦合性较高,不够灵活
(3) taglib 导入标签库:
当使用到第三方标签库时需要通过 taglib 标签进行导入。
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4)JSP的动作标签:
注意:**动作标签是由 tomcat(服务器)来解释执行!与 java 代码一样,都是在服务器端执行;html 由浏览器来执行!
(1)include:
方法一:在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容。
方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,以后使用的时候直接导入进来。(一般使用第二种);
**静态包含:**静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样。(就是上面那种)**动态包含:**动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当页面被请求的时候时,才会动态包含进来,好比方法的调用。
格式:<jsp:include page=“指定动态包含页面的路径”></jsp:include>
<jsp:include page="/05jsp_include2.jsp"> <jsp:param value="zhangsan" name="uname"/> </jsp:include>
**注意:**通过JSP引擎翻译后生成多个文件,相当于方法的调用,所以和静态包含不一样,不会发生变量冲突;除非要通过子标签来传递参数,否则不要在标签内部加任何内容包括空格。
(2)forward:
> forward 动作用于请求转发,可以将一个用户的请求(request),从一个页面传递到另一个页面,跳转的语法。
格式:<jsp:forward page=“请求转发的路径”></jsp:forward>相当于
request.getRequestDispatch(“请求转发的路径”).forward(request,response);<jsp:forward page="/06forward2.jsp"> <jsp:param value="小小" name="uname"/> </jsp:forward>
(3)useBean、setProperty、getProperty:
格式:<jsp:useBean id=“对象的别名” scope=“设定对象存储在哪一个域对象中” class=“类的全限定名”>
<jsp:useBean id="user" scope="page" class="com.mage.po.User"></jsp:useBean> <jsp:setProperty property="name" name="user" value="liuhh"/> <jsp:getProperty property="name" name="user"/>
注意:
jsp:setProperty:给对象设置属性
<jsp:setProperty property=“属性名” name=“对象的别名” value=“属性值”/>中的 name 值要与 中的 id 值相同jsp:getProperty:获取对象中的属性值
<jsp:getProperty property=“属性名” name=“对象的别名”/>useBean:
属性 描述 id 指定Bean的别名 class 指定Bean的完整包名。 type 指定将引用该对象变量的类型。 beanName 通过 java.beans.Beans 的 instantiate() 方法指定Bean的名字。
3.Jsp 的九大内置对象:
NO 内置对象 类型 描述 1 PageContext javax.servlet.jsp.PageContext JSP的页面容器 2 request javax.servlet.http.HttpServletRequest 得到用户的请求信息 3 response javax.servlet.http.HttpServletResponse 服务器向客户端的回应消息 4 session javax.servlet.http.HttpSession 用来保存每一个用户的信息 5 application javax.servlet.ServletContext 表示所有用户的共享信息 6 config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数 7 out javax.servlet.jsp.JspWriter 页面输出 8 page java.lang.Object 表示从该页面中表示出来的一个Servlet实例 9 exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用
4.EL 表达式:
**1)概念:**EL(Expression Language)是为了使 JSP 写起来更加简单。表达式语言的灵感来自于ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更加简化。
2)语法结构:${expression}
3)格式:
返回域对象中指定键对应的值:${域对象中键的名称 }
获取域对象中对象指定属性对应的值:${域对象中键的名称.属性名 }
判断域对象中指定键对应的值是否为空:${empty 键的名称 }
判断域对象中指定键对应的值是否相等:${键1==键2 }4)注意:
从小到大获取域对象中的数据,如果都没有则显示"",
获取指定域对象中的数据:${域对象名称Scope.uname }
1)代码示例:
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.mage.po.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>el表达式</title>
</head>
<body>
<!-- 往四大域对象中存数据 -->
<%
pageContext.setAttribute("uname", "xiaoxao");
request.setAttribute("uname", "mengmeng");
session.setAttribute("uname", "pengpeng");
application.setAttribute("uname", "xixi");
User user = new User();
user.setName("lh");
user.setAddress("江西");
user.setSex(true);
request.setAttribute("user", user);
%>
el表达的方式:<br>
${uname1 }<br>
el表达式获取指定域对象中的值:<br>
pageContext中:${pageScope.uname }<br>
request中:${requestScope.uname }<br>
session中:${sessionScope.uname }<br>
application中:${applicationScope.uname }<br>
el表达式方式获取对象中的属性对应的值:<br>
${user.name }
el表达式获取List数据:<br>
<%
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
request.setAttribute("list", list);
%>
获取list中指定数据:${list[1] }<br>
判断是否为空:${empty list[3] }<br>
el表达式获取map数据:<br>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("a","1");
map.put("b","2");
map.put("c","1");
request.setAttribute("map", map);
%>
${map["a"] }
${map.a }<br>
el表达式运算:<br>
<%
request.setAttribute("a", "1");
request.setAttribute("b", 1);
request.setAttribute("c", 2);
request.setAttribute("d", "1");
%>
加法:${a+c }<br>
判断是否相等:1${a==d }
</body>
</html>