JSP server page technology

Creative Commons License Copyright: Attribution, allow others to create paper-based, and must distribute paper (based on the original license agreement with the same license Creative Commons )
						


1.浏览器和服务器的数据交互方式
	1.超链接:?参数  中文乱码问题(new String(byte[],"utf-8"))

	2.表单 :POST方式 中文乱码问题(request.setCharacterEncoding("utf-8"))

	3、JS方式:location.href="";替换地址,放在JQuery的事件里
		   给form表单一个id,JS、jq获取对象.submit() 提交整个表单。可以提交一行数据

	5.ajax 
		$.get(url,[params],[fn],[type]):发送了一个get请求
		$.post(url,[params],[fn],[type]):发送一个post请求



                                         支持el 和Java 但不支持jstl,要导包

1.jsp概述:
	java server pages: java的服务器页面
	本质上就是一个servlet
	认为是 
		在html页面中嵌套java代码
	高大上:
		将页面的展示和内容的生成相分离
	组成部分:
		html + java代码 + jsp特殊内容
	后缀名:
		jsp
	观看jsp产生的源码:
		tomcat/work下的转后的Java源码和class文件
		_jspService方法就是jsp页面的服务方法.
	jsp运行在服务器上
	jsp的执行流程:
		浏览器发送请求(第一次请求该网页 index.jsp)
		服务器收到请求(web.xml),在服务器中JspServlet开始执行,
		jspservlet将jsp页面转成java文件(index_jsp.java)若数字开头则前面再加"_"
		虚拟机将java文件编译成class文件(index_jsp.class)
		服务器创建servlet对象,调用service方法(_jspService),生成动态的内容
		将动态的内容返回给服务器,
		服务器拿到内容之后,组成响应的信息(响应行,响应头,响应体),返回给浏览器
		浏览器收到响应之后,解析响应,展示页面
2.JSP的作用:
	1.Servlet要展示页面很麻烦,JSP能更好的代替Servlet去展示信息
	2.白话:用来接收并且展示Servlet产生的数据(list,对象,字符串,map集合)
	3.JSP本质上是一个Servlet,即是Java类。有.java 和.class 存在工作空间work中
	  在访问页面的时候就给生成。

3.路径问题
	浏览器访问服务器要带工程名  表单 超链接 直接地址栏输入
	服务器访问服务器 不需要带工程名

4.jsp的执行原理(面试重点):
	1.服务器收到请求,找到指定servlet执行(JspServlet)
	2.servlet找到对应的jsp文件.将jsp文件变成java文件.并调用编译器编译成class文件, 最终放在了work目录下
	3.编译后的class文件会被服务器当做Servlet执行,生成动态的内容,将动态的内容返回给服务器
	4.服务器拿到生成的内容,组装成响应信息,返回给浏览器
	5.浏览器收到响应,展示内容       
                              
5.jsp特有的:

	1 jsp的脚本(如何嵌套java代码)
		<% java代码片段 %>
			java代码片段
			最终放在jsp的service方法中
		<%= 输出表达式%>
			在页面上输出内容的,不能以分号结尾
			最终放在jsp的service方法中
			相当于执行了 out.print(i+4 );即可以直接使用out.print()
		<%! java声明代码 %> 我们不用的
			在jsp页面上声明成员的,转换后在Java成员声明位置

		例子:
			<%=j %>  可以声明到前面,因为转换之后在service中

			<%int i = 3; 局部变量
			  System.out.println(i);
			%>
			<%=i+4 %>
	
			<%out.print("我是java代码");%>
	
			<%!int j = 4;
				void add(){
					System.out.print("我是java代码");
			}%>
	
			<%out.print(j);%>

	2 jsp的注释
		html注释
			只是不再页面上展示,java源码和html源码都存在
		java注释
			在java中有,在html源码中不存在
		jsp注释
			<%--  --%>
			只在jsp源码中.
		注意:
			我们在页面上使用 crtl +shift +/ 注释

	3 jsp的指令  (重点)
		
		作用:
			声明jsp页面上的一些属性和行为.
		格式:
			<%@ 指令名称 属性=值 属性=值 %>
		三个指令:
			page:声明jsp页面上的一些属性和行为
			include(★):包含
			taglib(★★):导入标签库
		注意:
			jsp页面中可以使用多个指令,
			指令可以出现多次  位置任意,一般都在页面的上面

	    *page指令:(不用我们写)
		重要的属性:
			contentType:声明页面的类型,声明响应的编码,且通知浏览器用什么编码打开。设置文件mime类型
			pageEncoding:声明页面的编码
			import:在jsp页面上导入所需的jar包
			contentType和pageEncoding联系:
				若两个都使用了,各自使用各自的编码
				若只出现一个,两个编码都是出现的这个编码
				若都没有出现,使用默认的编码(一般是iso-8859-1)
		了解的属性:
			language:声明jsp中的脚本的语种. 目前只有一个值 java
			buffer:声明当前jsp页面的缓存区的大小. 默认是8kb
			autoFlush:是否自动刷新jsp的缓存区. 默认是自动刷新
			extends:声明当前jsp转成的java类继承哪个servlet.
			session:声明页面上是否可以直接使用session对象(内置对象) 默认是true
			isELIgnored:声明页面上是否忽略el表达式 默认不忽略(在页面上可以使用el表达式)
			errorPage:当当前页面发生错误的时候,转发到的页面
			isErrorPage:是否是个错误页面 默认不是.若声明为true,可以直接使用内置对象(exception)
	
		例子:
			<%@page import="java.util.ArrayList"%>
			<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" isELIgnored="false" errorPage="/600.jsp"%>
	
     
  	    *include指令:     静态包含(必掌握)
	 	格式: 
			 <%@include file="..." %>   在哪块使用放到哪块,内部访问无需全路径
		注意:
			静态包含:将被包含的页面内容复制到包含的页面中,一并的编译运行,只生成一个java文件
		
 	    *taglib指令:   
	  	 格式:   <%@taglib prefix="前缀名" uri="名称空间" %> 
		
		jstl :<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


6 jsp的内置对象
	为了方便在jsp内部写java代码,把一些常见的对象声明好了,我们在jsp中可以直接使用
	9个内置对象(面试中用)
		名称			类型
		request			HttpServletRequest
		response		HttpServletResponse
		out				JspWriter	JSP字符输出流,写响应体 同 Response.getWrite()
		session			HttpSession		若指令内设置Session=“FALSE”时 只能用getSession
		exception		Throwable		异常信息的封装对象,一般不会有,isErrorPage="true"
		
		page			Servlet(this)		(代表着本页的实例对象)
		config			ServletConfig
		application		ServletContext
		
		pageContext  	PageContext			JSP最小的作用域,一般不使用这个作用域存储数据。
		
	注意:
		exception 只有页面声明是一个错误页面的时候才可以使用
		session  默认可以使用,当页面通过page指令声明 session=false的时候就不能用session

7 jsp的域对象
	域对象			作用范围
	pageContext		当前页面	一个项目只有一个此对象ServletContext对象
	request			一次请求	每个人都有自己的浏览器
	session			一次会话	访问一次Servlet就创一对象建一个request对象-- 转发 --响应回来request对象就销毁
	application		整个项目	它里面的数据只能再当前页面获取

8 pageContext对象:	
		①可以获取其他八大内置对象
			比如:制作一个工具类,参数是pageContext,可以根据pageContext获取8大内置对象pageContext.request.contextPath()	
		②可以从别的作用域中查找数据
		     pageContext.findAttribute(String name);   //获取对应的值
		  		
		   	先从最小的pageContext作用域中寻找,如果能找到,直接使用
			找不到,继续找request,如果能找到,直接使用
			找不到,继续找session,如果能找到,直接使用
			找不到,继续找application,如果能找到,直接使用
			最后都没找到,返回null字符串

		③pageContext可以操作其他作用域(了解)
			setAttribute()
			getAttribute()
			removeAttribute();
		   实例:
			在PageContext提供了常量
			例如:
				PageContext.SESSION_SCOPE  session域

		  	上下两句效果完全等价
			session.setAttribute("msg2", "33333333333");
			pageContext.setAttribute("msg2", "33333333333",pageContext.SESSION_SCOPE);

			Session = request.getSession()等同于直接使用域对象session

	7.jsp的动作标签(了解)
		<jsp:forward> 在jsp页面使用请求转发  
			<jsp:forward page="...">
				相当于<%request.getRequestDispatcher(..).forward(..)%>
	
		<jsp:include> 动态包含
			<jsp:forward page="...">
			将被包含页面运行后的结果包含了进来.(将所有jsp页面都编译了)

						
								EL

1 不要用数字作为属性名称,比如当做键。
 
1.作用:替代JSP脚本的(<%= %>)输出 不要用Integer类型Servlet会解析成long 不好用

2.格式:${el表达式}
3.功能:
	1.获取域中的数据(重要) request/session/application/pageContext.setAttribute();

		*简单数据的获取:  Servlet产生的简单字符串
			${pageScope|requestScope|sessionScope|applicationScope.属性名(即是键)}	

		*复杂数据的获取:数组、集合list、Map
			获取数组
				${pageScope|requestScope|sessionScope|applicationScope.属性名[index]}
			获取list
				${pageScope|requestScope|sessionScope|applicationScope.list属性名[index]}

				注意: el方式获取数组数据和list集合数据是一样的, el中任何的get方式中get可以略

			获取map中某个数据
				${pageScope|requestScope|sessionScope|applicationScope.map属性名.键名}	

			${requestScope.msg[1]}        ((String[])request.getAttribute("msg"))[1]
			${requestScope.list[1]}       ((List)request.getAttribute("list")).get(1)			
			${requestScope.map.B}       ((Map)request.getAttribute("map")).get(B)

		*对象属性值的获取(对象就是用来封装数据的)

		      ${属性名.属性}
			${requestScope.user.name}       ((User)request.getAttribute("User")).getName( )
			${user.name}

		 便捷方式 :${属性名}

			${msg.[2]}
			${list[1]}
			${map.B}

		  	便捷属性不指定具体获取谁的哪个作用域属性会从小到大依次去找:
			    依次从小到大 pageContext,request,session,application 获取指定名称的属性
			    若找到了则返回,且结束该次查找
			    若找不到 返回"" (jsp的findAttribute()返回的是null值,el 中但返回的是null字符串)
		  
		        注意: 属性名中出现".""+""-"等特殊符号时,使用${xxxScopoe["特殊属性名"]}查,不可以用简便方式获取。
			

	2.执行运算
		1. + = * /  不论是数值、字符串型的数值、字符型都可运算,但是字符串不行。
			${requestScope.a+requestScope.b}---->${a+b}

		2.empty(掌握)判断容器长度(0返回TRUE) 
			       对象是否为空(null返回TRUE)
			${empty 容器} ${not empty 容器} ${!empty 容器}
			${empty 对象} ${not empty 对象} ${!empty 对象}

		3.三元运算
			${2>1?A:B} 获取A的值
			${2>1?"A":"B"} 字符串A
	
	3.获取web常见的对象(重点  **********************************************)
		四个域对象
			(掌握)pageScope----从pageContext域中获取数据
			(掌握)requestScope----从request域中获取数据
			(掌握)sessionScope----从session域中获取数据
			(掌握)applicationScope----从ServletContext域中获取数据

			(掌握)cookie  String=对象
			(掌握)pageContext  ---可以获取当前的项目名	${pageContext.request.contextPath} 
	
		和请求参数相关的el内置对象    
			(掌握)param   String=String     获取表单中提交的数据,做回显:value="${param.cust_name}"
	
			(了解)paramValues String=数组
	
		和请求头相关的el内置对象 String=String  
			(了解)header  String=String
			(了解)headerValues String=数组
	
		全局初始化参数的el内置对象   
			(了解)initParam
		
	 掌握的:
		★cookie
			我们之前操作cookie
				Cookie c = new Cookie("lastTime","123123123123");
				Cookie c_ = new Cookie("username","tom");
			${cookie}获取的时候
				相当于将cookie的名称 和cookie对象放入一个map中
				{lastTime=cookie对象的地址值,username=c_对象的地址值}
				
			${cookie.lastTime}:获取的指定的cookie对象
				对象中有方法:
					getName()
					getValue()
			
			★获取指定cookie的值
				${cookie.cookie的名称.value}
				例如:
					获取JSESSIONID的值
						${cookie.JSESSIONID.value}
					获取上次访问时间
						${cookie.lastTime.value}
	      pageContext  用在JSP中可以获取当前的项目名   Servlet重定向中request.getContextPath()获取项目名
		
		<%pageContext.getRequest().getContextpath()%>

		${pageContext.request.contextPath} 


						jstl

1.jsp标准的标签库语言
 
2.jstl的使用步骤:
		1.导入jar包  jstl.jar和standard.jar  但是用myeclipse不用导
		2.在页面上导入标签库
			<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.jstl的分类:
	core:核心(掌握 if forEach)
	fmt:国际化或者格式化(不学了)
	sql:和sql相关的(过时了)
	xml:和xml相关的(过时了)
	函数库(不学了)

4.core:核心(掌握 if forEach)	

	c:if使用
		格式:
			<c:if test="el表达式" [var="变量名"]>    变量是表达式的返回值
				条件成立的时候输出的内容
			</c:if>
	c:forEach使用
		格式1:
			<c:forEach begin="开始" end="结束" step="循环的间隔数" var="给变量起个名称" varStatus="记录循环状态变量">
				${变量名 }
			</c:forEach>
			注意:
			    varStatus常用属性:
						count:记录当前是第几个
						first:判断当前元素是否为第一个
						last:判断当前元素是否为最后一个
			例如:
				<c:forEach begin="1" end="10" step="1" var="i">
					${i }
				</c:forEach>

		格式2:高级
			<c:forEach items="${el表达式}" var="变量名"> 
				${变量名}
			</c:forEach>

		例:<%
			List list = new ArrayList();
			list.add("123");
			list.add("456");
			request.setAttribute("list",list);
		
			User user1 = new User();
			User user2 = new User();
			user1.setName("zhang");
			user1.setValue("16");
			user2.setName("li");
			user2.setValue("18");
			List list2 = new ArrayList();
			list2.add(user1);
			list2.add(user2);
			request.setAttribute("list2", list2);

			Map<String,User> map = new HashMap<String,User>();
			map.put("A", user1);
			map.put("B", user2);
			request.setAttribute("map", map);
		%>
		<h4>简单的list1</h4>
			<c:forEach items="${list}" var="i">
				${i}
			</c:forEach>

		<h4>list存对象</h4>
			<c:forEach items="${list2}" var="user">
				${user.name}-----${user.value }<br>
			</c:forEach>

		<h4>map存对象</h4>  底层将其转换为映射形式,获取key 和获取value  
			<c:forEach items="${map}" var="user">
				${user.value.name}-----${user.value.value }<br> 此处的value是user对象
			</c:forEach>


	c:choose 、c:when 与c:otherwise

	




                                        		 扩展

2.javabean
	
	平常编写的实体类 例如:user product类

	规范:
		1.公共的具体的类  public class
		
		2.字段私有 private int id;
		
		3.提供公共的访问字段的方法  get|set方法
			若有get|set方法了,get|set后面的内容称之为bean属性
			 例如:	public getUsername(){}
				public getName(){}
				注意:username 和 name称之为bean属性
		
		4.必须提供一个无参的构造方法
		
		5.一般该类要实现序列化接口 serializable

3.设计模式:
	 servlet-缺点:编写页面响应信息麻烦
		|
	 jsp-缺点:维护起来麻烦
		|
	 jsp+javabean: jsp设计模式1 model1(过时了)
					jsp:接受请求,处理请求(找到合适javabean去处理请求)
		|
	jsp+javabean+servlet: jsp设计模式2 model2
					jsp:		收集servlet传递数据 展示数据
					servlet:	接受页面请求 找到合适javabean去封装并处理
					javabean:	封装数据,封装对数据的操作
					MVC设计模式一个具体表现

4.MVC设计模式(面试题):	
	将业务逻辑 数据 和显示相分离的一种思想.
	M:model 模型 封装数据 封装对数据的操作 javabean
	V:view 	视图 展示数据(主要使用jsp)     jsp
	C:ctrl(controller) 控制	接受请求并响应 servlet

 

Guess you like

Origin blog.csdn.net/weixin_41716049/article/details/93487820