JSP

一、介绍
JSP:Java Server Page SUN 公司提供的动态网页编程技术,是 Java Web 服
务器端的动态资源。
二、配置
在新建JSP时需要改一些需求
window------Preferences-------Templatest
JSP

JSP
保存关闭
三、基础语法
1.注释
JSP注释

  • 显式注释

     	在客户端可以看到的注释
     	1)继承HTML风格的注释    &lt;!-- HTML注释 --&gt;		<!-- 这是HTML注释 -->
    
  • 隐式注释

     	在客户端不可以看到的注释
     	1)、JSP自己的注释    &lt;%-- JSP注释-- % &gt;   <%-- 这是JSP注释 --%>
     	2)、继承Java风格的注释		// 单行注释    /*多行注释*/
    

2.Scriptlet
Scriptlet(脚本小程序),所有嵌入在 HTML 代码中的 Java 程序。
在 JSP 中一共有三种 Scriptlet 代码:都必须使用 Scriptlet 标记出来
1)、java脚本段

语法:&lt;% // java脚本段  %&gt;

特点:可以定义局部变量,编写java语句;被编译之后会生成在service方法体中
2)、声明

语法:&lt;%! // 声明全局变量  %&gt;

特点:可以声明全局变量,方法等;被编译之后生成在servlet类体中

3)、输出

语法:&lt;%= %&gt;

特点:可以输出变量、表达式或字面量;被编译之后生成在service方法体中;相当于out.print()输出

<%@ 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>script脚本小程序</title>
</head>
<body>
<!-- java脚本段 -->
<%
	// 定义变量,编写java语句
	String str = "Hello JSP";
	// 输出到控制台
	System.out.println(str);
	// 输出到浏览器
	out.print(str);
	
	if (str.length() > 3) {
		System.out.println("str的长度为:" + str.length());
	}
	
%>

<!-- 声明  -->
<%!
 	// 声明全局变量
	int a = 20;
%>

<!-- 输出表达式 -->
<%=a %> <br/>
<%=str %>
</body>
</html>

JSP

JSP

3.JSP的指令标签
1)page指令
格式:<%@page 属性=“属性值” 属性=“属性值” %>
常用属性:
language:支持的语言,当前只支持java
contentType:响应类型及编码格式
pageEncoding:编码
import:导包,只有import这个属性可以多次设置,其他属性只能设置一次
isErrorPage:当前页面是否是处理报错的页面,默认是false
errorPage:当页面报错时该跳转到什么页面

	注:JSP页面的编码以contentType中的charset的值为准,如果未设置charset值,则以pageEncoding的属性值为准;如果都没有,则默认ISO-8859-1
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.List" isErrorPage="false" errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>page指令</title>
</head>
<body>
<pre>

<%

	List<String> list = new ArrayList<>();

	int a = 1/0;

%>

</body>
</html>

如果报错遇到404或者500时,可以调到下面这个页面
JSP
2)include静态包含
格式:<%@include file=“文件的路径” %>相对路径
特点:相当于将包含的页面中的内容直接直接非复制粘贴;最终只会生成一个java文件;不能有同名变量。
优缺点:运行效率高一点点。耦合性较高,不够灵活。

<%@ 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>

	<div style="height: 500px;width:800px;background-color: pink">
		<div style="height: 100px;background-color: gray;">
			<%@include file="top.jsp" %>
		</div>
		
		<div style="width: 60px;height:400px;background-color: skyblue;float: left">
			<%@include file="left.jsp" %>
		</div>
		<div style="width: 740px;height:400px;background-color: green;float: left">
			<h2>我是主页面</h2>
		</div>
	</div>
	
	<%
	
		int b =10;
	%>
</body>
</html>

JSP

3)include动态包含
include动态包含
无参:
格式:<jsp:include page=“包含的页面路径”></jsp:include>
有参
<jsp:include page=“包含的页面路径”>
<jsp:param value=“参数值” name=“参数名”/>
</jsp:include>
特点:相当于方法的调用,会生成多个java文件;可以出现同名变量

		注:
			1、<jsp:include>双标签中不能包含任何内容,包括换行和空格,除非有参数
			2、<jsp:param>的value属性值支持表达式,name属性值不支持
				The name attribute of the jsp:param standard action does not accept any expressions
<%@ 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>
 
 <%
 	String upwd = "123456";
 
 %>
 <div style="height: 500px;width:800px;background-color: pink">
		<div style="height: 100px;background-color: gray;">
			<jsp:include page="top.jsp">
				<jsp:param value="zhangsan" name="uname"/>
				<jsp:param value="<%=upwd %>" name="upwd"/>
			</jsp:include>
		</div>
		
		<div style="width: 60px;height:400px;background-color: skyblue;float: left">
			<jsp:include page="left.jsp"></jsp:include>
		</div>
		<div style="width: 740px;height:400px;background-color: green;float: left">
			<h2>我是主页面</h2>
		</div>
	</div>
</body>
</html>

JSP
4.九大内置对象
JSP四大域对象
1)pageContext.setAttribute(“uname”, “zhangsan”);
2)request.setAttribute(“uname”, “lisi”);
3)session.setAttribute(“uname”, “wangwu”);
4)application.setAttribute(“uname”, “zhaoliu”);

两个输出对象
5)out.print(“Hello”);
response.getWriter().write(“Hello!”);

/配置对象
out.print(config.getServletName());

当前jsp本身
6)page
page 隐含对
象本质上包含当前 Servlet 接口引用的变量,类似于 Java 编程中的 this 指针。

7)config
config 对象的主要作用是取得服务器的配置信息。通过 pageConext 对象
的 getServletConfig() 方法可以获取一个 config 对象。
当一个 Servlet 初始化时,容器把某些信息通过 config 对象传递给这个
Servlet。
8)pageContext
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP
页面的 out. request. reponse. session. application 等对象。
pageContext 对象的创建和初始化都是由容器来完成的,在 JSP 页面中可
以直接使用 pageContext 对象。
9)exception
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true”
的页面中才可以被使用,在一般的 JSP 页面中使用该对象将无法编译 JSP 文件。
四、EL表达式
EL表达式
语法:${域对象的key值}

注意:
		1、el表达式一般操作的是域对象中的值,无法操作局部变量
		2、el的取值范围有4个:pageContext、request、session、application,分别代表当前页、一次请求、一次会话、整个应用程序
		3、el表达式默认从小范围到大范围取值,如果取到值则显示,未取到则继续往大范围找,找到即止;如果最终未找到,则显示空字符串""
		4、获取指定域对象范围的值,可以通过pageScope、requestScope、sessionScope、applicationScope
		5、el表达式获取JavaBean中的属性时,属性需要提供get方法(javax.el.PropertyNotFoundException: Property 'uname' not readable on type com.shsxt.po.User)
<%@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>
 <%
 	pageContext.setAttribute("uname", "zhangsan");
	request.setAttribute("uname", "lisi");
	session.setAttribute("uname", "wangwu");
	application.setAttribute("uname", "zhaoliu");
	
	// 通过pageContext对象设置指定域范围的值
	pageContext.setAttribute("a", "aaa", PageContext.REQUEST_SCOPE);
	
	// 将user对象存到作用域中
	User user = new User();
	user.setUname("admin");
	user.setUpwd("123456");
	request.setAttribute("user", user);
	
	// 变量
	String str = "周杰伦";
	
	// List集合
	List<String> list = new ArrayList<>();
	request.setAttribute("list", list);
	
	List<String> list2 = new ArrayList<>();
	list2.add("aaa");
	list2.add("bbb");
	list2.add("ccc");
	list2.add("ddd");
	request.setAttribute("list2", list2);

	// Map
	Map<String,Object> map = new HashMap<String,Object>();
	map.put("aaa", "111");
	map.put("bbb", 2222);
	map.put("ccc-a", 333);
	request.setAttribute("map", map);
	
	
	request.setAttribute("num1", 10);
	request.setAttribute("num2", 50);
	
	request.setAttribute("str1", "aaa");
	request.setAttribute("str2", "bbb");
	request.setAttribute("str3", "ccc");
 
 %>
 
 <h3>获取域对象的值及判断</h3>
 <h6>pageContext范围:${uname }</h6>
 <h6>获取指定范围的值:${requestScope.uname }</h6>
 <h6>获取JavaBean的值:${user }</h6>
 <h6>获取JavaBean的指定属性值:${user.uname }</h6>
 <h6>获取变量的值:${str }</h6>
 <h6>判断JavaBean对象是否为空:${empty user }</h6>
 <h6>判断域对象是否不为空:${!empty str }</h6>
 <h6>判断List集合是否为空且长度是否小于1:${empty list }</h6>
 <h6>判断List集合是否为空且长度是否小于1:${empty list2 }</h6>
 <h6>得到List集合的长度:${list2.size() }</h6>
 <h6>得到字符串的长度:${uname.length() }</h6>
 <h6>获取List集合中指定下标的值:${list2[2] }</h6>
 <h6>获取Map中指定key的值:${map.bbb }</h6>
 <h6>获取Map中指定key的值:${map["ccc-a"] }</h6>
 <h3>EL运算</h3>
 <h6>加法:${1+1 } -- ${num1 + 10 } --- ${num1+num2 }</h6>
 <h6>除法:${num2 / num1} --- ${num2 div num1 }</h6>
 <h6>判断:${num1 > 0 } -- ${num2 > num1 }  -- ${num1 + 10 > num2 } -- ${num1 + 10 >= num2 } -- ${num1 + 10 <= num2 + 1 }</h6>
 <h6>等值比较:${num1 == num2 } -- ${str1 == str2 } -- ${str1 eq str3 }</h6>
 <h6>字符串截取:${str1.substring(0,1) }</h6>
 
</body>
</html>