JSP:
1、JSP介绍:
	1》使用servlet技术时,要通过大量的out.println()语句输出页面,十分麻烦,不便于后期维护管理。
		jsp技术就是将servlet中的大量的输出语句抽取出来,
	2》JSP:Sun制定的一种服务器端动态页面技术的组件规范。------本质上是Servlet
	3》jsp是以“.jsp”为后缀的文件,由html和少量的java代码组成,jsp文件会被服务器(Tomcat)转换成Servlet类后执行
2、JSP的编写规范:
	1》如何编写jsp文件
		a:写一个以“.jsp”为后缀名的文件
		b:该文件中可以包含:HTML代码(html、css、JavaScript)、java代码、注释、指令、隐含对象
	2》
	 	1、HTML代码:html、css、JavaScript:	和在html文件中一样编写、控制浏览器的显示效果
	  		   转换成Servlet类中的service()方法的out.write()输出语句
	 	2、 注释:<!--  --> 注释中包含java代码会被执行
	  		<%-- --%>注释中的所有内容不会执行
	 	3、Java代码:任意位置,控制页面可变内容的产生
	 		java表达式:
	 			<%=  %>
	 			内容:变量、变量加表达式、有返回值的方法
	 			在Servlet类中用out.print()输出该表达式的值
	 		java小脚本:
	 			<% %>
	 			内容:能写在方法中的java代码都可以
	 			在Servlet类中,原封不动复制过去
	 		java声明:
	 			<%! %>
	 			内容:成员变量或成员成员方法的声明
	 			转译成Servlet类的成员变量或方法
	 		
	3》指令:<%@指令名 属性=值 %>  控制页面转成Servlet类时的相关信息
	  	page指令:
	  		用于导包,设置页面属性
	  		<%@page import="java.util.*,java.sql.*" %>-----导包
	  		<%@page pageEncoding="utf-8" %>------设置jsp页面编码
	  		<%@page contentType="text/html; charset=utf-8" %>----设置向浏览器发送数据的格式及编码
	  	include:
	  		在jsp转译成Servlet时可以将其他的文件包含进来,可以使jsp文件也可以是html文件
	  		<%@include file=" " %>
	  		<%@include file="demo.html" %>
	  	taglib:导入标签库
	  	<%@ taglib uri="uri" prefix="使用时的前缀" %>
	4》隐含对象:
		在jsp文件转译成Servlet实现类过程:
		1.创建Servlet实现类
		2.转译jsp文件
			创建变量
			write html
			保留java脚本
			print表达式
		3.编译Servlet的实现类
		在jsp代码执行之前创建了变量,变量就可以在jsp文件中直接使用,把这些变量就叫隐含对象或内置对象
		使用这些对象可以简化对html和响应信息的处理
			隐含对象		隐含类型					作用
		   *request		HttpServletRequest		请求信息	
			response	HttpServletResponse		响应信息
			out			JspWriter				输出的数据流
			config		ServletConfig			Servlet的配置对象
			application	ServletContext			全局的上下文对象
			exception	Throwable				捕捉网页异常,必须在发生异常时才能使用
		   *session		HttpSession				会话
		    page		Object					jsp页面本身
		   *pageContext	PageContext				jsp页面的上下文对象,通过该对象可以获取其他8个对象
		使用示例
			<%String s = request.getParameter("user");%>
			<%=request.getParameter("user")%>
4、jsp运行原理:	首次访问转译,后不再转译
		Tomcat会在接收到请求时查找jsp文件,然后将将jsp文件转译成Servlet的实现类,之后和servlet的运行原理一致
			   在jsp文件转译成Servlet实现类过程:
				1.创建Servlet实现类
				2.转译jsp文件
					创建变量
					write html
					保留java脚本
					print表达式
				3.编译Servlet的实现类
		

1、MVC开发模式:经典的设计模式,代码的分层思想
	M:Model,业务层,用来处理业务逻辑------------------------------------------Dao
	V:View,视图层或显示层,用来显示展示数据-------------------------------------jsp
	C:Controller,控制层,用来管理和调度程序,送业务层和视图层的桥梁------------------Servlet
	其目的是降低代码的耦合度,达到高内聚低耦合,便于团队开发和后期维护
	
	req.setAttribute("stu", s);向请求数据存入数据
	req.getAttribute("stu"); 从请求数据取出数据
2、转发:依赖跳转
		//转发给jsp,当前位置转发到目标上
			/*当前:jsp2/findEmp
			 *目标: jsp2/emp_list.jsp
			 *相对路径:emp_list.jsp
			 */
		req.setAttribute("name",date);//绑定数据
		req.getRequestDispatcher("emp_list.jsp").forward(req, res);//转发
		
		req.getAttribute(name);//获取绑定数据
3、转发与重定向:***
	转发特点:
		1、一次请求
		2、地址不变
		3、公用一个request,所以可以通过request共享数据
		4、不能转发到外部,只能在项目内部转发
	重定向特点:
		1、两次请求
		2、地址改变
		3、两个request,不能通过request共享数据
		4、可以重定向到外部资源
	通常:查询时用到转发,增加、删除、修改用到重定向

4、EL和JSTL:降低jsp文件的复杂度,使jsp便于维护
	1》EL:${  }
		获取,处理数据显示数据
		1、获取bean属性:是方法名去掉get,得到方法名的小写全称
			user---等价于--getUser
			name---等价于--getName
			<p>姓名:${stu.name}</p>---------java中等价于 request.getAttribute("stu").getAttibute("name");
			<p>年龄:${stu["age"]}</p>
			<p>课程id:${ stu.course.id}</p>---request.getAttribute("stu").getCourse().getId();
			EL 默认从以下4个对象(范围)中依次取值
			page、request、session、application
			即:
				->page.getAttribute("stu")
				->request.getAttribute("stu")
				->session.getAttribute("stu")
				->application.getAttribute("stu")
			取值范围也可以指定
				[page/request/session/application]Scope.stu.name
				${requestScope.stu.course.name}
				
			获取项目路径
			${pageContext.request.contextPath}
			java中等价于----pageContext.getRequest().getContextPath()
		2、支持运算:
				  <p>年龄+10:${stu.age+10}</p>
				  <p>年龄是否大于20:${stu.age>20}</p>
				  <p>是否介于20到30之间:${stu.age<30 && stu.age>20}
				  <p>是否为空:${empty stu }</p>
				  <p>是否为空:${stu==null }</p>
				  ${cost.costType==1?"checked":""}
		3、获取请求参数
		  	param.x =======request.getParameter("x")
		  	paramValues.y====request.getParameterValues("y")
		    -->
		  <p>读取请求参数:${param.x}</p>
	2》JSTL:
	jsp标准标签库,javaEE5.0的核心,要导包jstl的jar包
	<%@ taglib uri="uri" prefix="使用时的前缀" %>引入标签
		1》 if标签
			语法:<c:if test="判断条件">值</c:if>判断条件为true执行内容,判断条件可为EL			
			<c:if test="${stu.sex=='M'}">男</c:if>
			<c:if test="${stu.sex=='F'}">女</c:if>
		2》choose标签,选择if(){}else if(){}else{}
			<c:choose>
				<c:when test="${stu.sex=='M'}">男</c:when>
				<c:when test="${stu.sex=='F' }">女</c:when>
				<c:otherwise>性别不祥</c:otherwise>
			</c:choose>
		3》forEach,遍历数组或集合
				等价于:for(Object itr :interests){......}
			varStatus:每次循环JSTL会创建一个对象,用来存循环次数等值,通过varStatus属性声明该对象的变量
			从而来访问该对象,获取循环次数等值
			语法:
			<c:forEach items="数组或集合" var="接收的变量名" varStatus="存储循环信息的对象">
				${itr},${s.index下标},${s.count次数}</br>
			</c:forEach>
			例:
			<c:forEach items="${stu.interests}" var="itr" varStatus="s">
				${itr},${s.index},${s.count}</br>
			</c:forEach>
		JSTL的运行原理:图......			
	4》自定义标签:
		1、编写标签java类(...Tag),继承SimpleTagSupport
		2、重写doTage()方法,添加处理逻辑
			可以通过构造器、setxxx、传参		
		3、在WEB-INF中配置标签说明文件参考c.tld标签文件。.tld

5、异常配置:
  在web.xml文件中配置,两种方法,选择其一配置异常,发生异常时跳转到指定的某一页面,--------声明式处理异常
  应用场景:
  对于程序异常-----编程式处理方法----空指针异常
  对于系统异常-----声明式处理方法----数据库连接不上
  <!--配置异常(选择其一配置,有异常时,跳转到某个页面)  -->
  <!--1、按照异常类型配置  -->
  	<error-page>
  		<exception-type>java.lang.Exception</exception-type><!-- 异常类型 --> 
  		<location>/WEB-INF/error.jsp</location><!-- 此处写jsp路径时应写绝对路径并且会自动补充项目名故不能写项目名称    -->
  	</error-page>
  <!--2、按照异常标号配置  -->
  	<error-page>
  		<error-code>404</error-code><!-- 错误编号  -->
  		<location>/WEB-INF/error.jsp</location>
  	</error-page>
6、路径:
	绝对路径:以固定位置跟路径寻找目标文件,以  / 开头
	相对路径:从当前文件寻找抵达目标文件,不以 / 开头
	
7、coolie和Session
  1、HTTP是无状态协议,一次请求一次连接即断开,服务器不记住浏览器。状态:浏览器访问过的数据(任意)
	实际业务中,有时需要服务器记住浏览器,如:登陆时记住账号,到其他页面显示账号
	记住浏览器要求:
	跨浏览器:每个浏览器记录一份数据,不能用Context
	跨请求:多次请求共用一分数据,不能用request
	cookie和Session可以跨浏览器跨请求记住浏览器
  2、Cookie:将数据存储在浏览器上,容易被篡改,服务器节约内存
  	Session:将数据存储在服务器上,安全不会被篡改,服务器压力大
  3、使用场景:
  	重要数据存Session中,不重要数据存Cookie
  4、状态管理:
  	使用Cookie和Session记录数据,目的是让服务器记住浏览器访问过的状态,称为状态管理	
  5、cookie使用:
  		*只支持ASCII码编码字符,不能直接传汉字,传汉字要进行编码
  		在Servlet中
  		//创建Cookie,每个Cookie内只能存  一个String类型的数据
		Cookie c1 = new Cookie("user", "zhangsan");
		/*
		 * 设置Cookie的过期时间,此cookie将被浏览器存到硬盘上,超出时间自动删除,必须写在发送之前
		 * 不写关闭浏览器,Cookie就自动销毁
		 */
		c1.setMaxAge(60000);//时间以秒为单位
		//将cookie发送给浏览器
		res.addCookie(c1);
		===============================================
		//浏览器再次访问服务器时,会自动将之前的cookie传入给request
		Cookie[] cs = req.getCookies();//获取的是cookie数组,浏览器的一堆数据
		if(cs != null){
			for (Cookie c : cs) {
				System.out.println(c.getName()+","+c.getValue());
			}
		}
		================================================
		jsp中获取
		<!--使用EL可以直接获取Cookie
		语法:cookie.key.value
		  -->
		  <p>用户:${cookie.user.value}</p>
		================================================
		修改cookie:
					//修改cookie
					c.setValue("lisi");
					//发送给浏览器
					res.addCookie(c);
	================================================================
	//Cookie中默认不能传中文,,必须对中文编码后才能保存,包是 .net中URLEncoder、URLDecoder
	Cookie c2 =new Cookie("city", URLEncoder.encode("北京", "utf-8"));
	----------------------------------------------------
	//浏览器再次访问服务器时,会自动将之前的cookie传入给request
		Cookie[] cs = req.getCookies();//获取的是cookie数组,浏览器的一堆数据
		if(cs != null){
			for (Cookie c : cs) {
				System.out.println(c.getName()+","+URLDecoder.decode(c.getValue(), "utf-8"));
			}
		}
	在jsp中依然是ASCII码,
		 <p>城市:${cookie.city.value}</p>乱码
	========================================================
	默认情况同一级目录及其子目录下创建的Cookie对象,是公用的,其他不共用即无效
	可以设置有效路径	
		//创建Cookie
		Cookie c3 = new Cookie("company", "tarena");
		//设置Cookie的生效路径,Cookie将在此路径及下级路径有效
		c3.setPath(req.getContextPath());//设置为项目路径,全项目有效
		//传给浏览器
		res.addCookie(c3);
	Cookie可以被用户禁止		
	关闭浏览器cookie释放
  6、Session的使用:
  	浏览器首次访问服务器时,Tomcat自动创建Session对象,之后同一浏览器再次访问服务器不再创建,30minTomcat自动关闭
  	Session的使用依赖与Cookie,默认有效期:30min
  	Session可以存任意类型的数据
  		============================
  		//获取Session
		HttpSession session = req.getSession();
		//向Session中存入数据,可以使任意类型数据
		session.setAttribute("user", "张三");
		//响应时服务器自动将Session的id(SESSIONID)发送给浏览器,浏览器自动将其存入Cookie
		============================
		//取出session中的相关数据
		Object obj = session.getAttribute("user");
		System.out.println(obj);
		===========================
		立即销毁Session
		session.invalidate();
	Session默认有效期:30min,可以修改
	 1、配置文件web。xml
	 	<session-config>
  			<session-timeout>1</session-timeout>
 		</session-config>
	 2、编程式修改:
	 	
	cookie禁用,session不能用,可以使用url重写发送sessionId
	验证码:参考案例mybetctoss
8、过滤器(Filter):
	1、对请求和响应数据进行某种操作,进行过滤,
	服务器在接收到请求后,Tomcat会在调用Servlet类之前调用过滤器Filter前代码,
		在响应时调用过滤器Filter的后代吗
	2、写过滤器的步骤
		1》写java类,继承Filter接口
		2》实现Filter接口的三个方法,过滤逻辑在doFilter方法中实现
		3》在Web.xml程序中注册过滤器
		4》把过滤器和Web应用一起打包部署
	3》过滤器Filter的优先级
		多个filter之间的调用顺序以mapping顺序为准 	
	4》预置参数:给此filter预置数居,
		<init-param>
	  		<param-name>city</param-name>
	  		<param-value>北京</param-value>
	  	</init-param>
	  在服务器启动时FilterConfig会自动读取数据并由服务器自动将FilterConfig
  	对象传入该过滤器Filter的init()方法
  	==========================
  	<filter>
  	<filter-name>second</filter-name>
  	<filter-class>web.SecondFilter</filter-class>
  	<!--给此filter预置数居,在服务器启动时FilterConfig会自动读取数据并由服务器自动将FilterConfig
  	对象传入该过滤器Filter的init()方法  -->
  	<init-param>
  		<param-name>city</param-name>
  		<param-value>北京</param-value>
  	</init-param>
  </filter>
  <!-- 多个filter之间的调用顺序以mapping顺序为准 -->
  <filter-mapping>
  	<filter-name>second</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  ===========================================
9、监听器:
	1、 监听器的作用用来监听某些事件
		1、对象的创建和销毁事件(生命周期相关事件)
		2、添加、修改、删除数据的事件(绑定数据相关事件)
	  只有request、session、ServletContext有相关的监听器
	2、编写监听器:
		1、写java类,实现相应的监听器接口
		2、在监听器接口中实现相应的方法
		3、配置监听器
	3、<!--配置监听器  
		  	1、服务器启动时会自动实例化此监听器
		  	2、在监听器目标发生对应事件时(创建、销毁)服务器会自动调用该监听器的相关方法
	  -->
	  <listener>
	  	<listener-class>web.MyListener</listener-class>
	  </listener>




 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐