前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javaWeb核心技术第九篇之JSP

javaWeb核心技术第九篇之JSP

作者头像
海仔
发布2019-08-26 18:21:27
6420
发布2019-08-26 18:21:27
举报
JSP:全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术.在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态
内容的显示.JSP文件的扩展名为.JSP;
	JSP技术所开发的Web应用程序是基于Java的,它可以用一种简捷而快速的方法从Java程序生成Web页面,使用上具有如下特征:
	1:跨平台:由于JSP是基于Java语音的,它可以使用JavaAPI,所有它也是跨平台的,可以应用于不同的系统中,如Windows,Linux等.
	2:业务代码相分离:在使用JSP技术开发Web应用时,可以将界面的开发与应用程序的开发分离开.
	3:组件重用:JSP中可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型,在JSP页面中,甚至在整个项目中,都可以
	重复使用这个JavaBean,同时,JavaBean也可以应用到其他Java应用程序中.
	4.预编译:预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译.编译好的代码将被保存,在用户下一次访问时,
	会直接执行编译好的代码.这样不仅节约了服务器的CPU资源,还大大的提升了客户端的访问速度.

	原理解释:
		1.jsp文件访问服务器的时候,就是访问服务器tomcat下的web.xml.
		2.执行一个Servlet<servlet-class>org.apache.jasper.servlet.jspServlet</servlet-class>
		3.这个Servlet将会把jsp转换成java文件.
		4.在tomcat的\work\Catalina\localhost\e66_day38\org\apache\jsp 产生一个java文件.
		5.将java文件编译成class.
		6.相当于访问a_hello.jsp执行了一个class文件.
		
	总结:jsp就是一个Servlet.
	
	因为:1.jsp生成的类 ,继承extends prg.apache.jasper.runtime.HttpJspBase.
		 2.extends org.apache.jasper.runtime.HttpJspBase又继承了extends HttpServlet.

	为什么有servlet还需要有jsp?
	
	Servlet:可以在java里嵌套html代码(以java代码为主);
	例如:response.getWriter().print(<a>);
	Jsp:可以在html中嵌套java代码(主体是html);
	例如:<a href=""><%=java代码%></a>.
	
	分工明确:各自实现自己的特点,业务代码相分离.

	脚本元素:
	作用:主要就是在jsp中嵌套java代码.
	Java一共分为三类:
		1.成员变量  声明方式  类体中.
		2.局部变量  for循环   方法体中
		3.参数  方法体中  并且 某一共括号中 service.findAll(username,password);
	<%  %>脚本  允许  方法体中的代码  最后被编译到service方法中.
	<% = %>输出  允许写参数   out.print(getUsername());
	<%!%>声明  成员变量  在类体中  

	例题:九九乘法表用表格的形式表示出来:
	<% 
		for(int x = 1 ; x <= 9 ; x++) {
	
			out.print("<tr>");
			String s = "";
		for(int y = 1 ; y <= x; y++) {
			s = x + " * " + y + " = " + x*y + "    ";
			out.print("<td>");
			out.print(s);
			out.print("</td>");
		}
			out.print("</tr>");
		}
	%>
	
	脚本元素面试题:
	<%=i%>     			2.输出5
	<% i++; %>			3.成员变量+1 --> this.i=6
	<% int i = 10; %>	4.定义局部变量 i=10
	<%=this.i%>			5.输出成员变量 --> this.i
	<%! int i=5;%>		1.声明成员变量 --> this.i = 5
	<% i++;%>			6.局部变量 +1 i=10;
	<%=i%>				7.输出 i=11
	
	在java文件中是这样显示的.
	public class test {
		private i = 5;
		public void show() {
			System.out.println(this.i);
			this.i++;
			i = 10;
			System.out.println(this.i);
			i++;
			System.out.println(i);
		}
	}
	
	注释:
	以后在写页面时,只用jsp注释.
	语法:<%-- --%>
	
	page指令:是jsp转换成servlet的依据.
	    编码组:(重要)
			pageEncoding:设置当前页面的编码(源文件);
			contentType:设置响应流的编码;
		缓存:(了解)
		    buffer:缓存的大小.
			autoFlush : 是否自动刷新(如果缓存满了 刷新给浏览器)
		
		out.print(任何数据类型)和System.out.println(任何数据类型");//都是输出的是一个字符串.所以一个字符占一个字节.

	jsp的错误处理机制(了解) 每一个jsp都需要配置
		errorPage: 指向一个专门处理错误的页面.
		isErrorPage: 表示是不是错误处理页面.
	
	Web中错误处理机制(扩展重要)
	    <error-page>
			<error-code>错误的代码 404</error-code>
			<location>/404.jsp</location>
		</error-page>
		
		<error-page>
			<exception-tupe>异常的类型</exception-tupe>
			<location>/类型.jsp</location>
		</error-page>
		
	其他:(了解)
	    session="true" 表示jsp页面可以直接使用session对象,只要是jsp需要支持session,第一次调用getSession.
		第一次访问jsp的时候,底层会调用getSession()这个方法,session被创建.
		
		language="java";
		表示:jsp支持的语音.
		impost=""
		    导入bao,alt+/
		
	lnclude:静态包含.可以将另外一个页面引入进来
		例如:<%@ include file="将要引入的页面" %>
	
		静态包含:在服务编译的时候,将两个页面生成一个Servlet,输出给浏览器.
		动态包含(动态元素) : 在服务器编译的时候,生成两个Servlet,最后输出给浏览器时,会合并输出.
			<jsp:include page="header.jsp"></jsp:include>
			
		使用时:动态和静态没有区别,要注意,变量声明和使用问题.
			
	Taglib:
		导入标签库:将一些规范导入到jsp页面,uri指的是规范的路径,prefix:指的是别名.
		<%@ taglib="http://java.sun.com/jsp/jstl/core" prefix="c"%>

	在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦.为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,
	它们是JSP默认创建的,可以直接在JSP页面中使用.
		
	九大内置对象:
		1.page 类型是Object 就是java中this对象.
		2.config 类型ServletConfig.
		3.application 类型ServletContext.
		4.request
		5.response
		6.session
		7.out ==>> getWriter()
		8.exception
		9.pageContext : 页面上下文根对象
	
	九大内置对象-out:
		//以后的开发 不能混搭使用
		//out表示的jsp的输出流
		out.print("a");
		//手动刷新
		//out.flush();
		//response.getWriter().print("x");//Servlet的输出流
		out.print("b");
		//字符流和字节流不可以同时使用.
		response.getOutputStream().print("xxxx");
		
	九大内置对象--pageContext
		pageContext:当前页面的上下文根对象.
			作用:
			    1:可以获得其他八个内置对象,传递参数有用,调用一个方法(pageContext);
					pageContext.getXxx()
				2:简化四个操作
					默认情况下 往page域中操作.
						setAttribute(name,value);
						getAttribute(name);
						
						removeAttribute(name)  特殊记忆,默认没有指定域,删除所有域数据.
						
					统一api
					pageContext.setAttribute(name,value,int scope) 常量,写死不会发生变化的,人家可以直接调用
					pageContext.getAttribute(name,scope);
					pageContext.removeAttribuet(name,scope);
					
			依次从四个域中获得数据:
				pageContext.findAttribute("name");
				取值的顺序:从小到大 page request session application.
				以后在往域中放数据时,一般不会取相同的name名称.
	
	 域:
		Servlet三个域对象:
			Request Session ServletContext;
		API:
			SetAttribute(String name,Object value);
			getAttribute(String name);
			removeAttribute();
		jsp的四个域对象:
			pageContext request session application;
		page域和page对象 没有关系:
			SetAttribute(String name,Object value);
			getAttribute(String name);
			removeAttribute();
		
		数据共享:
		Page:只能当前页面共享数据(相当于成员变量);
		Request:当前请求共享数据;
		Session:当前会话共享数据;
		Application:当前项目共享数据;

//表示设置value的值
Document.getElementById("id的值").value = "";
//表示
Document.getElementById("id的值").value = "";
//表示获得了所有的以"input"为标签开头的数组里面第一个索引的标签对象,并把这个标签设置成了"#ffo"颜色的背景色.
Document.getElementsByTagName("input")[0].style.backgroundColor="#ffo";
//表示获得了所有的属性name为"username"的数组里面的第一个索引的标签对象,并把这个标签对象设置成了"#ffo"
Document.getElementsByName("username")[0].style.backgroundColor="#ffo";

		EL表达式:是一门语言,主要是用来获得域中数据.
		EL表达式中内置了十一个对象,这些对象其实就是字符串.
			四大域 4 表示四个域而不是表示page request ..对象
				pageScope requestScope sessionScope applicationScope
				${对象.key}用的很少
			重点记${key} 以后开发中不会往每个域中设置相同的名称,底层对应的是pageContext.findAttribute()
			请求参数 2
				param paramValues
					可以获得请求的参数,对应的api getParameter() getParameterValues()
			请求头 2
				header headerValues
					可以获得请求头中的参数
			初始化参数 1
				initParam
					可以获得web.xml中全局初始化参数
			PageContext 1
				对应的就是jsp中的pageContext对象
			很重要:例如:${pageContext.request.contextPath}
			(重要)Cookie 1
				原始代码:new Cookie(name,value);
				获得	request.getCookies(),获得的是数组
				再次请求的cookie以map形式保存,map的key是cookie名称,cookie的值=cookie的对象
			案例:
				${cookie}<br/>
				${cookie.ns}<br/>
				${cookie.ns.name }<br/>
				${cookie.ns.value }<br/>
		
		十一个对象,可以从不同的位置获得数据:
			语法:
				${对象.key} 或者${对象['key']} 主要用来处理特殊字符串.
				例如:${param.username},${header['accept-encoding']}
				
				{key=value,key=value} map集合
				[L.......是数组   [........]list集合


		<h2>算数运算符</h2>
	<%-- 减号在el表达式中体现的就是减号  但如果想使用连接符- 使用特殊语法 ${对象['xxx-yyy']} --%>
	${1} <br/>
	${"1" + 1}<br/><%-- 会将字符串转换成数字类型 进行计算 --%>
	${'1' + 1}<br/><%-- el表达式没有字符概念 只有字符串 单引号和双引号一样  但建议写单引 --%>
	\${"a" + 1}<br/><%-- 报错 数字转换异常 --%>
	${a + 1 }<br/> <%-- el表达式 会从域中先获得数据 如果没有是空字符串 --%>
	<%
		pageContext.setAttribute("a", 18);
	%>
	${a + 1 }<br/> 
	
	${10/5}<br/>
	${10/3}<br/>
	${10 / 3}<br/>
	
	
	<h2>逻辑运算符</h2>  
	${true && false}
	${true || false}
	${!true}
	${not true}
	
	
	<h2>关系运算符</h2>
	${3 gt 2}
	${3 lt 2}
	${3 eq 2}
	${3 == 2}
	
	<h2>三元(目)运算符 </h2>
	三元的本质就是if <br/>
	<%-- ${条件 ? 条件成立 :条件不成立 }  后台的Servlet 往jsp传递数据 如果传递的flag = true || false--%>
	${3>2 ?"真的" : "假的"}
	<input type="checkbox" ${param.flag ? "checked" : ""} >
	
	
	
	<h2>empty 关键字</h2>
	<%-- empty 表示是否为空
			1.字符串是否为空字符串 ""
			2.集合的大小是否为0 
			3.对象是否为null(重点)
		以后登陆是 数据存放到session中 目的:多个页面 在同一个会话可以共享数据
	 --%>
	
	案例:
	<c:if test="${not empty user}">
		欢迎您,${user.username}登陆成功;
	</c:if>
	<c:if test="${empty user}">
		请登陆;
	</c:if>
	
	<% 
		//模拟用户登陆数据
		pageContext.setAttribute("user", new Person("jack","18","男"));
	%>
	
	${empty user} 为null<br/>
	${not empty user} 不为null <br/>
	if(登陆){
		欢迎您xxx
	}else{
		游客你好 请登陆
	}
	
	varStatus:表示当前对象状态.
		index表示:索引
		count:表示计算,当前遍历的个数.
	案例:
		<h2>数组</h2>
		<%
		String[] arr = {"a","b","c"};
		pageContext.setAttribute("arr",arr);
		%>
		<c:forEach items="${arr}" var="a" varStatus="xxx">
			${xxx.index} @@ ${xxx.count} @@ ${a}<br/>
		</c:forEach>

    insert into 数据库底层其实用的都是字符串
	所以:例如用date时,在JavaBean中改用String

	<h2>普通遍历</h2>
	<%--
		for(int i = 1 ; i<=9 ; i++){
		}
		
		<c:forEach begin="1" end="9" step="1" var="i">
		
		</c:forEach>
		begin: 表示循环开始
		end:表示循环结束
		step:步进
		var : 临时变量 但会将临时变量存到page域中
	 --%>
	<c:forEach begin="1" end="9" step="1" var="i">
		<c:forEach begin="1" end="${i}" step="1" var="j">
			${i}*${j} =${i*j}
		</c:forEach>
		<br/>
	</c:forEach>
	
*/
ClassNotFoundException:表示找不到类,或者对类的操作有问题.
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年08月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档