七、jsp基础(一)--基础语法

一、jsp的基础

1.1 jsp的引入


Servlet的作用: 用java语言开发动态资源的技术!!!

Jsp的作用:用java语言(+html语言)开发动态资源的技术!!! 

		  1.Jsp就是servlet!!!
		  2.JSP本身就是简化的Servlet的设计。它是由sun公司倡导,许多
		    公司参与一起建立的一种动态页面技术标准。
		  3.由于html只能写静态资源,而Servlet可以写动态资源,但是与
		    浏览器客户端交互太过复杂。所以引入了JSP。既可以写JAVA代码
		    ,也可以写Html。

					

1.2 jsp的特点


	1)jsp的运行必须交给tomcat服务器!!!!
		   tomcat的work目录: tomcat服务器存放jsp运行时的临时文件
	
	2)jsp页面既可以写 html 代码,也可以写java代码。
		  (html页面不能写java代码 。而jsp页面可以写java代码)
	

1.3 jsp的执行过程

tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法
					tomcat的work目录下存放jsp运行时的临时文件!!		
	4.4 Jsp的执行过程

		问题: 访问http://localhost:8080/day12/01.hello.jsp  如何显示效果?

			1)访问到01.hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
					(01.hello.jsp   ->   _01_hello_jsp.java) (翻译)

			2)tomcat服务器把java源文件编译成class字节码文件 (编译)
					(_01_hello_jsp.java  ->  _01_hello_jsp.class)

			3)tomcat服务器构造_01_hello_jsp类对象
			4)tomcat服务器调用_01_hello_jsp类里面方法,返回内容显示到浏览器。

	第一次访问jsp:
				走(1)(2)(3)(4)
	第n次访问jsp:
				走(4)
	
注意:
	 1)第一次访问jsp要走翻译和编译的过程,第二次访问jsp,直接调用方法。
	 2)jsp文件修改了或jsp的临时文件被删除了,要重新走翻译(1)和编译(2)的过程
		

	

1.4 jsp的实质

## jsp翻译的java文件:
	
	public final class _01_hello_jsp 
		extends 	org.apache.jasper.runtime.HttpJspBase
        implements  org.apache.jasper.runtime.JspSourceDependent {
		....
	}
	
	HttpJspBase类:
	public abstract class org.apache.jasper.runtime.HttpJspBase 
			extends javax.servlet.http.HttpServlet 
			implements javax.servlet.jsp.HttpJspPage {
		...
	}
	
	

		
结论:
	
	1.jsp翻译成java文件。jsp类继承HttpJspBase类,而HttpJspBase类又继承
	了HttpServlet类。所以jsp就是Servlet.
	
	2.servlet的技术可以用在jsp程序中
	
	3.jsp的技术并不是全部适用于servlet程序!
	(Servlet是原理基础,jsp在Servlet基础上扩展了一些技术。所以Servlet可以说是jsp的子集)
	

1.5 jsp的生命周期

jsp就是servlet。

servlet生命周期

	1.构造方法(第一次访问)
	2.有参的init方法(第一次访问)
	3.service方法
	4.destory方法

Jsp的生命周期

    1)翻译: jsp->java文件
	2)编译: java文件->class文件(servlet程序)
	3)构造方法(第1次访问)
	4)init方法(第1次访问):_jspInit()
	5)service方法:_jspService()
	6)destroy方法:_jspDestroy()

Jsp的生命周期详解
在这里插入图片描述

	1.用户第一访问jsp,tomcat首先会把jsp翻译成java文件。
	2.将java文件编译成字节码文件
	3.调用构造方法创建jsp对象。
	4.调用_jspInit方法,初始化jsp对象、
	5.调用_jspService方法。

二、jsp的语法


1)jsp表达式:<%=变量或表达式%> 向浏览器输出变量或表达式计算的结果
2)jsp脚本: <% java代码 %> 执行java代码  原理:翻译到_jspService()方法中
3)jsp声明: <%! 变量或方法 %> 声明jsp的成员变量或成员方法
4)jsp注释: <%!-- jsp注释 --%> 用于注释jsp代码,不会翻译到java文件中,也不会执行。

2.1 jsp的模板

			jsp页面中的html代码就是jsp的模板

2.2 jsp的表达式

jsp的表达式

		语法:<%=变量或表达式%>
		
		作用: 向浏览器输出变量的值或表达式计算的结果
		
		注意:		
			1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
			2)表达式后面不需要带分号结束。
		
		原理:
			jsp表达式会被服务器翻译成  out.write(表达式)。
			如 <%=a+b>  会被翻译成 out.write(a+b)
			  <%=name>  会被翻译成 out.write(name)

jsp的表达式的原理
jsp的部分代码:

<body>
<%
   String name="12";
   int i=12;
   int b=12;
%>
<%=name %>
<%=i+b %>
</body>

上述jsp代码会被翻译成一下代码:

public void _jspService(final javax.servlet.http.HttpServletRequest request, final 
javax.servlet.http.HttpServletResponse response)
   { 
    try {
      response.setContentType("text/html; charset=ISO-8859-1");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd

\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\r\n");

	  String name="12";
	  int i=12;
	  int b=12;

      out.write("\r\n");
      out.write("\r\n");
      out.print(i+b );
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }

例子:

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%
	String name="12";
	int i=12;
	int b=12;
%>

<%=name %>
<%=i+b %>

</body>
</html>

2.3 jsp的脚本

	
	语法:<%java代码 %>
	
	作用: 执行java代码	
	
	原理:
		1)脚本中java代码会被原封不动拷贝到_jspService方法中执行。
		

例子:
打印九九乘法表

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>


<%
	String str="";
	for(int i=1;i<10;i++){
		for(int j=1;j<=i;j++){
%>
		<%=i%>*<%=j%>=<%=i*j %>
<% 
		}
%>
		<br/>
<% 		
	}
%>


</body>
</html>

在这里插入图片描述

2.4 jsp的声明

	语法:<%! 变量或方法 %>
	
	作用: 声明jsp的变量或方法
	
	注意:
		1)变量翻译成成员变量,
		   方法翻译成成员方法。

例子:

扫描二维码关注公众号,回复: 9248967 查看本文章
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%! int a=12 ;%>

<%! 
	public void read(){
		System.out.println("fuck");
		
	} 
%>
</body>

翻译后的部分java文件

public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

   int a=12 ;
 
	public void read(){
		System.out.println("fuck");
		
	} 

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();
	
  ...

2.5 jsp的注释

	语法: <%!--  jsp注释  --%>
	
	注意;
		1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。

三、jsp的三大指令

3.1 include指令(静态包含)

	语法: <%@include file="common/header.jsp"%>
	
	作用: 在当前页面用于包含其他页面
	
	注意:
		1)静态包含:被包含页面的内容加入到包含的页面中,合并翻
			         译成一个java源文件,然后编译执行。

		   原理是把被包含的页面(header.jsp)的内容翻译到包含
		   页面(index.jsp)中,合并成翻译成一个java源文件,再编
		   译运行!!这种包含叫静态包含(源码包含)

			
		   
		2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、body)	

例子:
NewFile.jsp包含了top.jsp
NewFile.jsp

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
test

 <%@include file="top.jsp"%>


</body>
</html>

top.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<h1>top</h1>
	<hr/>
</body>
</html>

在这里插入图片描述

3.2 page指令

<%@ page 
		language="java"   --告诉服务器使用什么动态语言来翻译jsp文件
		import="java.util.*" --告诉服务器java文件使用什么包
									导入包,多个包之间用逗号分割
		pageEncoding="utf-8"  --告诉服务器使用什么编码表翻译jsp文件(翻译成java文件使用什么码表)
	    contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
			注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
		errorPage="error.jsp"
		isErrorPage="false"
		buffer="8kb"   手动指定缓冲区大小
		session="true"
		isELIgnored="false"
 %>

常用:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    

3.2.1 jsp的乱码问题解决方式

在这里插入图片描述

<%@ page language="java" 
	contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" %>


解析:
	1.jsp保存到硬盘时,按照默认编辑器默认编码表进行编码。
	2.jsp翻译成java文件,按照 pageEncoding="utf-8"指定的码表进行编码。
	3.java文件编译成class字节码文件。
	4.浏览器获取jsp资源文件,按照contentType="text/html; charset=utf-8"指定的码表解析资源。



注意:
	1.contentType="text/html; charset=utf-8" 属性可以省略不写。会直接参考pageEncoding="utf-8" 的值。
	
	可以只设置pageEncoding="utf-8"属性,不设置contentType="text/html; charset=utf-8" 属性。
	原因:如果设置了pageEncoding="utf-8"属性,jsp在翻译java文件时,会自动设置 contentType="text/html; charset=utf-8"  属性。

	2.在eclipse中,直接修改jsp中pageEncoding="utf-8"的值,保存jsp。此时会按照pageEncoding="utf-8"指定的码表进行保存jsp。
	
	3.pageEncoding="utf-8"
	  可以指定保存jsp文件的编码表(在eclispe工具中)
	  可以指定浏览器解析jsp资源时使用的码表。
	
	  设置jsp编码
	    ====》<%@ page language="java" 
				  	  pageEncoding="utf-8" %>
	    	
3.2.2 设置错误页面

由于jsp中可以写java程序,所以有可能出现异常。如果任由jsp爆出异常,则界面不太友好。所以才有了异常页面设置。jsp的错误页面跳转有两种方式,一种是局部设置,另一种是全局设置。

方式一:局部设置

	errorPage:  指定当前jsp页面的错误处理页面。
	
	isErorrPage:  指定当前页面是否为错误处理页面。
				false,不是错误处理页面,则不能使用								exception内置对象;
				true,是错误处理页面,可以使用exception内置对象。
					

例子:
NewFile.jsp:

 设置jsp发生异常跳转到的错误页面:
 <%@ page language="java"   errorPage="error.jsp"%>
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"
    errorPage="error.jsp" 
    %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%
Integer name=12;
out.print(name/0);
	
%>

</body>
</html>

error.jsp

 设置错误页面
   <%@ page language="java"
    	   pageEncoding="utf-8"
           isErrorPage="true"
    %>
	
    isErrorPage="true",可以使用内置对象exception对象
    isErrorPage="false",不可以使用内置对象exception对象
<%@ page language="java"
    pageEncoding="utf-8"
    isErrorPage="true"
    %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	错误处理页面
		<%=exception.getMessage() %>
</body>
</html>

访问NewFile.jsp,发生异常,就会自动跳转到error.jsp页面。
在这里插入图片描述

方式二:全局设置

在web.xml设置jsp异常跳转页面

  <!-- 全局错误处理页面配置 -->
  <error-page>
  	<error-code>500</error-code>
  	<location>/common/500.jsp</location>
  </error-page>
  <error-page>
  	<error-code>404</error-code>
  	<location>/common/404.html</location>
  </error-page>

3.3 taglib指令

引入标签
 			<%@taglib uri="标签库声明文件tld文件的标记" prefix="前缀"%>
			
			prefix:标签的标识
			uri:标签资源

四、jsp的动作

	JSP的动作有很多,其中两个最常见,分别是forward和include
	1、forward
	跳转页面
			<jsp:forward page="/index.jsp"></jsp:forward>

	2、include
	包含页面
			<jsp:include page="./index2.jsp"></jsp:include>



	指令include和动作include的区别?
		
		jsp指令: <%@include file="common/header.jsp"%>	
		jsp动作:<jsp:include page="./index2.jsp"></jsp:include>
			

	1、静态包含和动态包含
		指令inludce又叫静态包含,动作include又叫动态包含。
		
	2、二者区别
	第一点:动态包含生成两个Java文件,静态包含生成一个Java文件。
	第二点:动态包含先运行再包含,静态包含是先包含再运行。
	第三点:动态包含总会检查被包含文件是否发生修改,能保证每次都是最新的。
			静态包含不会检查被包含文件是否发生修改,不能保证每次都是最新的。
	3、优缺点
	动态包含优点是能保证页面最新,缺点是占用资源大。经常用于包含动态页面。
	静态包含优点资源小,不一定能保证页面最新。经常适用于静态页面。

五、动态web项目的WEB-INF目录

	|--Web项目的根目录
			|------index.jsp
			|------NewFile.jsp
			|------WEB-INF (安全目录)
					 |---------classes目录(字节码)
					 |---------lib(jar包)
					 |---------web.xml

	WEB-INF目录是项目的安全目录,浏览器不能直接访问该目录下的资源。
	
	1.如果访问Servlet,只能通过web.xml配置的资源进行访问。
	2.如果是访问 WebRoot\index.jsp, 则浏览器可以直接访问。
	3.如果是访问WebRoot\WEB-INF\index.jap,则浏览器不能直接访问。
	  如果想访问该资源,则只能通过Servlet转发,进行访问。
	  

总结

Jsp基础
		1)Jsp的执行过程
			tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法
					tomcat的work目录下存放jsp运行时的临时文件!!
		2)Jsp语法:
			1)jsp表达式:<%=变量或表达式%> 向浏览器输出变量或表达式计算的结果
			2)jsp脚本: <% java代码 %> 执行java代码  原理:翻译到_jspService()方法中
			3)jsp声明: <%! 变量或方法 %> 声明jsp的成员变量或成员方法
			4)jsp注释: <%!-- jsp注释 --%> 用于注释jsp代码,不会翻译到java文件中,也不会执行。

		3)jsp的三大指令
				3.1 include指令:用于包含其他页面。原理:先合并再翻译,叫静态包含
				3.2 page指令:告诉tomcat服务器如何把jsp文件翻译成java文件
					 language: 翻译的动态语言。
					 import: 类导入
				jsp文件编码问题:
					pageEncoding: 告诉tomcat服务器使用什么编码翻译jsp文件(jsp->java文件)
					contentType: tomcat服务器发送给浏览器的数据编码(tomcat服务器->浏览器)

				 异常错误相关的:
					errorPage:  指定当前jsp页面的错误处理页面。
					isErorrPage:  指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用								exception内置对象;true,是错误处理页面,可以使用exception内置对象。
					
					配置全局的错误处理页面:
							
							  <!-- 全局错误处理页面配置 -->
							  <error-page>
							  	<error-code>500</error-code>
							  	<location>/common/500.jsp</location>
							  </error-page>
							  <error-page>
							  	<error-code>404</error-code>
							  	<location>/common/404.html</location>
							  </error-page>

					session:  是否开启session功能。false,不能用session内置对象;true,可以使用session内								置对象。
					buffer:  jsp页面的缓存区大小。
					isELIgnore: 是否忽略EL表达式。
发布了94 篇原创文章 · 获赞 0 · 访问量 656

猜你喜欢

转载自blog.csdn.net/weixin_45602227/article/details/103882403