JSP

一.JSP简介

JSP: Java Server Page SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。它相比 html 而言, html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。相比 servlet 而言, servlet 很难对数据进行排版,而 jsp 除了可以用 java代码产生动态数 据的同时,也很容易对数据进行排版。人们逐渐把 servlet 作为 web 应用中的控制器组件来使用, 而把 JSP 技术作为数据显示模板来使用.

其实 Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候, Jsp 引擎都会将这个 Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。


 

二.基础语法

1. 注释

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

<%@ 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>注释</title>
</head>
<body>

<pre>
	JSP有三种注释,分为两类:
		显式注释:
			客户端可以看到注释
				继承HTML风格的注释	&lt;!-- html风格的注释 --&gt;   <!-- html风格的注释 -->
		隐式注释:
			客户端无法看到注释
				1、JSP自己的注释	&lt;%-- JSP自己的注释 --%&gt;	<%-- JSP自己的注释 --%>
				2、继承JAVA风格的注释	// 单行注释	/* 多行注释 */
	
	<!-- java小脚本 -->
	<%
		// 定义变量
		int a = 1;
		/* 多行注释 */
	%>	
</pre>

</body>
</html>

2. Scriptlet

Scriptlet(脚本小程序), 所有嵌入在 HTML代码中的 Java 程序都必须使用 Scriptlet 标记出来。在 JSP 中一共有三种 Scriptlet 代码:
            第一种:
                     <%  %>
                     java脚本段,可以定义局部变量,编写java语句。
                     java代码会在被编译后的servlet的service方法中
            第二种:
                   <%!  %>
                   声明,可以声明全局变量、方法、类等
                   java代码会在被编译后的servlet的类体中
            第三种:
                  <%=  %>
                 输出内容,可以输出变量或表达式
                 java代码会在被编译后的servlet的service方法中
 

<%@ 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>Scriptlet</title>
</head>
<body>

<!-- &lt;%  %&gt; java脚本段 -->
<%
	// 定义局部变量
	int a = 1;
	// 输出内容(浏览器页面中显示)
	out.print(a);
		
%>

<%!
	// 定义全局变量
	int b = 10;
%>

<%
	// 输出内容(浏览器页面中显示)
	out.print(b);

	// 设置域对象
	request.setAttribute("uname", "zhangsan");
	request.setAttribute("uname2", "lisi");
	
	// 获取域对象
	String uname = (String)request.getAttribute("uname");
	out.println(uname);
	
%>

<%=100 %> &nbsp;
<%=b %>&nbsp;
<%=a+b %>&nbsp;
<%=uname %>&nbsp;
<%=request.getAttribute("uname2") %>

</body>
</html>

3. JSP 的指令标签

page指令

 格式:
                    <%@指令名称  属性名=属性值   属性名=属性值   %>  多个属性之间用空格分隔       

language="java":当前使用java语言,目前只有JAVA语言
            contentType="text/html; charset=UTF-8":设置页面的响应类型及编码
            pageEncoding="UTF-8":页面编码
            import:导包

        
          注意:
            1、页面编码:
                JSP的页面编码首先会去找contentType中charset的值,如果charset不存在则去找pageEncoding的编码。
                如果pageEncoding也不存在,则使用默认编码ISO-8859-1。

            2、指令标签的属性:
                除了import属性之外,其他属性只能被设置一次

include指令 静态包含

 格式:
                  <%@include  file="要包含的文件路径"   %>
            注意:
                  1、静态包含是直接将被包含的页面加载到当前页面中
                  2、jsp被编译后文件的都会生成一个servlet的service方法中,所以不能有同名变量
                  3、设置file属性值时,路径如果写错,会报错
                  4、被编译后只生成一个源码文件
                  5、如果出现同名变量会报错   Duplicate local variable a

        
         优缺点:
                  运行效率会稍微高一点点
                  耦合度高,不灵活
                                 

  taglib 导入标签库 

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

4. JSP 动作标签

a.include 动态包含   

                    格式:
                               <jsp:include page="被包含的文件路径" &gt;&lt;/jsp:include>
                    注意1:
                             1、动态包含相当于方法的调用,两个页面是独立的
                             2、可以有同名变量
                             3、会生成对应数量的源码文件
                             4、动态包含是双标签
                             5、降低耦合度,比较灵活

                   注意2:
                            1、动态包含可以传递参数 <jsp:param value="参数值" name="参数名"/>
                                    jsp:param参数中的value可以通过表达式来设置,name属性不支持表达式
                                    如果name属性设置了表达式,会报错
The name attribute of the jsp:param standard action does not accept any expressions
                      2、如果动态包含不需要传递参数,jsp:include双标签之间,不要写任何内容,包括空格,否则会报错  Expecting "jsp:param" standard action with "name" and "value" attributes

<%@ 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>include动态包含</title>
</head>
<body>

	<%
		int a = 1;
		String value = "lisi";
	%>

	<!-- include动态包含 -->
	<%-- <jsp:include page="jsp01.jsp"></jsp:include> --%>
	
	<!-- include动态包含 传递参数-->
	<%-- <jsp:include page="jsp01.jsp">
		<jsp:param value="zhangsan" name="uname"/>
	</jsp:include> --%>
	
	<%-- <jsp:include page="jsp01.jsp">
		<jsp:param value="<%=value %>" name="uname"/>
	</jsp:include> --%>
	
	<!-- 如果动态包含不需要传递参数,jsp:include双标签之间,不要写任何内容,包括空格,否则会报错  -->
	<%-- <jsp:include page="jsp01.jsp">  </jsp:include> --%>

</body>
</html>

5. 九大内置对象

   1>.request 对象

         request 对象是 javax.servlet.httpServletRequest 类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过 HTTP 协议传送到服务器的数据。(包括头信息. 系统信息. 请求方式以及请求参数等)。 request 对象的作用域为一次请求。

   2>.response 对象

          response 代表的是对客户端的响应,主要是将 JSP 容器处理过的对象传回到客户端。 response 对象也具有作用域,它只在 JSP 页面内有效。

   3>.session 对象

          session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 session 对象,用于保存该用户的信息,跟踪用户的操作状态。session 对象内部使用 Map 类来保存数据,因此保存数据的格式为“Key/value”。 session 对象的 value 可以是复杂的对象类型,而不仅仅局限于字符串类型。

   4>.application 对象

         application 对象可将信息保存在服务器中,直到服务器关闭,否则application 对象中保存的信息会在整个应用中都有效。
与 session 对象相比, application 对象生命周期更长,
类似于系统的“全局变量”

   5>.out 对象

         out 对象用于在 Web 浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

   6>.pageContext 对象

         pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的 out. request. reponse. session. application 等对象。pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用 pageContext 对象。

   7>.config 对象

           config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象的 getServletConfig() 方法可以获取一个 config 对象。当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给这个Servlet。开发者可以在 web.xml 文件中为应用程序环境中的 Servlet 程序和 JSP 页面提供初始化参数。

   8>.page 对象

         page 对象代表 JSP 本身,只有在 JSP 页面内才是合法的。 page 隐含对象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的 this 指针。

   9>.exception 对象

         exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true"的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。excepation 对象和 Java 的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象
 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="false" %>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>九大内置对象</title>
</head>
<body>
	<%
		// request作用域,只在一次请求中有效
		request.setAttribute("uname", "zhangsan");
		response.setHeader("name", "lisi");
		//session作用域,在一次会话中有效
		session.setAttribute("uname2", "wangwu");
		// servletContext作用域,在整个项目中都有效
		application.setAttribute("userName", "admin");
		// page作用域,只在当前jsp页面有效
		pageContext.setAttribute("uname3", "zhaoliu");
		// 设置指定域对象的值(四个范围:page、request、session、application)
		pageContext.setAttribute("uname3", "zhaoliu2", PageContext.SESSION_SCOPE);
		// 配置对象 通过servletConfig获取servletContext对象
		ServletContext servletContext = config.getServletContext();
		// out 输出
		out.write("<h1>Hello</h1>");
		// page对象
		out.write(page.getClass().toString());
		// exception 对象  只要在jsp页面中设置了isErrorPage="true"时,才能使用
		// exception.getMessage();
				
		// 如果报错,跳转到统一处理错误的页面  需要在当前jsp设置errorPage="错误处理页面的路径"
		// 会报错
		int a  = 2/0;
		
	%>
	<br>
	
	<%=request.getAttribute("uname") %>
	
	<br>
	
	<%=pageContext.getAttribute("uname3",PageContext.PAGE_SCOPE) %>
	
	<br>
	
	<%=pageContext.getAttribute("uname3",PageContext.SESSION_SCOPE) %>

</body>
</html>

三.EL 表达式

1. EL 语法和使用

语法结构非常简单: ${expressio}
                EL 表达式一般操作的都是域对象中的数据,操作不了局部变量。域对象的概念在 JSP 中一共有四个: pageContext, request, session, application范围依次是,本页面,一次请求, 一次会话,整个应用程序。而 EL 默认的查找方式为从小到大查找,找到即可。当域对象全 找完了还未找到则返回空字符串””。当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的
空间对象,分别是: pageScope, requestScope, sessionScope, applicationScope。(范围依次增大)

el表达式
                   格式:${域对象的name属性值}
                  取值方式:从小到大取值,page、request、session、application。
                      如果找到就显示,没有找到就继续往上找,找到为止。
                      如果到application都未找到,则显示空字符串。
                      如果需要取到指定域范围的值,可以设置对应的域范围(pageScope、requestScope、sessionScope、applicationScope)

           注意:1.el表达式一般只操作域对象,无法操作变量

          2、获取实体类的属性时,该属性必须要有get方法  对象名.属性名  (对象名指的是存在作用域中的key值)
                     3、获取集合中的值时,可以通过下标获取   域对象名称[下标]
                         判断域对象的值是否为空(不为null也不为空)  ${empty  域对象名称}
                        判断域对象的值是否不为空 ${!empty  域对象名称}
                        获取集合中的size  ${域对象名称.size()}

定义一个user类

package com.shsxt.po;

import java.util.List;

public class User {

	private String userName;
	private String userPwd;
	private Integer userAge;
	private boolean userSex;
	private List<String> nickNames;
	
	public User(String userName, String userPwd, Integer userAge, boolean userSex) {
		super();
		this.userName = userName;
		this.userPwd = userPwd;
		this.userAge = userAge;
		this.userSex = userSex;
	}
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPwd() {
		return userPwd;
	}
	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}
	public Integer getUserAge() {
		return userAge;
	}
	public void setUserAge(Integer userAge) {
		this.userAge = userAge;
	}
	public boolean isUserSex() {
		return userSex;
	}
	public void setUserSex(boolean userSex) {
		this.userSex = userSex;
	}

	public List<String> getNickNames() {
		return nickNames;
	}

	public void setNickNames(List<String> nickNames) {
		this.nickNames = nickNames;
	}
	
}

获取值

<%@ 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>
	<%
	
		// page作用域,只在当前jsp页面有效
		pageContext.setAttribute("uname", "zhaoliu");
		// request作用域,只在一次请求中有效
		request.setAttribute("uname", "zhangsan");
		//session作用域,在一次会话中有效
		session.setAttribute("uname", "wangwu");
		// servletContext作用域,在整个项目中都有效
		application.setAttribute("uname", "admin");
		
		request.setAttribute("uname", "tianqi");
		
		// 设置指定域对象的值(四个范围:page、request、session、application)
		pageContext.setAttribute("uname3", "zhaoliu2", PageContext.SESSION_SCOPE);
		
		int a = 10;
	%>
	
	 
	 ${uname }  <br>  <!-- zhaoliu  -->
	 <%=pageContext.getAttribute("uname") %> <!-- zhaoliu  -->  <!-- 默认是page域对象 --><br>
	 ${upwd }  <br> <!-- 空字符串""  --><br>
	 <%=pageContext.getAttribute("upwd") %><!-- null --><br>
	 ${sessionScope.uname }<!-- wangwu   获取的是sessio作用域中的uname --><br>
	 
	 ${100 }  <br>  <!-- 100 -->
	 
	 ${a }  <br>  <!-- 无法操作变量,会去域对象中查找key值是a的域对象  -->
</body>
</html>

2. EL 运算      

      1、两个不存在的域对象(数值型)相加,值为0
                 2、一个存在(数值型),一个不存在,值为存在的那个
                 3、两个非数字型的字符串相加,会报错

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.shsxt.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>
	<%
		List<String> nickNames = new ArrayList<>();
		nickNames.add("老黑");
		nickNames.add("小白");
		User user = new User("zhangsan","zhangsan666",18,true);
		user.setNickNames(nickNames);
		// 将user对象设置到request域对象中
		request.setAttribute("userObject", user);
		
	%>
		 
	 ${userObject } <br>
	 ${userObject.userName }<br>
	 ${userObject.userAge }<br>
	 ${userObject.userSex }<br>
	 ${userObject.nickNames }<br>
	 ${userObject.nickNames[0] }<br>
	 
	 <br><hr><br>
	 
	 <%
		 List<String> list = new ArrayList<String>();
		 list.add("aaa");
		 list.add("bbb");
		 list.add("ccc");
		 request.setAttribute("list", list);
		 
		 List<String> list3 = new ArrayList<String>();
		 request.setAttribute("list3", list3);
	 %>
	 
	 ${list } <br>
	 ${list2 } <br>
	 ${list[0] } <br>
	 ${list2[0] } <br>
	 ${empty list } <br> <!-- false -->
	 ${empty list2 } <br> <!-- true -->
	 ${empty list3 } <br> <!-- true -->
	 ${list.size() } <br> <!-- 3 -->
	  ${list3.size() } <br> <!-- 0 -->
	 ${list2.size() } <br> <!--空字符串 -->
	 
	 <br><hr><br>
	 <%
		Map map = new HashMap();
		map.put("aaa", "111");
		map.put("bbb", 2222);
		map.put("ccc-a", 333);
		request.setAttribute("map", map);
	%>
	 ${map } <br>
	 ${map.aaa } <br>
	 ${map['bbb'] } <br>
	 ${empty map } <br>
	 ${!empty map } <br>
	 	 
	 <br><hr><br>
	 
	 <%
		 int num1  =10; 
		 int num2 = 20;
		 String aa = "str";
		 String bb = "str2";
		 String cc = "str";
		 		 
		 request.setAttribute("num1", num1);
		 request.setAttribute("num2", num2);
		 request.setAttribute("aa", aa);
		 request.setAttribute("bb", bb);
		 request.setAttribute("cc", cc);
		 
	 %>
	 
	 ${a+b } <br> 	<!-- 0 -->
	 ${num1+ b } <br> <!-- 10 -->
	 <%-- ${aa + bb } --%> <br> <!-- 两个非数字型的字符串相加,会报错-->
	 ${"1" + "1" } <br> <!-- 10 -->
	 ${num1 - num2 }<br> <!-- -10 -->
	 ${num1 * num2 }<br> <!-- 200 -->
	 ${num1 / num2 }<br> <!-- 0.5 -->
	 ${num1 div num2 }<br> <!-- 0.5 -->
	 	 	 
	 ${num1 > num2 }<br> <!-- false -->
	 ${num1 >= num2 }<br> <!-- false -->
	 ${num1 < num2 }<br> <!-- true -->
	 ${num1 <= num2 }<br> <!-- true -->
	 ${num1 <= 10 }<br> <!-- true -->
	 
	 ${num1 == num2 }<br> <!-- false -->
	 <br>
	 ${aa == bb } <!-- false  -->
	 ${aa == cc } <!-- true  -->
	 ${aa == "aa" } <!-- false  -->
	 	 
	 <br>
	 
	 ${list.size() > 0 }
	 
</body>
</html>


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值